前言

完全参考:《24 | MySQL是怎么保证主备一致的?》

binlog 存储格式笔记

statement

binlog 里面记录的就是 SQL 语句的原文;

mysql> show binlog events in 'master.000001';

  • 第一行 SET @@SESSION.GTID_NEXT='ANONYMOUS’你可以先忽略;
  • 第二行是一个 BEGIN,跟第四行的 commit 对应,表示中间是一个事务;
  • 第三行就是真实执行的语句了。可以看到,在真实执行的 delete 命令之前,还有一个“use ‘test’”命令。这条命令不是我们主动执行的,而是 MySQL 根据当前要操作的表所在的数据库,自行添加的。这样做可以保证日志传到备库去执行的时候,不论当前的工作线程在哪个库里,都能够正确地更新到 test 库的表 t。use 'test’命令之后的 delete 语句,就是我们输入的 SQL 原文了。可以看到,binlog“忠实”地记录了 SQL 命令,甚至连注释也一并记录了。
  • 最后一行是一个 COMMIT。你可以看到里面写着 xid=61。xid就用redo关联binlog用的。

记录SQL语句的缺点:在备库上执行,可能因为和主库走的索引不同,而导致数据不一致;

row

binlog的内容:

可以看到,与 statement 格式的 binlog 相比,前后的 BEGINCOMMIT 是一样的。但是,row 格式的 binlog 里没有了 SQL 语句的原文,而是替换成了两个 eventTable_mapDelete_rows

  1. Table_map event,用于说明接下来要操作的表是 test 库的表 t;
  2. Delete_rows event,用于定义删除的行为。

其实,我们通过上图 是看不到详细信息的,还需要借助 mysqlbinlog 工具,用下面这个命令解析和查看 binlog 中的内容。因为图 5 中的信息显示,这个事务的 binlog 是从 8900 这个位置开始的,所以可以用 start-position 参数来指定从这个位置的日志开始解析。

mysqlbinlog  -vv data/master.000001 --start-position=8900;

  • server id 1,表示这个事务是在 server_id=1 的这个库上执行的。
  • 每个 event 都有 CRC32 的值,这是因为我把参数 binlog_checksum 设置成了 CRC32。
  • Table_map event 跟在图 5 中看到的相同,显示了接下来要打开的表,map 到数字 226。现在我们这条 SQL 语句只操作了一张表,如果要操作多张表呢?每个表都有一个对应的 Table_map event、都会 map 到一个单独的数字,用于区分对不同表的操作。
  • 我们在 mysqlbinlog 的命令中,使用了 -vv 参数是为了把内容都解析出来,所以从结果里面可以看到各个字段的值(比如,@1=4、 @2=4 这些值)。
  • binlog_row_image 的默认配置是 FULL,因此 Delete_event 里面,包含了删掉的行的所有字段的值。如果把 binlog_row_image 设置为 MINIMAL,则只会记录必要的信息,在这个例子里,就是只会记录 id=4 这个信息。
  • 最后的 Xid event,用于表示事务被正确地提交了。

你可以看到,当 binlog_format 使用 row 格式的时候,binlog 里面记录了真实删除行的主键 id,这样 binlog 传到备库去的时候,就肯定会删除 id=4 的行,不会有主备删除不同行的问题。

总结

statement模式下,会导致主备数据执行不一致,而row模式下,因为记录的是真实行的主键,所以可以保证主备数据一致。

MySQL binlog存储格式笔记相关推荐

  1. mysql binlog c++_MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  2. mysql binlog协议_mysql binlog协议分析--具体event

    这几天在修改canal, 连接mysql和maria接收到的event有所区别 拿一个简单的insert sql来举例 mysql 会有以下几个event写入到binlog里 1.ANONYMOUS_ ...

  3. MySQL尚硅谷笔记

    MySQL 网课链接 https://www.bilibili.com/video/BV1KW411u7vy?p=1 相关笔记链接 https://github.com/RingoTangs/Lear ...

  4. 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)

    数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...

  5. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  6. linux数据库创建score表,MySQL数据库学习笔记

    MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...

  7. Mysql binlog日志及binlog恢复数据库操作

    初识MySQL 日志binlog MySQL重要log,二进制日志文件,记录所有DDL和DML语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型. DDL(数据库定义语言),主 ...

  8. MySQL Binlog解析

    概述 MySQL的安装可以参考:Linux(CentOS)中常用软件安装,使用及异常--MySQL, VmTools MySQL关于Binlog的官方文档:The Binary Log 基于Binlo ...

  9. Mysql binlog应用场景与原理深度剖析

    1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...

最新文章

  1. IOS开发笔记3-C语言基础复习
  2. netty3超长字符串
  3. java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java
  4. S3C6410 KeyPad驱动(下)
  5. 自定义类加载器在复杂类加载情况下的运行分析
  6. windows中 修改某种文件图标 的方法 (备忘)
  7. 第二次作业+105032014101
  8. 视觉SLAM笔记(13) 空间变换
  9. 菜鸟的IT道路ing (一)
  10. 导入工程出错原因及解决
  11. Java中String的用法
  12. chrome vue 未响应_分享几个宝藏级Vue管理后台框架 必须收藏
  13. 库卡六轴机器人编程手册_工业机器人(ABB、库卡、安川)编程专业教材!
  14. 【iOS源码】懒人笔记应用源码
  15. 计算机专业毕设java选题参考
  16. CSDN Markdown编辑器 图片对齐方式(居中/左对齐/右对齐)及图片大小
  17. 各行业赫芬达尔指数表(2013-2018年)
  18. SUBMAIL短信平台API接口-Message/send
  19. 1564 区间的价值
  20. 小米电视3 android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)

热门文章

  1. 20211212做实验时的感想
  2. 莫比乌斯入门:bzoj 1101 Zap(Mobius)
  3. rpm软件安装冲突:conflicts with
  4. 用纯css模拟下雪的效果
  5. Java mail Exchange Service
  6. 1024程序员节的由来
  7. 简单对象协议(SOAP)简介
  8. 浴火重生,燃起奋斗的欲望
  9. 彻底关闭win11自动更新
  10. 蒙特卡罗MCNP学习汇总(二)--几何体基础,构建几何体