linux练习-06
1. 通过编译、二进制安装MySQL5.7
源码编译安装 MySQL
- 建议:内存4G以上,CPU 核数越多越好
- 说明:本操作过程适用于以下版本
mysql-5.6.51.tar.gz mariadb-10.2.18.tar.gz
- 安装相关依赖包
yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dumper
- 准备用户和数据目录
useradd -r -s /sbin/nologin -d /data/mysql mysql
- 准备数据库目录
mkdir /data/mysql chown mysql.mysql /data/mysql
- 编译安装说明
利用cmake编译,而利用传统方法,cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,
即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的
影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译
#编译选项 https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
- 下载并解压缩源码包
tar xvf mysql-5.6.51.tar.gz -C /usr/local/src #mariadb-10.2.18.tar.gz
- 源码编译安装 MySQL
cd mysql-5.6.51/ cmake . \ -DCMAKE_INSTALL_PREFIX=/apps/mysql \ -DMYSQL_DATADIR=/data/mysql/ \ -DSYSCONFDIR=/etc/ \ -DMYSQL_USER=mysql \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITHOUT_MROONGA_STORAGE_ENGINE=1 \ -DWITH_DEBUG=0 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci make && make install #4核编译,加快速度 #make -j 4
- 提示:如果出错,执行rm -f CMakeCache.txt
- 准备环境变量
echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh
- 生成数据库文件
cd /apps/mysql/ ./scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
- 准备配置文件
cp -b /apps/mysql/support-files/my-default.cnf /etc/my.cnf #针对旧版本或mariadb-10.2.18.tar.gz cp /apps/mysql/support-files/my-huge.cnf /etc/my.cnf
- 准备启动脚本,并启动服务
cp /apps/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start
- 安全初始化
mysql_secure_installation
二进制安装安装MySQL 5.7 和 MySQL8.0
- 安装相关包
yum -y install libaio numactl-libs
- 用户和组
groupadd mysql useradd -r -g mysql -s /bin/false mysql
- 准备程序文件
wget http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linuxglibc2.12-x86_64.tar.gz tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local cd /usr/local/ ln -s mysql-5.7.31-linux-glibc2.12-x86_64/ mysql chown -R root.root /usr/local/mysql/
- 准备环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh
- 准备配置文件
cp /etc/my.cnf{,.bak} cat >/etc/my.cnf<<EOF [mysqld] datadir=/data/mysql skip_name_resolve=1 socket=/data/mysql/mysql.sock log-error=/data/mysql/mysql.log pid-file=/data/mysql/mysql.pid [client] socket=/data/mysql/mysql.sock EOF
- 初始化数据库文件并提取root密码
#方式1: 生成随机密码 mysqld --initialize --user=mysql --datadir=/data/mysql grep password /data/mysql/mysql.log awk '/temporary password/{print $NF}' /data/mysql/mysql.log #方式2: 生成 root 空密码 mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
- 准备服务脚本和启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start
- 修改口令
#修改前面生成的随机密码为指定密码 mysqladmin -uroot -p'LufavlMka6,!' password nameke #修改前面生成的空密码为指定密码 mysqladmin -uroot password nameke
- 测试登录
mysql -uroot -pnameke
2. 二进制安装mariadb10.4
- 下载
yum -y install libaio numactl-libs
cd /home/nameke/tools/ && wget http://mirrors.dotsrc.org/mariadb//mariadb-10.4.13/bintar-linux-x86_64/mariadb-10.4.13-linux-x86_64.tar.gz tar -zxf mariadb-10.4.13-linux-x86_64.tar.gz mv mariadb-10.4.13-linux-x86_64 /usr/local/mariadb
- 新建组及用户
groupadd mysql
useradd -s /sbin/nologin -r -g mysql mysql
- 配置服务
cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld
- 新建数据目录与权限
mkdir -p /data/mariadb/ chown -R mysql. /data/mariadb chown -R mysql:mysql /usr/local/mariadb/
- 配置my.cnf
[mysqld] basedir=/usr/local/mariadb/ datadir=/data/mariadb/ port=3306 pid-file=/data/mariadb/mysql.pid socket=/tmp/mysql.sock [mysqld_safe] log-error=/data/mariadb/mysql.log [client] port=3306 socket=/tmp/mysql.sock default-character-set=utf8
-
数据库初始化
/usr/local/mariadb/scripts/mysql_install_db --defaults-file=/usr/local/mariadb/my.cnf --user=mysql --datadir=/data/mariadb/ --basedir=/usr/local/mariadb/
- base目录权限切回root
cd ~
chown -R root:root /usr/local/mariadb/
- 配置环境变量
echo "PATH=/usr/local/mariadb/bin:$PATH" >/etc/profile.d/mariadb.sh chmod +x /etc/profile.d/mariadb.sh source /etc/profile.d/mariadb.sh
- 启动与登录
/etc/init.d/mysqld start ps -ef|grep mysql netstat -antup|grep 3306
- 换安全模式启动,登录改root密码
mysqld_safe --defaults-file=/usr/local/mariadb/my.cnf & use mysql alter user 'root'@'localhost' identified by '123456'; FLUSH PRIVILEGES;
- 配置安全模式,然后重启
mysql_secure_installation --basedir=/usr/local/mariadb/
3. 导入hellodb.sql生成数据库
mysql -u root -p -P 3306 -S /data/mysql3306/var/mysql.sock <workdir/hellodb_innodb.sql

(1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄
select Name,Age from students where Age>25 and Gender='M';

(2) 以ClassID为分组依据,显示每组的平均年龄
select ClassID,avg(age) as avg_age from students group by ClassID;

(3) 显示第2题中平均年龄大于30的分组及平均年龄
- group by 分组统计后,改where为having
#报错sql语句 select ClassID,avg(age) as avg_age from students group by ClassID where avg_age>30; #正确sql语句 select ClassID,avg(age) as avg_age from students group by ClassID having avg_age>30;

(4) 显示以L开头的名字的同学的信息
select * from students where Name like 'L%';
4.数据库授权magedu用户,允许192.168.1.0/24网段可以连接mysql
create database magedu default character set utf8mb4 collate utf8mb4_general_ci; grant all privileges on magedu.* to 'magedu'@'192.168.1.0/24' identified by 'magedu' with grant option; flush privileges;
5.主从复制及主主复制的实现
主节点配置:
- 启用二进制日志
[mysqld]
log_bin
- 为当前节点设置一个全局惟一的ID号
[mysqld]
server-id=#
log-basename=master #可选项,设置datadir中日志名称,确保不依赖主机名
说明:
server-id的取值范围
1 to 4294967295 (>= MariaDB 10.2.2),默认值为1
0 to 4294967295 (<= MariaDB 10.2.1),默认值为0,如果从节点为0,所有master都将拒绝此
slave的连接
- 查看从二进制日志的文件和位置开始进行复制
SHOW MASTER STATUS;
- 创建有复制权限的用户账号
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
#MySQL8.0 分成两步实现
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
从节点配置
- 启动中继日志
[mysqld]
server_id=# #为当前节点设置一个全局惟的ID号,需与主节点不同
log-bin
read_only=ON #设置数据库只读,针对supper user无效
relay_log=relay-log #relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index #默认值hostname-relay-bin.index
- 使用有复制权限的用户账号连接至主服务器,并启动复制线程
CHANGE MASTER TO MASTER_HOST='masterhost',
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mariadb-bin.xxxxxx',
MASTER_LOG_POS=#;
START SLAVE [IO_THREAD|SQL_THREAD];
SHOW SLAVE STATUS;
6.xtrabackup实现全量+增量+binlog恢复库
1、备份过程 1)完全备份:56.11 [root@centos8 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm [root@centos8 ~]#mkdir /backup/ [root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/base 2)第一次修改数据 3)第一次增量备份 [root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base 4)第二次修改数据 5)第二次增量备份 [root@centos8 ~]#xtrabackup -uroot -pmagedu --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 6)同步到远程数据库机器上
[root@centos8 ~]#scp -r /backup/* 目标主机:/backup/ #备份过程生成三个备份目录 /backup/{base,inc1,inc2} 2、还原过程:56.37 1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务 [root@c8-client01 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm [root@c8-client01 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base 2)合并第1次增量备份到完全备份 [root@c8-client01 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1 3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only [root@c8-client01 ~]#xtrabackup --prepare --target-dir=/backup/base --incrementaldir=/backup/inc2 4)复制到数据库目录
#注意数据库目录必须为空,MySQL服务不能启动 [root@c8-client01 ~]#xtrabackup --copy-back --target-dir=/backup/base 5)还原权限属性: [root@c8-client01 ~]#chown -R mysql:mysql /var/lib/mysql 6)启动服务: [root@c8-client01 ~]#systemctl start mysql3306.service
7.MyCAT实现MySQL读写分离
案例:利用 Mycat 实现 MySQL 的读写分离
环境要求
#所有主机的系统版本:
cat /etc/centos-release
CentOS Linux release 8.0.1905 (Core)
#服务器共三台
mycat-server 192.168.56.12 #内存建议2G以上
mysql-master 192.168.56.11 MySQL 8.0 或者Mariadb 10.3.17
mysql-slave 192.168.56.13 MySQL 8.0 或者Mariadb 10.3.17
关闭SELinux和防火墙
systemctl stop firewalld
setenforce 0
时间同步
1、创建 MySQL 主从数据库
yum -y install mysql-server
#或者
yum -y install mariadb-server
- 1) 修改master和slave上的配置文件
#master1上的my.cnf
[root@master1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id = 11
log-bin
#slave1上的my.cnf
[mysqld]
server-id = 13
systemctl start mariadb
- 2) Master1上创建复制用户
mysql -uroot -p
#登录数据库后执行如下操作
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.56.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;
show master status;
- 3) Slave1上执行
mysql -uroot -p
#登录数据库后执行如下操作
CHANGE MASTER TO
MASTER_HOST='192.168.56.%',
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=403;
start slave;
show slave status\G;
2、在MySQL代理服务器192.168.56.12安装mycat并启动
#确认安装并成功
yum -y install java
java -version #下载并安装 wget -c http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz #wget -c http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz mkdir /apps && tar xvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/ #mkdir /apps && tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/ #配置环境变量 echo 'PATH=/apps/mycat/bin:$PATH' >/etc/profile.d/mycat.shsource /etc/profile.d/mycat.sh #查看端口 ss -ntl #启动mycat file /apps/mycat/bin/mycat mycat start
#注意: 此步启动较慢,需要等一会儿,另外如果内存太小,会导致无法启动 #可以看到打开多个端口,其中8066端口用于连接MyCAT ss -ntlp #查看日志,确定成功,可能需要等一会儿才能看到成功的提示 tail -f /apps/mycat/logs/wrapper.log #用默认密码123456来连接mycat mysql -uroot -pzhongguo -h 192.168.56.12 -P8066
4、在mycat 服务器上修改server.xml文件配置Mycat的连接信息
[root@mysql-proxy ~]#vim /apps/mycat/conf/server.xml
...省略...
#修改下面行的8066改为3306复制到到独立非注释行
<property name="serverPort">3306</property>
<property name="handlelDistributedTransactions">0</property> #将上面行放在此行前面
#或者删除注释,并修改下面行的8066改为3306
<property name="serverPort">3306</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<property name="authTimeout">15000</property>
<property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property> #5 * 60 * 1000L; //连接空闲检查 删除#后面此部分
<property name="frontWriteQueueSize">4096</property> <property
name="processors">32</property> #--> 删除#后面此部分
.....
<user name="root"> #连接Mycat的用户名
<property name="password">zhongguo</property> #连接Mycat的密码
<property name="schemas">TESTDB</property> #数据库名要和schema.xml相
对应
</user>
</mycat:server>
- 这里使用的是root,密码为magedu,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上面这段配置,其他默认即可
5、修改schema.xml实现读写分离策略
[root@mysql-proxy ~]#vim /apps/mycat/conf/schema.xml
#最终文件内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="hellodb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="192.168.56.11:3306" user="root" password="zhongguo"><readHost host="host2" url="192.168.56.13:3306" user="root" password="zhongguo" />
</writeHost>
</dataHost>
</mycat:schema>
#重新启动mycat
[root@mysql-proxy ~]#mycat restart
#以上***部分表示原配置文件中需要修改的内容,注意大小写
- 上面配置中,balance改为1,表示读写分离
- 注意:要保证能使用root/123456权限成功登录10.0.0.18和10.0.0.28机器上面的mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!
6、在后端主服务器创建用户并对mycat授权
[root@master1 ~]#mysql -uroot -p
create database mycat;
GRANT ALL ON *.* TO 'root'@'192.168.56.%' IDENTIFIED BY 'zhongguo' ;
flush privileg
7、在Mycat服务器上连接并测试
[root@mysql-proxy ~]#mysql -uroot -pzhongguo -h127.0.0.1 TESTDB
#登录数据库后执行
show databases;
use TESTDB;
create table t1(id int);
select @@server_id;
select @@hostname;
8、通过通用日志确认实现读写分离
- 在mysql中查看通用日志
show variables like 'general_log'; #查看日志是否开启
set global general_log=on; #开启日志功能
show variables like 'general_log_file'; #查看日志文件保存位置
set global general_log_file='tmp/general.log'; #设置日志文件保存位置
- 在主和从服务器分别启用通用日志,查看读写分离
[root@master1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@master1 ~]#systemctl restart mariadb
[root@master1 ~]#tail -f /var/lib/mysql/centos8.log
9、停止从节点,MyCAT自动调度读请求至主节点
[root@slave1 ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pzhongguo-h192.168.56.12 -P8066
select @@server_id;
#停止主节点,MyCAT不会自动调度写请求至从节点
insert teachers values(5,'wang',30,'M');
10、MyCAT对后端服务器的健康性检查方法select user()
#开启通用日志
[root@master1 ~]#mysql
set global general_log=1;
[root@slave1 ~]#mysql
set global general_log=1;
#查看通用日志
tail -f /var/lib/mysql/master.log
tail -f /var/lib/mysql/slave.log