基于语句的复制为什么在特殊情况也会产生基于行的复制?
来源: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回答
-
set binlog_format 只能改变当前连接的日志格式,不知道你在做实验时是不是在两个连接里都提前设置了日志格式?
022017-09-23
相似问题