Mysql
即使 binlog_format=STATEMENT,mysql 也會發出 BINLOG 行
我們安裝了 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