最近遇到在 MySQL Replication 的時候遇到 Master / Slave 之間出現錯誤訊息
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
Error 1236 通常是出現在 binlog 的同步出現異常
Could not find first log file name in binary log index file 這個問題訊息告知在讀 binlog 的時候找不到對應的 binlog 檔案
Troubleshooting:
先確認 Master 和 Slave 的 binlog
- Master
#Master $ mysql -uroot -p mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 7182 | | | +------------------+----------+--------------+------------------+
由此確認 master binlog 的檔案為 mysql-bin.000001,在進行確認 slave
- Slave
#Slave $ mysql -uroot -p mysql> show slave status \G; *************************** 1. row *************************** Master_Log_File: mysql-bin.000012 Relay_Master_Log_File: mysql-bin.000012
找到 Master_Log_File 和 Relay_Master_Log_file 這兩項,發現 Master 和 Slave 的 binlog 竟不相同,所以導致 Slave 在向 Master 要求 binlog 的時候出現了找不到 mysql-bin.000012 這個檔案
針對這個狀況發生的可能性是 Master 進行 rebuild 過,造成 Slave 對應不上,由於 binlog 重建後也可能已經完全無法對應起來
你必須調整你的 Slave,使其和 Master 一致,若遇到這個狀況請直接重建 Slave Replication
驗證 Master / Slave binlog
要驗證 binlog 主要在於幾個關鍵的數值
- Slave
mysql> show slave status; Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 3044582 Relay_Log_File: Database2-relay-bin-gcshop.000017 Relay_Log_Pos: 85909 Relay_Master_Log_File: mysql-bin.000001 Exec_Master_Log_Pos: 3044582
- Master_Log_File: 讀取 Master binlog 的檔案,和 Master binlog filename 一致
- Read_Master_Log_Pos: 讀取 Master binlog 最後一筆的 end_log_pos 值 (也可以說他是 binlog 的 id 啦)
- Relay_Log_File: Slave 自己的 binlog,可以用於 Replication 其他台 sub slave 使用
- Relay_Log_Pos: 同 Relay_Log_File 是屬於 Slave 自己的 end_log_pos,可以用於 Replication 其他台 sub slave 使用
- Relay_Master_Log_File: 準備讀取的 Master binlog 檔案,通常和 Master_Log_File 相同,但有可能因為 Master_Log_File超過檔案限制寫第二個檔案而改變。
- Exec_Master_Log_Pos: 已寫入的 Master end_log_pos 值
有了以上這些就可以到 Master binlog 去驗證了
- Master
#Master mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 3044582 | | | +------------------+----------+--------------+------------------+
File 必須和 Relay_Master_Log_File 一致 (通常也和 Master_Log_File 相同)
Position 和 Read_Master_Log_Pos,Exec_Master_Log_Pos 對應
如果要看的更詳細,也可以到 binlog 去查看每一筆的執行記錄
$ mysqlbinlog /var/lib/mysql/mysql-bin-000002 | less +G
解析 binlog
binlog 可以從 資料表 或是 實體檔案 查看
- 資料表
mysql> show binlog events \G;
- 實體檔案
由於 binlog 實體檔案是二進制的文件,所以必須使用 mysqlbinlog 來查看
# at 133046 #160508 0:55:02 server id 1 end_log_pos 3271514 Query thread_id=93929 exec_time=0 error_code=0 SET TIMESTAMP=1462640102/*!*/; BEGIN /*!*/;
- at 133046:本身資料庫的 end_log_pos id (範例以 Slave binlog)
- 160508 0:55:02:代表時間 2016年05月08日 0:55:02
- server id:在這個 Replication 中 Master 的 server id = 1
- end_log_pos:Master 的 Position
- Query:執行的動作類型
- thread_id:這有關 mysql thread 執行序
- exec_time:執行時間
- error_code:錯誤代碼,0 為沒有錯誤