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

2016-05-08 MySQL

最近遇到在 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 為沒有錯誤

 

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱