Mysql

即使 binlog_format=STATEMENT,mysql 也會發出 BINLOG 行

  • November 14, 2012

我們安裝了 MySQL 5.5,我們有 binlog_format=STATEMENT (預設)

根據MySQL 文件,二進制日誌應該只包含 SQL 語句,但我們仍然在我們的二進制日誌中看到 BINLOG 行,作為每個二進制日誌中的第一條語句。

這是為什麼?

每當 mysql 寫入二進制日誌時,它必須對所有操作進行編碼。

每個二進制日誌的頭部都有一個 base64 常量:0xfe 0x62 0x69 0x6e。這被稱為 binlog 幻數

該值log_event.h在 mysql 原始碼中註冊。

其他事件也編碼在log_event.h

enum Log_event_type
{
 UNKNOWN_EVENT= 0, START_EVENT_V3= 1, QUERY_EVENT= 2, STOP_EVENT= 3,
 ROTATE_EVENT= 4, INTVAR_EVENT= 5, LOAD_EVENT= 6, SLAVE_EVENT= 7,
 CREATE_FILE_EVENT= 8, APPEND_BLOCK_EVENT= 9, EXEC_LOAD_EVENT= 10,
 DELETE_FILE_EVENT= 11, NEW_LOAD_EVENT= 12, RAND_EVENT= 13,
 USER_VAR_EVENT= 14, FORMAT_DESCRIPTION_EVENT= 15, XID_EVENT= 16,
 BEGIN_LOAD_QUERY_EVENT= 17, EXECUTE_LOAD_QUERY_EVENT= 18,
 TABLE_MAP_EVENT = 19, PRE_GA_WRITE_ROWS_EVENT = 20,
 PRE_GA_UPDATE_ROWS_EVENT = 21, PRE_GA_DELETE_ROWS_EVENT = 22,
 WRITE_ROWS_EVENT = 23, UPDATE_ROWS_EVENT = 24,
 DELETE_ROWS_EVENT = 25, INCIDENT_EVENT= 26,
 HEARTBEAT_LOG_EVENT= 27,
 ENUM_END_EVENT /* end marker */
};

每當mysqlbinlog轉儲二進制日誌的內容時,它必須查看這些事件編號,尤其是 binlog 幻數。如果缺少此值,則很快就會顯示以下內容之一:

  • 該文件不是二進制日誌
  • 二進制日誌嚴重損壞

如果 mysqlbinlog 轉儲表達式 BINLOG,它正在讀取的文件可以被認為是二進制日誌,因為它在解析文件時遇到了 binlog 幻數。

有關這方面的更多資訊:請參閱MySQL Internals on Binary Logs

引用自:https://dba.stackexchange.com/questions/9736