萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從報錯 Got fatal error 1236:主庫 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.'

SHOW SLAVE STATUS\G 顯示:

  • Master_Log_File: mysql-bin.003583
  • Read_Master_Log_Pos: 45997491(遠大於文件實際大小)
  • Slave_IO_Running: No

根因定位

  1. 從庫請求的 Position (45997491) 超過主庫該 Binlog 文件實際大小(僅 4 字節)。
  2. 主庫 mysql-bin.003583 文件**已損壞或被截斷**導致實際大小遠小於從庫記錄的位置。
  3. 驗證:主庫執行 mysqlbinlog /var/lib/mysql/mysql-bin.003583 報錯 Error in Log_event::read_log_event(): 'read error',確認文件損壞。

修復策略對比

方案適用場景數據風險操作複雜度
全量重建所有從庫數據極其敏感、可接受停機窗口零丟失高(需鎖表/熱備份/導入)
跳過損壞 Binlog,指向下一個文件 + 關鍵表同步校驗業務允許短暫不一致、有 pt-table-sync 工具極低(僅損壞 Binlog 區間的增量)中
主庫重置 Binlog(RESET MASTER)+ 全量重建主庫 Binlog 大面積損壞、無從庫可用零丟失(若有備份)高

方案二實戰步驟(推薦:快速恢復同步)

  1. 在**所有從庫**執行:
    STOP SLAVE;
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.003584', MASTER_LOG_POS=4;  -- 指向下一個 Binlog 文件開頭
    START SLAVE;
    SHOW SLAVE STATUS\G  -- 確認 Slave_IO_Running: Yes, Slave_SQL_Running: Yes
    
  2. 主庫檢查:SHOW BINARY LOGS; 確認 mysql-bin.003584 存在且正常。
  3. 關鍵業務表數據一致性校驗與修復:
    # 安裝 Percona Toolkit
    apt-get install percona-toolkit  # 或 yum install percona-toolkit
    
    # 校驗指定表
    pt-table-checksum h=master_ip,u=repl,p=pass --databases=db1 --tables=t1,t2
    
    # 修復不一致
    pt-table-sync --execute h=master_ip,u=repl,p=pass --databases=db1 --tables=t1,t2
    
  4. 非關鍵表(日誌、緩存、統計)可暫不修復,接受短暫漂移。

為什麼指定 MASTER_LOG_POS=4?

  • Binlog 文件頭固定 4 字節魔數 0xfe 0x62 0x69 0x6e("fe bin"),Position 4 即為第一個事件起始位置。
  • POS=0 或 4 效果等價,均表示從文件開頭開始讀取。

預防措施

  • 主庫磁盤監控告警(剩餘 < 20% 觸發),防止磁盤滿導致 Binlog 寫入截斷。
  • 設置 sync_binlog=1、innodb_flush_log_at_trx_commit=1 保證 Binlog 與 Redo Log 持久化一致性。
  • 定期 mysqlbinlog 校驗 Binlog 完整性:mysqlbinlog mysql-bin.000001 >/dev/null && echo OK。
  • 啟用 GTID 模式(5.6+),故障切換時自動定位位置,無需手動指定 File/Pos。
  • 部署多從庫、跨機房從庫,單點故障不影響整體可用性。

總結

Error 1236 核心是**主庫 Binlog 文件損壞導致從庫請求位置越界**。最快恢復路徑:從庫跳過損壞文件指向下一個 Binlog + 關鍵表 pt-table-sync 修復。根治需夯實存儲可靠性、監控告警、GTID 架構升級與定期演練。

copyright © 萬盛學電腦網 all rights reserved