MySQL 二進制日誌記錄了資料庫所有的數據變更操作,是實現時間點恢復、主從複製及審計追蹤的核心基礎。由於二進制日誌為非文本格式,直接閱讀不可行,必須使用工具提取為可讀的 SQL 語句。本文將系統介紹 mysqlbinlog 命令行工具與 SHOW BINLOG EVENTS 語句的使用方法,並提供豐富的實戰範例,幫助您高效提取、分析與應用 Binlog。
SHOW BINLOG EVENTS 在 MySQL 客戶端直接檢視事件,適合快速定位、少量審計。mysqlbinlog 將二進制文件解析為 SQL 文本,支援按位置、時間、遠程讀取等多維度篩選,適合大量導出、腳本自動化、異地備份。mysql> SHOW VARIABLES LIKE 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.6.12-log | +---------------+------------+ mysql> SHOW BINARY LOGS; +-----------------+-----------+ | Log_name | File_size | +-----------------+-----------+ | APP01bin.000001 | 120 | +-----------------+-----------+
插入測試數據、切割日誌後,執行 SHOW BINLOG EVENTS 可見完整事件流:
mysql> USE replication; mysql> SELECT * FROM tb; +------+-------+ | id | val | +------+-------+ | 1 | robin | +------+-------+ mysql> INSERT INTO tb VALUES(2,'jack'); mysql> FLUSH LOGS; -- 產生新 Binlog 文件 mysql> INSERT INTO tb VALUES(3,'fred'); mysql> SHOW BINARY LOGS; +-----------------+-----------+ | Log_name | File_size | +-----------------+-----------+ | APP01bin.000001 | 409 | | APP01bin.000002 | 363 | +-----------------+-----------+ mysql> SHOW BINLOG EVENTS; +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+ | APP01bin.000001 | 4 | Format_desc | 11 | 120 | Server ver: 5.6.12-log, Binlog ver: 4 | | APP01bin.000001 | 120 | Query | 11 | 213 | BEGIN | | APP01bin.000001 | 213 | Query | 11 | 332 | use `replication`; insert into tb values(2,'jack') | | APP01bin.000001 | 332 | Xid | 11 | 363 | COMMIT /* xid=382 */ | | APP01bin.000001 | 363 | Rotate | 11 | 409 | APP01bin.000002;pos=4 | +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
解讀: 第 3 行顯示實際執行的 SQL,第 4 行為隱式提交的 XID 事件,最後一行 Rotate 事件指向下一個 Binlog 文件起始位置。
SHOW BINLOG EVENTS IN 'APP01bin.000002'; — 僅顯示指定文件事件。SHOW MASTER STATUS\G — 獲取當前正在寫入的 Binlog 文件名與位置。SHOW BINLOG EVENTS FROM 213; — 從指定位置(跨文件)開始顯示。mysqlbinlog 支援本地文件與遠程服務器讀取,輸出可直接管道導入 MySQL 或壓縮存檔。
| 參數 | 說明 |
|---|---|
--start-position=N | 起始位置(配合 --stop-position) |
--start-datetime="YYYY-MM-DD HH:MM:SS" | 起始時間 |
--stop-datetime="..." | 結束時間 |
--database=db_name | 僅提取指定資料庫相關事件 |
--set-charset=utf8 | 輸出字符集轉換 |
--read-from-remote-server | 從遠程 Master 讀取 Binlog |
-v, -vv | 詳細模式(-vv 解析 Row 格式為 SQL) |
--result-file=file.sql | 直接寫入文件 |
# 1. 提取單個 Binlog 文件並過濾 INSERT mysqlbinlog /opt/data/APP01bin.000001 | grep insert # 2. 按位置範圍提取 mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 # 3. 按位置提取並壓縮存檔 mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | gzip > extra_01.sql.gz # 4. 按位置提取並直接導入資料庫 mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | mysql -uroot -p # 5. 按開始時間提取並輸出文件 mysqlbinlog --start-datetime="2014-12-15 20:15:23" /opt/data/APP01bin.000002 --result-file=extra02.sql # 6. 合併提取多個 Binlog 文件 mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 | more # 7. 指定資料庫並轉換字符集 mysqlbinlog --database=test --set-charset=utf8 /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 > test.sql # 8. 遠程讀取並指定結束時間 mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --stop-datetime="2014-12-15 20:30:23" --read-from-remote-server mysql-bin.000033 | more # 9. 遠程讀取 Row 格式並詳細解析輸出本地 mysqlbinlog -urobin -p -P3606 -h192.168.1.177 --read-from-remote-server -vv inst3606bin.000005 > row.sql
-d, --database=name 僅處理指定資料庫 -f, --force-read 強制讀取未知事件 -h, --host=name 遠程主機 -p, --password[=name] 密碼 -P, --port=# 端口 -R, --read-from-remote-server 從遠程 Master 讀取 -r, --result-file=name 輸出文件 -s, --short-form 簡短格式(省略註釋) --start-datetime=name 起始時間 --stop-datetime=name 結束時間 -j, --start-position=# 起始位置 --server-id=# 服務器 ID(遠程讀取需指定) --set-charset=name 輸出字符集 -D, --disable-log-bin 禁用輸出中的 SQL_LOG_BIN -u, --user=name 用戶名 -v, --verbose 詳細模式(Row 格式需 -vv) -V, --version 版本信息
--start-datetime 做增量備份腳本。--read-from-remote-server 將 Binlog 實時拉取至分析平台。-vv 才能看到實際行變更的偽 SQL。掌握 Binlog 提取技術,是 DBA 實現高可用、數據安全與合規審計的關鍵技能。建議在測試環境充分演練各類參數組合,建立標準化操作手冊。