基于语句的复制为什么在特殊情况也会产生基于行的复制?

来源:5-2 mysql二进制日志

通垭口村的

2017-09-23

本来是在mysql排错指南中看到一个基于mysql语句复制的例子,大意是模拟对T表的并发插入,A事物对T表插入一条记录 ,

但是不提交,代码如下:

begin;

insert into t values('zhangsan');

接着B事物对T表插入一条记录,并且提交:

begin

insert into t  values('lisi');

commit;

然后在提交A事物。

造成的效果是主库执行 select *from t 语句的效果是:

name 列名

zhangsan

lisi

而从库执行该语句效果是:

name 列名

lisi

zhangsan

然后在主库执行更新语句把第一条记录的name更新成‘bbbbbb‘;

update t set name='bbbbbb' limit 1;

按照书上的例子  因为是基于语句的复制:所以主库更新后的效果是:

name 列名

bbbbbb

lisi

从库的效果是:

name 列名

bbbbbb

zhangsan

但是实际的效果主库跟预想的一样,但是从库的效果为:

name 列名

lisi

bbbbbb

于是我进一步对日志进行了查看

通过mysqldump 查看binlog日志 只能看到一条语句:

就是插入 insert into t  values('lisi'); 的这条语句,而看不到

insert into t  values('lisi');

update t set name='bbbbbb' limit 1;

这两条语句:我使用老师教的 -vv 进行从新查看

发现这两条语句在binlog中变成了基于行的复制格式。

于是有点不理解怎么基于语句的复制怎么有了基于混合格式复制的功能?我的数据库版本是5.7.19

设置语句为 set binlog_format=statement;

查看语句为:show variables like 'binlog_format';

是我的操作有问题还是基于语句的语句进行了加强,我又试了关于时间函数的插入发现使用函数就是基于行的复制 ,

插入具体的值就是 基于语句的?


写回答

1回答

sqlercn

2017-09-23

set binlog_format 只能改变当前连接的日志格式,不知道你在做实验时是不是在两个连接里都提前设置了日志格式?

0
2
通垭口村的
谢谢老师,我在my.cnf里设置了二进制的格式为语句,重启后再做实验得到了想要的效果。感谢
2017-09-23
共2条回复

MySQL提升课程 全面讲解MySQL架构设计

面面俱到讲解影响MySQL性能的各个因素,让MySQL架构了然于胸。

4419 学习 · 547 问题

查看课程