mysqlbinlog 是 MySQL 自帶的二進制日志解析工具,將二進制 Binlog 轉為可讀 SQL 或文本,是**數據恢復、主從同步排查、審計分析**的核心利器。
| 參數 | 作用 | 典型值/示例 |
|---|---|---|
--start-datetime | 起始時間點 | "2024-01-15 10:00:00" |
--stop-datetime | 結束時間點 | "2024-01-15 12:00:00" |
--start-position | 起始位置點 | 12345 |
--stop-position | 結束位置點 | 67890 |
--database | 只解析指定庫 | -d mydb |
--base64-output | 行事件編碼輸出 | DECODE-ROWS / AUTO |
--verbose / -v | 解析 Row 格式為可讀 SQL | -vv 更詳細 |
--no-defaults | 忽略配置文件 | 避免編碼衝突 |
--result-file | 輸出重定向到文件 | -r /tmp/binlog.sql |
# 1. 找到全備位置 mysqlbinlog --stop-datetime="2024-01-15 09:59:59" /var/lib/mysql/binlog.000012 > /tmp/recover.sql # 2. 從全備恢復 mysql -uroot -p < /tmp/full_backup.sql # 3. 重放誤操作前的增量 mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 10:05:00" \ /var/lib/mysql/binlog.000012 | mysql -uroot -p
mysqlbinlog -vv --base64-output=DECODE-ROWS /var/lib/mysql/binlog.000012 \ | grep -i -e "delete from" -e "drop table" -e "truncate" \ | head -20
# Master 端 SHOW MASTER STATUS; -- 獲取 File, Position # Slave 端 SHOW SLAVE STATUS\G -- 獲取 Relay_Master_Log_File, Exec_Master_Log_Pos # 對比位置,並在 Master 用 mysqlbinlog 解析該位置附近事件 mysqlbinlog --start-position=12345 /var/lib/mysql/binlog.000012 -vv
# 1. 導出單表 Binlog 片段 mysqlbinlog --database=mydb --start-position=... --stop-position=... binlog.xxx -vv > table_ops.sql # 2. 手工提取目標表 DML,構建反向 SQL(DELETE→INSERT, UPDATE 交換新舊值) # 3. 在維護窗口執行反向 SQL
split 分割。GTID 模式:--include-gtids / --exclude-gtids 精確控制事務範圍。--no-defaults --character-set-server=utf8mb4 避免中文亂碼。SUPER 或 BINLOG_ADMIN 權限讀取 Binlog 文件。| 格式 | 優點 | 缺點 | mysqlbinlog 解析 |
|---|---|---|---|
| STATEMENT | 文件小、易讀 | 非確定性函數導致主從不一致 | 直接可讀 SQL |
| ROW | 完全一致、安全 | 文件大、需 -vv 解析 | 需 -vv 還原 SQL |
| MIXED | 自動選擇、推薦 | 偶爾 STATEMENT 導致不一致 | 混合,需 -vv |
掌握 mysqlbinlog,手握數據時光機,從容應對誤操作、同步故障、合規審計。