診斷 Mysql 複製問題

診斷 Mysql 複製問題

我們的備份伺服器上運行著一個 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;相反等等。

然後重新啟動從站並檢查日誌,希望這能解決問題...

相關內容