Linux

MySQL 大師 - 大師破碎

  • December 20, 2012

我繼承了一個 Mysql 主主系統,我注意到第二個主系統(從現在開始稱它為從系統,因為它在“從”機器上執行)停止更新其數據庫。我看到了

掌握:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

奴隸:(我截斷了一個錯誤)

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '3' for key 'PRIMARY'' on [...]

考慮到我們不能在那裡複製,我不知道是什麼導致它處理。重要的是恢復正常運營;

現在我stop slave;在 Master 和stop slave;Slave 上,因為我看到如果我更改 Slave 上的記錄,更改會傳播到正在使用中的 Master。

我該如何:強制從主伺服器同步所有內容而不影響主伺服器上的數據?然後希望像往常一樣進行從站拾取複製?

更新 好的我嘗試刪除從屬上的所有表,然後它在那個錯誤部分抱怨“表”不存在。因此,我對 Master 進行了無數據轉儲,並確保在輔助(從屬)中只有空表。我start slave;在奴隸上,但現在它抱怨血腥的改變表語句,例如:

Last_Errno: 1060
Last_Error: Error 'Duplicate column name [...] Query: 'ALTER TABLE [...]

如何跳過壓裂更改語句我只想複製血腥數據並完成它,我的表已經有 FFS 的最新更改,現在它抱怨幾週前複製後所做的更改

如何重置日誌或其他內容?

傑出的 為什麼會開始發生這種情況?“次要”正在傳播到“主要”。“主要”不會傳播到“次要”。但是我嘗試做的任何修復都讓它處於相同的狀態 Yes-Yes Yes-No 和相同的 Last_Error。我想大約在那個時候伺服器從網路上取下來,這會以某種方式混淆 MySQL 嗎?

首先,您需要了解 MySQL 複製僅同步更改。清空表(或刪除它們)不會再次複製數據。您必須使用一組一致的數據文件啟動從站。

重新播種奴隸的粗略過程如下:(不要按照這些說明進行操作)

  1. 獲取一致的數據快照。
  2. 將快照複製到從站。
  3. 重新配置並啟動從站。

如果您不能容忍停機時間,那麼有兩種方法可以實現這一點。

  • 如果您的數據足夠小,您可以 mysqldump 包括數據在內的所有內容,那麼這些說明很好。如果您有多個數據庫,請確保您閱讀了這篇文章,因為我不會在這裡複製這些注意事項。但如果你只有 1 個數據庫,基本步驟是:

    1. 在主伺服器上,像這樣備份您的數據庫:mysqldump -u root -e -q --single-transaction --master-data database_name
    2. 將此備份導入您的從站。
    3. 查看備份文件的開頭以獲取主日誌名稱和位置。
    4. 在 mysql shell 中的從屬伺服器上,執行類似這樣的操作,但使用第 3 步中的資訊進行更新:START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
  • 如果您的數據庫對於 mysql 轉儲來說太大,那麼您將需要使用作業系統的捲快照功能對錶進行快照。這將使您的 MySQL 伺服器暫停幾秒鐘,因此最好在幾個小時後完成,因為它可能不會打擾任何人。

    1. 在 mysql shell 的 master 上,使用flush tables with write lock. 這將有效地暫停伺服器。
    2. 不要退出 mysql shell 否則你會失去你的鎖。
    3. 在另一個 OS shell 中,拍攝 mysql 數據卷的快照。
    4. 回到 mysql shell:SHOW MASTER STATUS獲取目前日誌位置,然後UNLOCK TABLES釋放鎖。伺服器現在已取消暫停。
    5. 訪問快照並將 mysql 數據文件複製到從站。
    6. 在 mysql shell 中的從屬伺服器上,執行類似這樣的命令,但使用步驟 #4 中的資訊進行更新:START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;

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