mysql binlog是mysql主备复制的基础。笔者根据自己的理解整理下这部分的内容(主要针对V4版本的binlog),希望能够对想深入学习和研究这部分内容的人提供帮助。在binlog相关内容讲解完毕后,会分享一个解析binlog文件的程序,有兴趣的同学参考该程序进入更深入的研究。
mysql支持多种binlog event。参考binlog_event.h::Log_event_type数据结构,常见的binlog evevnt有以下几种,后续会详细讲解这些event内容
FORMAT_DESCRIPTION_EVENT
QUERY_EVENT:
STOP_EVENT:
ROTATE_EVENT:
TABLE_MAP_EVENT:
WRITE_ROWS_EVENT:
UPDATE_ROWS_EVENT:
DELETE_ROWS_EVENT:
GTID_LOG_EVENT
每个binlog由4部分组成:
header: 固定长度19字节。所有event的格式都是相同。主要内容如下:
内容 offset:length
// timestamp 0:4
// type_code 4:1
// server_id 5:4
// event_length 9:4
// next_position 13:4
// flags 17:2post-header: 每种event的长度和格式固定。根据format_description_event获取每种类型的长度。
pay_load: event的实际内容,同一种的event的内容和长度也可能不同。需要根据实际内容进行解析。
footer: 如果该binlog支持checksum(根据format_description_event确定是否支持,目前只支持CRC32校验),4字节的checksum值。
对应的主要数据结构:
以Query_log_event为例,主要继承2个类,Binary_log_event和Log_event
Binary_log_event
^
|
|
Query_event Log_event
\ /
<<virtual>>\ /
\ /
Query_log_event
Binary_log_event:
Log_event_header m_header; 对应binlog header部分
Log_event_footer m_footer; 对应binlog footer部分
Query_event: 事件解析后的各个变量
Log_event: 对event可以执行的一些操作函数,主要有:
read_log_event:从binlog或者relay log读取event
根据event的type调用特定事件的构造函数:通过传送buf和event _len构造对应的事件
apply_event:执行event。主备复制的时候主要调用read_log_event 和 apply_event 执行复制流程
print:打印binlog事件。mysqlbinlog等工具会用到
其他类型的事件都类似. 对外接口类为类型_log_event, 该类派生自2个类:一个表示event的组成; 另一个表示该event支持的操作