MySQL Binlog 事件介紹篇

發表於2017-11-22

前言
上一篇檔案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版本中使用;

btest.sql內容如下:

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

相關文章