mysql 设置 row格式binlog_为什么要把MySQL的binlog格式修改为row
我们知道binlog有两种常用的格式,一种是statement(默认),一种是row,很多人都说建议你修改为row格式,那么是为什么呢?
首先我们需要知道它们两个之间有什么不同?
statement格式记录的我们写的SQL语句,而row格式记录的则是实际受影响的数据的变化前后值
这里举两个例子说明一下:
删除
statement记录的是这个删除的语句,例如:
delete from t where age>10 and modified_time<='2020-03-04' limit 1
使用这个格式的binlog很可能出现下面这种问题:
在主库执行这条SQL语句的时候,用的是索引age,而在备库执行这条SQL语句的时候,却使用了索引modified_time
主备同步本身就存在一部分延迟,limit语句很可能受延迟的影响
而row格式记录的是实际受影响的数据是真实删除行的主键id,例如:
delete from t where id=3 and age=12 and modified_time='2020-03-05'
这样 binlog传到备库去的时候,就肯定会删除id=3的行,不会存在主备删除不同行的问题
修改
注意这个例子数据库隔离级别为读提交
statment格式记录的binlog可能会是这样:
会话二:
begin;
update t set d=5 where id=0;
commit;
会话一:
begin;
update t set d=100 where d=5;
commit;
通过上面解析出来的binlog执行就有问题了,最终结果是2行数据d变成了100,明显与期望不一致。
如果是row格式,那么伪日志记录如下:
会话二:
begin;
update t where id=0 and c=0 and d=0
set id=0,c=0,d=5
commit;
会话一:
begin;
update t where id=5 and c=5 andd=5
set id=5,c=5,d=100
commit;
显然row格式记录方式按照这个binlog执行明显是正确的,也符合预期
注意:为什么这个例子强调了数据库隔离级别为读提交呢?
可重复读级别下会存在间隙锁,会话2必须等会话1释放锁后才能执行,自然也不会出问题
数据恢复
除了避免主备不一致外,使用row格式的binlog对恢复数据也很友好
delete
row格式的binlog会把被删掉的行的整行 信息保存起来。所以,如果你在执行完一条delete语句以后,发现删错数据了,可以直接把binlog中记录的delete语句转成insert
insert
row格式下,insert语句的binlog里会记录所有的字段信息,这些信息可以用来精确定位刚刚被插入的那一行。这时,你直接把insert语句转成delete语句,删除掉这被误插入的一行数据就可以了
update
row格式下,binlog里面会记录修改前整行的数据和修改后的整行数据。所 以,如果你误执行了update语句的话,只需要把这个event前后的两行信息对调一下,再去数据库里面执行,就能恢复这个更新操作了
————————————————
版权声明:本文为CSDN博主「靖dede」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_34315264/article/details/113228514
相关文章
- mysql binlog 参数_MySQL Binlog常用参数
- 《MySQL系列》 不建议给MySQL设置Null值的原因?
- 5项优化4种高可用方案,MySQL常用架构调优这样做!
- 【MySQL进阶-07】深入理解mysql性能优化以及解决慢查询问题
- linux下开启、关闭、重启mysql服务
- MySQL谈谈InnoDB怎么解决幻读的
- oracle mysql sqlserver 基本操作命令
- 【mysql】MySQL的sql_mode模式说明及设置
- 基于Java+MySQL实现(WinForm)客户管理系统【100010236】
- Docker 安装MySql 8.0
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
- mysql视频链接
- MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
- MySql修改root密码、设置IP访问
- 有关Mysql的mysql_store_result函数返回NULL的情况以及其他注意事项
- mariadb(MySql)设置远程访问权限
- 小知识随手记(十):多重重复解构对象、es6函数带默认参数时将生成声明作用域、一些注意点、动态设置getter/setter、mysql将字符串字段转为数字排序或比大小、pointer-events:none;属性
- 借助 Navicat for MySQL 软件 把 不同或者相同数据库链接中的某数据库表数据 复制到 另一个数据库表中
- (5.4)mysql高可用系列——MySQL异步复制(实践)
- 【转】MySQL Utilities,mysql工具包
- (2.2)学习笔记之mysql基础操作(登录及账户权限设置)
- 使用 pymysql 操作数据库 mysql 8.0.15 版本
- Eclipse中使用MySql遇到:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading o
- Ubuntu 16.04 设置MySQL远程访问权限
- MySQL - 深入理解 MySQL 的 MVCC 及实现原理