mysql5.7.33主从复制
1. 在两台数据库中分别创建数据库
mysql>create database khtdb;
建立binlog目录,mkdir binlog
2. 在主服务器master进行如下配置:
vim my.cnf
#mysql的服务器分配id,在启用主从和集群的时候必须指定,每个节点必须不同
server-id = 11
#开启Binlog日志
log_bin=mysql-bin
#日志自动过期清理天数
expire_logs_days = 90
#binlog保存路径
log-bin=/kht/mysql5.7/binlog/logbin
#STATEMENT模式(SBR)
#在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)。
#ROW模式(RBR)
#row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
#MIXED模式(MBR)
#以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog_format=ROW
#同步的数据库名称,指定mysql的binlog日志记录哪个db
binlog-do-db=khtdb
2.2 重启主服务器master并查看状态
systemctl restart mysql
#查看master的状态
mysql> show master status;
+---------------+----------+--------------+------------------+------------------ -+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+------------------ -+
| logbin.000001 | 154 | khtdb | | |
+---------------+----------+--------------+------------------+------------------
3. 从服务器slave的配置
vim my.cnf
#mysql的服务器分配id,在启用主从和集群的时候必须指定,每个节点必须不同
server-id=12
#开启Binlog日志
log_bin=mysql-bin
#日志自动过期清理天数
expire_logs_days = 90
log-bin=/kht/mysql5.7/binlog/logbin
binlog_format=ROW
#启用中继日志
relay-log=/kht/mysql5.7/log/mysql-relay
3.1 主主复制(先创建用户)
#参数是在slave上配置,指定slave要复制哪个库
replicate-do-db=khtdb
log-slave-updates
#提高效率,将不必要的资源不写入二进制文件
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#防止主键冲突,数据的id号从1开始,每次+2,即1,3,5....
auto-increment-increment=2
auto-increment-offset=1
3.2 配置从服务器slave登录主服务器的账号授权(master上执行)
--授权操作
create user 'slave'@'host' identified by 'kht123';
grant replication slave on *.* to 'slave'@'%' identified by 'kht123';
--刷新权限
flush privileges;
4. 重启从服务器slave并连接主服务器master
systemctl restart mysql
mysql> change master to master_host='192.168.2.129',master_user='slave',master_password='kht123',master_port=3306,master_log_file='logbin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
#启动slave
mysql>start slave;
#查看slave的状态
mysql>show slave statusG(注意没有分号)
#注意Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5. 若虚拟机是克隆的,则同一个克隆的mysql会产生UUID冲突,可以从日志中查看,
此时会造成Slave_IO_Running: NO
查找auto.cnf修改uuid即可:find -name auto.cnf
#重启mysql
service mysql restart
#停止链路
mysql>stop slave;
#重置链路
mysql>reset slave;
#启动链路
mysql>start slave;
#查看链路
mysql>show slave status G