DBA专题
DBA授课
DBA公开课
DBA训练营三天
01.Mysql基础入门-数据库简介
02.Mysql基础入门-部署与管理体系
03.MySQL主流版本版本特性与部署安装
04.Mysql-基础入门-用户与权限
05 MySQL-SQL基础2
06 SQL高级开发-函数
07 MySQL-SQL高级处理
08 SQL练习 作业
09 数据库高级开发2
10 Mysql基础入门-索引
11 Mysql之InnoDB引擎架构与体系结构
12 Mysql之InnoDB存储引擎
13 Mysql之日志管理
14 Mysql备份,恢复与迁移
15 主从复制的作用及重要性
16 Mysql Binlog Event详解
17 Mysql 主从复制
18 MySQL主从复制延时优化及监控故障处理
19 MySQL主从复制企业级场景解析
20 MySql主从复制搭建
21 MySQL高可用-技术方案选型
22 MySQL高可用-MHA(原理篇)
23 MySQL MHA实验
24 MySQL MGR
25 部署MySQL InnoDB Cluster
26 MySQL Cluster(MGR)
27 MySQL ProxySQL中间件
相信可能就有无限可能
-
+
首页
16 Mysql Binlog Event详解
> binary log基本就是Event,在主从复制中传递和应用这些Event,非常重要,因为熟悉常用的Event对理解主从复制和MySQL非常重要 # 1.Binlog Event格式 ## 1.1.binlog综述 每个binlog开头都是4字节的魔术数和event组成,,因此了解常用的Event的格式,就能解析这些Event。我们再Linux系统重使用hexdump Cv查看魔术数,如下: ```sql root@sunrise-218:/data/mysql3306/data# hexdump -Cv binlog.000001 00000000 fe 62 69 6e 61 3a 1f 66 0f 01 00 00 00 7a 00 00 |.bina:.f.....z..| ..... - fe 62 69 6e 十六进制编码为binlog的魔术数 - binlog解析时候从 #at 4开始 - 源码定义 #define BINLOG MAGIC "\xfe\x62\x69\x6e" #魔术数概念 - 程式设计中所谓的直接写在程式码里的具体数值 - 除了作者其他人难以理解(甚至作者都不理解),比如一个约定的东西 ``` ## 1.2.Event格式 ![image](https://img.sunrisenan.com/img/2024/04/16/114024111.png) ### 1.2.1.event header 和footer - event header ```sql 1. timestamp: - 固定4字节,是从新纪元时间 1970,1,1,0,0,以来的秒数。 - 源码塞 dispatch_command函数的(thd->set_time()),语法校验,权限检查、 优化器生成执行计划时间生产都在里面 - Seconds_Behind_Master时候的重要依据 2. type code - 固定1字节,是Event 的编码。每个 Event 都有自己的编码。 3. server_id: - 固定4字节,数据库id(从库开启log_slave_updates),讲主库event写入自己binlog也是主库的server_id 4.event_len: - 固定 字节,是整个 Event 的长度。 5.end_log_p : - 固定4字节,是下一个Event的开始位置。 6.flags - 固定2字节,某些Event包含标志,比如当前binlog log是否正在写入 ``` - event footer ```sql 1. crc - 固定4字节,整体event的crc校验码,表示event完整性 ``` ### 1.2.2.解析 ```sql root@sunrise-218:/data/mysql3306/data# mysqlbinlog --hexdump binlog.000001 shell>mysqlbinlog --hexdump mysql-bin.000007>/tmp/binlog.log # at 194 #211031 11:20:29 server id 1 end_log_pos 259 CRC32 0x2b4e3a3a # Position Timestamp Type Master ID Size Master Pos Flags # c2 7d 0b 7e 61 21 01 00 00 00 41 00 00 00 03 01 00 00 00 00 # d5 00 dd d2 aa b7 24 ae 11 ec 84 06 fa 20 20 13 13 |................| # e5 7b 2c 00 00 00 00 00 00 00 02 00 00 00 00 00 00 |................| # f5 00 00 01 00 00 00 00 00 00 00 3a 3a 4e 2b |............N.| # GTID last_committed=0 sequence_number=1 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= 'ddd2aab7-24ae-11ec-8406-fa202013137b:44'/*!*/; # erver v 5.7.30-log created 211031 11:19:44 BINLOG ' UAt+YQ8BAAAAdwAAAHsAAAAAAAQANS43LjMwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA ATqDuqs= '/*!*/; # at 259 - Timestamp:617e0b7d(十六进制)-->1635650429 - type code:21(十六进制)-->33(十进制),每个event独有的type code - server_id:01 00 00 00-->00000001--->1 - event_len:00000041--->41-->65,event的长度(259-194=65bytes) - end_log_p:03 01 00 00 -->00000103-->259,下一个event地址 即# at 259 - flags:00 00 - crc:3a 3a 4e 2b ``` ## 1.3.Event常用类型 ![image (1)](https://img.sunrisenan.com/img/2024/04/16/114302286.png) 常用的event类型(根据event type code) ```sql - QUERY_EVENT=2:ROW模式下仅记录DDL语句 - FORMAT_DESCRIPTION_EVENT=15:binlog版本信息,在开头 - XID_EVENT=16 :当事务提交的时候记录这个 Event,携带XID信息 - TABLE_MAP_EVENT=19::包含table_id和具体表名映射关系 - WRITE_EVENT=30: INSERT语句生产Event,包含实际插入数据 - UPDATE_EVENT=31:UPDATE语句生产Event.前后映射数据 - DELETE_EVENT=32:.. - GTID_EVENT= 33: 在开启 GTID 的时候生成关于 GTID 的信息,并且携带了 last_committed 和seq_number 信息。 - PREVIOUS_GTIDS_EVENT= 35: 前面所有的 binary log 包含的 GTID SET, relay log代表 I/0 线程收到的 GTID SET 其余event code可以参考源码的Log_event_type枚举类型 ``` 查看binlog event信息 ```sql mysql> show binlog events in 'binlog.000001'\G *************************** 1. row *************************** Log_name: binlog.000001 Pos: 4 Event_type: Format_desc --binlog版本信息,在开头 Server_id: 1 End_log_pos: 126 Info: Server ver: 8.0.36, Binlog ver: 4 *************************** 2. row *************************** Log_name: binlog.000001 Pos: 126 Event_type: Previous_gtids --前面所有binlog包含的 GTID SET Server_id: 1 End_log_pos: 157 Info: *************************** 3. row *************************** Log_name: binlog.000001 Pos: 157 Event_type: Anonymous_Gtid --在开启GTID时生成的信息,包含last commit和seq number信息 Server_id: 1 End_log_pos: 234 Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS' *************************** 4. row *************************** Log_name: binlog.000001 Pos: 234 Event_type: Query --ROW模式下仅记录DDL语句 Server_id: 1 End_log_pos: 351 Info: create database sunrise /* xid=4 */ 4 rows in set (0.00 sec) *************************** 5. row *************************** Log_name: binlog.000001 Pos: 351 Event_type: Anonymous_Gtid Server_id: 1 End_log_pos: 430 Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS' *************************** 6. row *************************** Log_name: binlog.000001 Pos: 430 Event_type: Query Server_id: 1 End_log_pos: 610 Info: use `sunrise`; create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)) /* xid=13 */ *************************** 7. row *************************** Log_name: binlog.000001 Pos: 610 Event_type: Anonymous_Gtid Server_id: 1 End_log_pos: 689 Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS' *************************** 8. row *************************** Log_name: binlog.000001 Pos: 689 Event_type: Query Server_id: 1 End_log_pos: 775 Info: BEGIN *************************** 9. row *************************** Log_name: binlog.000001 Pos: 775 Event_type: Table_map --包含 table id 具体表名的映射关系。 Server_id: 1 End_log_pos: 843 Info: table_id: 112 (sunrise.Student) *************************** 10. row *************************** Log_name: binlog.000001 Pos: 843 Event_type: Write_rows --INSERT语句生成的Event, 包含插入的实际数据 Server_id: 1 End_log_pos: 898 Info: table_id: 112 flags: STMT_END_F *************************** 11. row *************************** Log_name: binlog.000001 Pos: 898 Event_type: Xid --当事务提交的时候记录这个 Event, 其中携带了 XID 信息。 Server_id: 1 End_log_pos: 929 Info: COMMIT /* xid=14 */ 11 rows in set (0.00 sec) ``` ### 1.3.1.FORMAT_DESCRIPTION_EVENT ```sql 1.作用 - binlog的第一个event,比较简单,携带数据固定 - 包括binlog版本信息,mysql版本信息 - event_header长度 - event type长度 - 一定出现 - 以上信息保存在从库内存中 - flush binary logs,binary log切换,重启MySQL实例 2.从库内容场景 - SQL线程应用Event获取header长度 - I/O线程启动监测版本,get_master_version_and_clock函数 - 信息写入relay log开头的FORMAT_DESCRIPTION_EVENT 3.源码构造接口(从这里看出,每一个功能点背后都是一个C语言构造函数去实现功能) - 主库: - 初始化构造函数: Format_description log event: Format description og event(uint8_tbinlog_ ver, con st char* server_ ver=O); - 写入binlog cache:Format_description_log_event::write(IO_CACHE* file) - 从库 - 读取构造函数:Format description_log_ event:: Format_ description_ log_ event - 应用函数:Format description_log_event::do_apply_event 4.主体格式 - binlog_version:2字节,binary log版本为4 - server_version: 20字节,MySQL版本字符串形式 - create_timestamp:4字节,记录启动时间。仅第一个binary_log - header_length: 1字节 - array_of_post_header: 表示的是每个 Event 固定部分的大小。 ``` ![111](https://img.sunrisenan.com/img/2024/04/16/114419243.png) ```sql 5.实例解析 - binlog_version:04 00- binlog版本 - server_version: 35 2e..00(往后20个字节) Mysql版本(5.7.30) - create_timestamp:00 a1 87 61(6187a100)-4字节,记录启动时间。仅第一个binary_log - header_length: 1字节 13 - 38 0d...01(结尾):不解析,每个event固定大小 ``` ![112](https://img.sunrisenan.com/img/2024/04/16/114512839.png) ### 1.3.2.QUERY_EVENT ```sql 1.作用(ROW) - 记录 语句环境,登入数据库,执行时间 - DDL记录实际语句执行时间 - 一个事务只有一个QUERY_EVENT 2.固定格式 2.1.固定部分 - slave_proxy_id:4字节,主库event的thread_id,对应show processlist的id - query_exec_time:4字节,执行时间(DDL准确,row模式DML不准确) - db_len:1字节,描述数据库名的长度 - error_code:2字节,执行语句的错误码 - status_vars_len:2字节,status variables部分长度 2.2.可变部分 - status_variables:环境参数, - db:db名字,0x00结尾 - query:DML记录begin,DDL记录语句 3.解析 mysql> show binlog events in 'binlog.000001' from 234 limit 1 \G *************************** 1. row *************************** Log_name: binlog.000001 Pos: 234 Event_type: Query Server_id: 1 End_log_pos: 351 Info: create database sunrise /* xid=4 */ 1 row in set (0.00 sec) - thraed_id:44 1b 00 00 - 00 00 00 00 :sql执行时间 - 04:当前登入数据库名长度 - 00 00:错误码 - 1a 00:status variables部分长度 - status variables ....:略 - 74 65 73 74 00:登入test库名的 - 74 72 75 6e:语句tuncate t1的ASCII编码 ``` ![image](https://img.sunrisenan.com/img/2024/04/16/114638830.png)
李延召
2024年4月17日 11:47
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码