Site icon Mr. 沙先生

MySQL Replication 處理 Got fatal error 1236 from master & 驗證 binlog 資訊

最近遇到在 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
$ 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
$ 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 主要在於幾個關鍵的數值

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 binlog 去驗證了

 

#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
/*!*/;

 

Exit mobile version