社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL Binlog 事件介绍篇

数据库开发 • 7 年前 • 809 次点击  

(点击上方公众号,可快速关注)


来源:zhaohui

codingo.xyz/index.php/2017/11/13/mysql-events/

如有好文章投稿,请点击 → 这里了解详情


前言


上一篇MySql Binlog初识,对Binlog的参数,格式以及个别事件做了详细介绍,但是Binlog事件数量比较多,上篇文章中没有对所有事件进行介绍;本文将对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版本中使用;


mysql> LOAD DATA INFILE "D:/btest.sql" INTO TABLE test.btest FIELDS TERMINATED BY ',';

Query OK, 1 row affected (0.11 sec)

Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

mysql> show binlog events in 'bin-log.000003';

+----------------+------+--------------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

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

+----------------+------+--------------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

......                                                                                                                                                          |

| bin- log.000003 |  896 | Query              |         1 |         964 | BEGIN                                                                                                                                                                            |

| bin-log.000003 |  964 | Begin_load_query   |         1 |        1008 | ;file_id=3;block_len= 21                                                                                                                                                          |

| bin-log.000003 | 1008 | Execute_load_query |         1 |        1237 | use `test`; LOAD DATA INFILE 'D:/btest.sql' INTO TABLE `btest` FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`id`, `age`, `name`) ;file_id=3 |

| bin -log.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



看完本文有收获?请转发分享给更多人

关注「数据库开发」,提升 DB 技能


淘口令复制以下红色内容,再打开手淘即可购买

范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/hODiFQYpxT
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4273
 
809 次点击