我們的備份伺服器上運行著一個 mysql 複製客戶端。自從上週停電以來,它就停止了複製。在此之前,它已經不間斷地運作了幾個月。
我嘗試重新啟動主站和從站,但這沒有幫助。我可以從從屬伺服器存取主伺服器,因此網路不是問題。
我還能做些什麼來嘗試診斷問題所在嗎?
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000060
Read_Master_Log_Pos: 46277494
Relay_Log_File: mysqld-relay-bin.000348
Relay_Log_Pos: 98
Relay_Master_Log_File: mysql-bin.000060
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 46277494
Relay_Log_Space: 98
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000069
Position: 851796
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified
更新:錯誤進入 daemon.log,而不是 mysql.err,這可以解釋為什麼我找不到它們。問題似乎是主站說日誌不可用,這沒有多大意義,因為該日誌(以及前一個日誌)在主站上仍然可用。
090710 9:17:35 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000060' at position 46277494, relay log './mysqld-relay-bin.000350' position: 98
090710 9:17:35 [Note] Slave I/O thread: connected to master 'username@master:3306', replication started in log 'mysql-bin.000060' at position 46277494
090710 9:17:35 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
090710 9:17:35 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
090710 9:17:35 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000060', position 46277494
答案1
歡迎來到 MySQL 複製的奇妙世界。我自己沒有遇到你的特定問題,但我遇到了很多其他奇怪的問題,最接近的解決方案是從主伺服器重新同步,就好像它是一個全新的從伺服器一樣,然後就可以完成它了。
答案2
您應該檢查從站的錯誤日誌 - 它通常非常明確地說明問題所在。
你應該將 mysql 錯誤日誌綁定到你的監控系統中,否則你的從站可能毫無價值。
此外,您應該有一個檢查從站狀態的監視器。
為了有任何用處,您還需要不時檢查從站的同步,也許可以使用 mk-table-checksum 之類的東西;理想情況下,也將其結果與您的監控系統連結起來。
答案3
許多人設定了skip-slave-start,這樣如果從屬設備在啟動之前停止複製,他們可以確保一切正常。嘗試執行“start Slave”並查看是否有任何變化或是否記錄了某些內容。另外,奇怪的是 SlaveSQL 進程正在運行而 SlaveIO 沒有運行。儘管從屬設備上的本地中繼日誌可能已損壞應該在日誌中報告。您可以嘗試關閉 Mysql,然後刪除中繼日誌。
答案4
從上面的報告中我發現了這個問題,這個欄位必須設定為(Slave_IO_Running):是,但是在上面的報告中它顯示Slave_IO_Running:否。
這就是導致問題的原因,如果該變數讀取“否”,則導致 IO 執行緒停止。所以不再有複製。您必須檢查 Last_SQL_Errno 和 Last_SQL_Err 以取得更多有關原因的資訊。錯誤編號 0 和空字串訊息表示「沒有錯誤」。 Last_SQL_Error 出現在從站的錯誤日誌中。
若要解決此問題,請停止從屬伺服器
然後設定:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
這告訴從屬伺服器跳過一個查詢(這是導致複製停止的無效查詢)。如果您想跳過兩個查詢,可以使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2;相反等等。
然後重新啟動從站並檢查日誌,希望這能解決問題...