MySQL主从复制的三种模式
主从复制有三种模式,分别是基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED
mysql默认的主从复制模式是ROW
模式划分
STATEMENT模式(SBR)
- 每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条 sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。
- 缺点是在某些情况下会导致 master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
ROW模式(RBR)
- 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
- 缺点是会产生大量的日志,尤其是altertable的时候会让日志暴涨。
MIXED模式(MBR)
- 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
建议使用MIXED模式~
如何更改主从复制的模式
先查看
show global variables like 'binlog%';
进入到master服务器的my.cnf文件中,增加一行,设置主从复制模式
重启master服务器的数据库
docker restart percona-master01 && docker logs -f percona-master01
再次查看,发现模式已经改成了MIXED
补充~
如果此时你发现主从同步失效了,我们可以再从新配置下
1.在从数据库输入命令,停止同步
stop slave;
2.在从库中重写配置与主库的关系(注意主库最新的file和pos要改过来)
CHANGE MASTER TO
master_host='192.168.62.132',
master_user='itcast',
master_password='itcast',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=743;
3.从库开启同步功能
start slave;
OK了!