MySQL 主從複制遇到 Error 1236 通常意味著二進制日誌損壞或位置異常。本文記錄一次 Master 端 Binlog 損壞的完整排查與修復過程,提供可落地的操作指南。
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log:
Client requested master to start replication from impossible position
the first event 'mysql-bin.003583' at 45997491,
the last event read from './mysql-bin.003583' at 4,
the last byte read from './mysql-bin.003583' at 4
關鍵信號:impossible position、first event ... at 45997491 與 last event ... at 4 位置倒掛,表明 Binlog 文件內部結構已損壞。
mysql> SHOW SLAVE STATUS\G
Master_Log_File: mysql-bin.003583
Read_Master_Log_Pos: 45997491
Relay_Master_Log_File: mysql-bin.003361
Slave_IO_Running: No
Slave_SQL_Running: Yes
Slave 試圖從 mysql-bin.003583 的 45997491 位置讀取,但該文件實際大小僅 4 字節,明顯不匹配。
/var/lib/mysql/mysql-bin.003583 不存在 → 排除 Slave Binlog 損壞。mysqlbinlog /var/lib/mysql/mysql-bin.003583 報錯 Error in Log_event::read_log_event() → 確認為 Master Binlog 損壞。| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 全量重搭所有 Slave | 數據零風險,最乾淨 | 耗時長,大數據量下業務停機久 | 數據量小、可接受停機窗口 |
| 跳過損壞 Binlog + 同步關鍵表 | 快速恢復複制鏈路,業務幾無感知 | 跳過區間數據可能不一致,需事後校驗修復 | 核心表可識別、容忍短暫不一致 |
STOP SLAVE;CHANGE MASTER TO
MASTER_LOG_FILE = 'mysql-bin.003584',
MASTER_LOG_POS = 4; -- 或 0,均指向文件開頭
START SLAVE;SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes。pt-table-sync(Percona Toolkit)對核心業務表做單向同步:
pt-table-sync --execute h=MasterIP,u=sync_user,p=xxx,h=SlaveIP,u=sync_user,p=xxx --databases db_name --tables core_table
sync_binlog=1 確保每次事務提交刷盤,減少崩潰導致的 Binlog 截斷。binlog_expire_logs_seconds 定期清理舊日誌,避免磁盤滿導致寫入中斷。Seconds_Behind_Master、Slave_IO_Running 異常即時通知。pt-table-checksum + pt-table-sync 全量一致性校驗。Master Binlog 損壞屬於較罕見但影響面極大的故障。掌握「跳過損壞段 + 關鍵表同步」的組合拳,能在最小化業務影響的前提下快速恢復複制鏈路。