從 MySQL 5.1 開始,二進制日誌支援 Row-based 格式。預設情況下直接查看 binlog 只能看到經過 Base64 編碼的內容,難以直接閱讀具體的數據變更。本文介紹如何使用 mysqlbinlog 工具配合參數解析 Row 格式日誌,清晰呈現每一行數據的具體修改內容。
直接執行 mysqlbinlog mysql-bin.001912 時,輸出包含大量 Base64 編碼的 BINLOG 區塊,僅能看到表映射信息(如 Table_map: `test`.`test1` mapped to number 96991),無法得知具體的 INSERT/UPDATE/DELETE 詳情。
-v 參數顯示註釋語句從 MySQL 5.1.28 起,mysqlbinlog 新增 --verbose(或 -v)參數。加單個 -v 會生成帶註釋的 SQL 語句;加雙 -v -v 還會顯示字段類型、長度、是否為 NULL 等屬性信息。
mysqlbinlog -v -v mysql-bin.001912
輸出中會出現類似以下的可讀語句:
### INSERT INTO test.test1
### SET
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
### @2='3' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
--base64-output=DECODE-ROWS 移除 Base64 區塊即使加了 -v,原始的 BINLOG Base64 區塊仍會輸出,干擾閱讀。加上 --base64-output=DECODE-ROWS 可僅保留解析後的 SQL 註釋,輸出更乾淨。
mysqlbinlog -v -v --base64-output=DECODE-ROWS mysql-bin.001912
此時輸出僅包含表映射、解析後的 SQL 及事務提交信息,適合直接分析或配合 grep 篩選特定表。
sudo mysqlbinlog -v -v --base64-output=DECODE-ROWS \
--start-datetime="2014-08-09 10:42:36" \
--stop-datetime="2014-08-10 10:42:36" \
mysql-bin.000005 | grep -A 65 "employee"
此命令可在指定時間窗口內,提取涉及 employee 表的所有行變更記錄。
--start-datetime/--stop-datetime 可精準定位時間段內的變更。掌握這兩個參數,即可高效排查 Row 格式 binlog 中的數據變更詳情。