我们知道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 设置 row格式binlog_为什么要把MySQL的binlog格式修改为row的更多相关文章

  1. 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》

    大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...

  2. MySQL设置字符集为UTF8(Windows版)

    Windows版MySQL设置字符集全部为utf8的方式 MySQL安装目录下的my.ini文件 [client]节点 default-character-set=utf8    (增加) [mysq ...

  3. my15_ mysql binlog格式从mixed修改为row格式

    由于主库繁忙,就在从库上修改binlog格式 1. 从库切日志mysql> flush logs;Query OK, 0 rows affected (0.00 sec) mysql> f ...

  4. 【mysql】关于binlog格式

    写在前面的话 1.推荐用mixed,默认使用statement,基于上下文  set session/global binlog_format=mixed; 2.二进制日记录了数据库执行更改的操作,如 ...

  5. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  6. c/c++连接mysql数据库设置及乱码问题(vs2013连接mysql数据库,使用Mysql API操作数据库)

    我的安装环境: (1)vs2013(32位版) (vs2013只有32位的 没有64位的,但是它可以编译出64位的程序)  : (2)mysql-5.7.15(64位) vs2013中的设置(按步骤来 ...

  7. MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨

    开心一刻 产品还没测试直接投入生产时,这尼玛... 背景问题 在讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了 1.Ora ...

  8. 14.9.2 Specifying the Row Format for a Table 指定 表的行格式

    14.9.2 Specifying the Row Format for a Table 指定 表的行格式 mysql> SHOW TABLE STATUS\G; *************** ...

  9. MySQL 设置root密码报错:mysqladmin: connect to server at 'localhost' failed

    MySQL 设置root密码报错:mysqladmin: connect to server at 'localhost' failed 1.安装完MySQL设置root密码报错如下 [root@vm ...

  10. MySQL 设置慢查询为200ms

    1:查看当前版本并设置long_query_time为0.2 mysql> select version(); +------------+ | version() | +----------- ...

随机推荐

  1. k8s events说明

    简单说明 k8s的Event事件是一种资源对象,用于展示集群内发生的情况,k8s系统中的各个组件会将运行时发生的各种事件上报给apiserver . 可以通过kubectl get event 或 k ...

  2. Grafana+Prometheus+Node_exporter监控Linux系统

    一.简单介绍 这里介绍使用prometheus+grafana+node_exporter实现linux系统的监控.下面针对这三个组件进行具体的说明 prometheus prometheus是一套开 ...

  3. LinkedList链表

    LinkedList 他是继承的List 双向链表 每当我们new一个linklist对象的时候 LinkedList linkedList = new LinkedList(); 他会先创建一个Li ...

  4. 数栈大数据组件:Hive优化之配置参数的优化

    Hive是大数据领域常用的组件之一,主要用于大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必不可少的一项技能.影响Hive效率的主要因素有 ...

  5. 一看就懂!任务提交的资源判断在Taier中的实践

    Taier 介绍 Taier 是袋鼠云开源项目之一,是一个分布式可视化的DAG任务调度系统. 旨在降低ETL开发成本.提高大数据平台稳定性,大数据开发人员可以在 Taier 直接进行业务逻辑的开发,而 ...

  6. Trie 字典树的原理和应用解析

    如何高效地存储和查找大量字符串或前缀?比如自动补全.拼写检查.敏感词过滤等场景,都对字符串的处理速度有很高要求.哈希表虽然查找快,但并不擅长前缀匹配:普通树结构虽然灵活,但对于大量字符串的处理效率并不 ...

  7. 记一次ADL导致的C++代码编译错误

    这篇文章主要讲讲c++的ADL,顺便说说为什么很多c++的IDE都会让你尽量不要include用不上的头文件. 和其他c++文章一样,这篇也会有基础回顾环节,所以不用担心看不懂,但读者最好还是得有c+ ...

  8. vue启动入口

    两个地方可以配置 方法一:修改packge.json启动命令参数 "scripts": { "serve": "vue-cli-service ser ...

  9. CentOS7 - 安装NextCloud

    a { display: block } 首先安装LAMP环境 通过PhpMyAdmin,为NextCloud新建一个数据库.访问地址为 http://IP地址/phpmyadmin/ 下载最新版本的 ...

  10. runnable & callable

    简介 简单来说这两个接口都是执行多线程里面使用的东西. 参考链接 https://blog.csdn.net/qq_41357573/article/details/88887566 区别 Java多 ...