logo
当前位置:首 页 > 编程技术 >后端开发 > 查看文章

MySQL Binlog 事件介绍篇

后端开发, 编程技术 你是第3278个围观者 0条评论 供稿者:

前言

本文将对Binlog的事件进行简单说明,必要的时候通过SQL触发相关的事件,以下基于Mysql5.5,5.0以前的版本不考虑。

Binlog事件

1.UNKNOWN_EVENT

此事件从不会被触发,也不会被写入binlog中;发生在当读取binlog时,不能被识别其他任何事件,那被视为UNKNOWN_EVENT。

2.START_EVENT_V3

每个binlog文件开始的时候写入的事件,此事件被用在MySQL3.23 – 4.1,MYSQL5.0以后已经被FORMAT_DESCRIPTION_EVENT取代。

3.QUERY_EVENT

执行更新语句时会生成此事件,包括:create,insert,update,delete;

手动触发:

4.STOP_EVENT

当mysqld停止时生成此事件

可以手动停止mysql,生成的事件:

5.ROTATE_EVENT

当mysqld切换到新的binlog文件生成此事件,切换到新的binlog文件可以通过执行flush logs命令或者binlog文件大于max_binlog_size参数配置的大小;

手动触发:

6.INTVAR_EVENT

当sql语句中使用了AUTO_INCREMENT的字段或者LAST_INSERT_ID()函数;此事件没有被用在binlog_format为ROW模式的情况下。

btest表中的id为AUTO_INCREMENT,所以产生了INTVAR_EVENT

7.LOAD_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL 3.23版本中使用;

8.SLAVE_EVENT

未使用的

9.CREATE_FILE_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用;

10.APPEND_BLOCK_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0版本中使用;

11.EXEC_LOAD_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用;

12.DELETE_FILE_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0版本中使用;

13.NEW_LOAD_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL4.0和4.1版本中使用;

14.RAND_EVENT

执行包含RAND()函数的语句产生此事件,此事件没有被用在binlog_format为ROW模式的情况下;

15.USER_VAR_EVENT

执行包含了用户变量的语句产生此事件,此事件没有被用在binlog_format为ROW模式的情况下;

16.FORMAT_DESCRIPTION_EVENT

描述事件,被写在每个binlog文件的开始位置,用在MySQL5.0以后的版本中,代替了START_EVENT_V3

17.XID_EVENT

支持XA的存储引擎才有,本地测试的数据库存储引擎是innodb,所有上面出现了XID_EVENT;innodb事务提交产生了QUERY_EVENT的BEGIN声明,QUERY_EVENT以及COMMIT声明,

如果是myIsam存储引擎也会有BEGIN和COMMIT声明,只是COMMIT类型不是XID_EVENT;

18.BEGIN_LOAD_QUERY_EVENT和EXECUTE_LOAD_QUERY_EVENT

执行LOAD DATA INFILE 语句时产生此事件,在MySQL5.0版本中使用;

mysqlLOAD DATA INFILE “D:/btest.sql” INTO TABLE test.btest FIELDS TERMINATED BY ‘,’;

Query OK, 1 row affected (0.11 sec)

Records1  Deleted0  Skipped0  Warnings0

mysqlshow binlog events in ‘bin-log.000003’;

+—————-+——+——————–+———–+————-+———————————————————————————————————————————————————————————-+

Log_name       | Pos  | Event_type         | Server_id | End_log_pos |Info                                                                                                                                                                             |

+—————-+——+——————–+———–+————-+———————————————————————————————————————————————————————————-+

……                                                                                                                                                          |

binlog.000003 |  896 | Query              |         1 |         964 |BEGIN                                                                                                                                                                            |

binlog.000003 |  964 | Begin_load_query   |         1 |        1008 |;file_id=3;block_len=21                                                                                                                                                          |

binlog.000003 | 1008 | Execute_load_query |         1 |        1237 | use `test`; LOAD DATA INFILE ‘D:/btest.sql’ INTOTABLE `btest` FIELDS TERMINATED BY ‘,’ ENCLOSED BY  ESCAPED BY ‘\\’ LINES TERMINATED BY ‘\n’ (`id`, `age`,`name`) ;file_id=3 |

binlog.000003 | 1237 | Xid                |         1 |        1264 | COMMIT /* xid=148 */                                                                                                                                                             |

+—————-+——+——————–+———–+————-+———————————————————————————————————————————————————————————-+

19 rows in set (0.00 sec)

btest.sql内容如下:

999, 101, ‘zhaohui’

19.TABLE_MAP_EVENT

用在binlog_format为ROW模式下,将表的定义映射到一个数字,在行操作事件之前记录(包括:WRITE_ROWS_EVENT,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT);

20.PRE_GA_WRITE_ROWS_EVENT,PRE_GA_UPDATE_ROWS_EVENT和PRE_GA_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代替;

21.WRITE_ROWS_EVENT、UPDATE_ROWS_EVENT和DELETE_ROWS_EVENT

以上三个事件都被用在binlog_format为ROW模式下,分别对应inset,update和delete操作;

22.INCIDENT_EVENT

主服务器发生了不正常的事件,通知从服务器并告知可能会导致数据处于不一致的状态;

23.HEARTBEAT_LOG_EVENT

主服务器告诉从服务器,主服务器还活着,不写入到日志文件中;

总结

本文对Binlog的所有事件进行了大体的介绍,必要的时候也介绍了触发事件的条件;但是并没有深入介绍事件的fix data和variable data,后续文章会继续介绍这一块。

参考:

https://dev.mysql.com/doc/internals/en/event-meanings.html

说说梦想,谈谈感悟 ,聊聊技术,有啥要说的来github留言吧 https://github.com/cjx2328

—— 陈 建鑫

陈建鑫
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容。站长联系:cjx2328#126.com(修改#为@)
Copyright ©ziao Studio All Rights Reserved. E-mail:cjx2328#126.com(#号改成@) 沪ICP备14052271号-3