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了!