Mysql

損壞的從站(MySQL 複製)

  • October 22, 2011

昨晚,一位開發人員在主機上執行了錯誤的 mySQL 語句(查詢插入具有重複主鍵的行)。突然,複製到它的從屬伺服器停止了。從站開始將其寫入 mysql_relay_logs,在我們監控和修復它之前,磁碟空間不足。

Master 被配置為保存最近 3 天的 bin_logs,所以我們仍然沒有完全失去複製。現在有人可以幫我解決這個爛攤子。

我的大師狀態:

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000017
Position: 30844254
Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

從屬狀態:mysql

> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
            Slave_IO_State: 
               Master_Host: 192.168.140.110
               Master_User: replication_user
               Master_Port: 3306
             Connect_Retry: 60
           Master_Log_File: mysql-bin.000014
       Read_Master_Log_Pos: 61132382
            Relay_Log_File: mysqld-relay-bin.000037
             Relay_Log_Pos: 1405976
     Relay_Master_Log_File: mysql-bin.000014
          Slave_IO_Running: No
         Slave_SQL_Running: No
           Replicate_Do_DB: 
       Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
   Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 1062
                Last_Error: Error 'Duplicate entry '13676-1-2' for key 1' on query. Default database: 'XXX'. Query: 'YYY'
              Skip_Counter: 0
       Exec_Master_Log_Pos: 1405839
           Relay_Log_Space: 8974037551
           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)

有人可以給我確切的命令以使一切恢復正常嗎?正如我所說,我確信我們已經失去了從伺服器上的數據,因為它用完了磁碟,但我們必須在主伺服器上有數據。

我的下一個問題是:如何確保這種情況不再發生。

非常感謝 Sparsh Gupta

直接的做法是清除從伺服器上的數據,並從主伺服器的新副本重新開始。可以使用 mysqldump 或通過 rsync 之類的東西複製 master。根據您的數據庫有多大,您可能會遇到停機時間。這將始終有效。

如果您從從驅動器上清除空間,則有可能通過使用(從 mysql 內部)從發生錯誤的位置開始複製:

start slave

如果 master 的 bin.log 文件就位,則複製有可能立即啟動。我沒有太多的經驗發生這種情況。

我最後一次這樣做是當開發人員向數據庫添加一個新表時,並沒有先在從屬伺服器上創建它。我創建了表,並且不得不使用 sql_slave_skip_counter 來跳過 bin.log 中失去的位。然後我手動插入了我跳過的 20 行數據。

引用自:https://serverfault.com/questions/323858