MySQL的7种日志(四):BinLog

0.前言

续:

1.什么是binlog

2.binlog的作用

3.binlog 和 redolog 区别

4.什么时候写binlog

5.binlog的存储

binlog日志包括两类文件:

a.binlog的索引文件:一个文本文件,其中内容为当前的binlog文件列表

b.binlog:一个二进制文件集合

binlog日志物理存储

+=====================================+
| event  | timestamp         0 : 4    |
| header +----------------------------+
|        | type_code         4 : 1    | 
|        +----------------------------+
|        | server_id         5 : 4    |
|        +----------------------------+
|        | event_length      9 : 4    | 
|        +----------------------------+
|        | next_position    13 : 4    |
|        +----------------------------+
|        | flags            17 : 2    |
+=====================================+
| event  | binlog_version   19 : 2    | 
| data   +----------------------------+
|        | server_version   21 : 50   |
|        +----------------------------+
|        | create_timestamp 71 : 4    |
|        +----------------------------+
|        | header_length    75 : 1    |
|        +----------------------------+
|        | post-header      76 : n    | 
|        | lengths for all            |  
|        | event types                |
+=====================================+
如果事件头的长度是 x 字节,那么事件体的长度为 (event_length - x) 字节;设事件体中 fixed part 的长度为 y 字节,那么 variable part 的长度为 (event_length - (x + y)) 字节。

type_code

现在一般不会使用MySQL5.0以下版本,所以下面仅介绍v4版本的binlog事件类型。binlog 的事件类型较多,本文在此做一些简单的汇总

事件类型 说明
UNKNOWN_EVENT 此事件从不会被触发,也不会被写入binlog中;发生在当读取binlog时,不能被识别其他任何事件,那被视为UNKNOWN_EVENT
START_EVENT_V3 每个binlog文件开始的时候写入的事件,此事件被用在MySQL3.23 – 4.1,MYSQL5.0以后已经被 FORMAT_DESCRIPTION_EVENT 取代
QUERY_EVENT 执行更新语句时会生成此事件,包括:create,insert,update,delete;
STOP_EVENT 当mysqld停止时生成此事件
ROTATE_EVENT 当mysqld切换到新的binlog文件生成此事件,切换到新的binlog文件可以通过执行flush logs命令或者binlog文件大于 max_binlog_size 参数配置的大小;
INTVAR_EVENT 当sql语句中使用了AUTO_INCREMENT的字段或者LAST_INSERT_ID()函数;此事件没有被用在binlog_format为ROW模式的情况下
LOAD_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL 3.23版本中使用
SLAVE_EVENT 未使用
CREATE_FILE_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用
APPEND_BLOCK_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0版本中使用
EXEC_LOAD_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用
DELETE_FILE_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0版本中使用
NEW_LOAD_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用
RAND_EVENT 执行包含RAND()函数的语句产生此事件,此事件没有被用在binlog_format为ROW模式的情况下
USER_VAR_EVENT 执行包含了用户变量的语句产生此事件,此事件没有被用在binlog_format为ROW模式的情况下
FORMAT_DESCRIPTION_EVENT 描述事件,被写在每个binlog文件的开始位置,用在MySQL5.0以后的版本中,代替了START_EVENT_V3
XID_EVENT 支持XA的存储引擎才有,本地测试的数据库存储引擎是innodb,所有上面出现了XID_EVENT;innodb事务提交产生了QUERY_EVENT的BEGIN声明,QUERY_EVENT以及COMMIT声明,如果是myIsam存储引擎也会有BEGIN和COMMIT声明,只是COMMIT类型不是XID_EVENT
BEGIN_LOAD_QUERY_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL5.0版本中使用
EXECUTE_LOAD_QUERY_EVENT 执行LOAD DATA INFILE 语句时产生此事件,在MySQL5.0版本中使用
TABLE_MAP_EVENT 用在binlog_format为ROW模式下,将表的定义映射到一个数字,在行操作事件之前记录(包括:WRITE_ROWS_EVENT,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT)
PRE_GA_WRITE_ROWS_EVENT 已过期,被 WRITE_ROWS_EVENT 代替
PRE_GA_UPDATE_ROWS_EVENT 已过期,被 UPDATE_ROWS_EVENT 代替
PRE_GA_DELETE_ROWS_EVENT 已过期,被 DELETE_ROWS_EVENT 代替
WRITE_ROWS_EVENT 用在binlog_format为ROW模式下,对应 insert 操作
UPDATE_ROWS_EVENT 用在binlog_format为ROW模式下,对应 update 操作
DELETE_ROWS_EVENT 用在binlog_format为ROW模式下,对应 delete 操作
INCIDENT_EVENT 主服务器发生了不正常的事件,通知从服务器并告知可能会导致数据处于不一致的状态
HEARTBEAT_LOG_EVENT 主服务器告诉从服务器,主服务器还活着,不写入到日志文件中

6.binlog解析和反解

参见:

其他binlog问题

>> Home

51ak

2022/12/27

Categories: mysql binlog Tags: 原创 精品

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号