Mysql

從奴隸獲取錯過的交易

  • September 6, 2013

我正在嘗試編寫災難恢復計劃,我有 1 個主(A)和 3 個從屬(B、C、D)的單向複製

    A 
   /|\
  / | \
 B  C  D

假設我的主伺服器崩潰了,我失去了該伺服器上的所有數據,我還有 3 個從伺服器,我將提升最新的作為我的新主伺服器,假設從 B 是最新的,C 和D 不是,此時我提升 B 來掌握我的奴隸有以下結果SHOW SLAVE STATUS\G

slaveB> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
     Relay_Master_Log_File: master-bin.000002
       Exec_Master_Log_Pos: 1476884

slaveC> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
     Relay_Master_Log_File: master-bin.000002
       Exec_Master_Log_Pos: 78684

slaveD> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
     Relay_Master_Log_File: master-bin.000001
       Exec_Master_Log_Pos: 746848

為了將B提升為master,我想在C和D上應用所有失去的事務,所以在B成為新的master並開始接收來自應用程序的查詢之前,我的所有slave都處於一致狀態,我怎樣才能找到來自 B 的二進制日誌上的 C 和 D 失去的事務(我--log-slave-updates在所有伺服器上啟用了該選項)。

對於遺留問題,環境使用 MySQL 5.0

你需要做的改變,我稱之為複制的參考點。

由於伺服器 B、C 和 D 已啟用二進制日誌,這將很方便。

你給了

slaveB> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
     Relay_Master_Log_File: master-bin.000002
       Exec_Master_Log_Pos: 1476884

slaveC> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
     Relay_Master_Log_File: master-bin.000002
       Exec_Master_Log_Pos: 78684

讓我們將 ServerC 同步為 ServerB 的 Slave

步驟 01:停止對 ServerC 的所有寫入

STOP SLAVE;

步驟 02:在 ServerC 上,執行SHOW MASTER STATUS;

假設輸出是 master-bin.000003 位置 12345678

步驟 03:在 ServerC 上,執行

mysqlbinlog master-bin.000003 > latest-binlog.sql

STEP 04 : 定位位置STEP 03並顯示前後 3 行

grep -C 3 12345678 latest-binlog.sql

假設時間戳是“2013-09-03 01:23:45”

STEP 05 : 在ServerB的二進制日誌中找到那個位置的時間戳

假設ServerB上的二進制日誌是master-bin.000004

STEP 06:在ServerB的二進制日誌master-bin.000004中轉儲位置匹配時間戳

SQLFILE=dumpstuff.sql
BINLOG="master-bin.000004"
DT2="2013-09-03 01:23:45"
DT1="2013-09-03 01:00:00"
mysqlbinlog --start-datetime="${DT1}" --stop-datetime="${DT2}" > ${SQLFILE}

STEP 07 : 定位裡面的時間戳SQLFILE,找到位置

假設位置是 87654321

步驟 08:將 SlaveC 連接到 SlaveB

在 SlaveC 上,執行這個

STOP SLAVE;
CHANGE MASTER TO master_log_file='master-bin.000004',master_log_pos=87654321;
START SLAVE;

而已 !!!

警告 #1

重複所有這些相同的步驟以將 ServerD 同步到 ServerB

注意事項 #2

如果您已經完成了這些步驟,但仍然不信任數據,請下載 Percona Tools 並使用pt-table-checksum來驗證每個 Slave 與新的 Master。如果存在差異,您可以執行pt-table-sync生成 SQL 來修復差異。

更新 2013-09-05 12:28 EDT

你剛剛發表了這條評論

在步驟 2,3 和 4 上,我無權訪問 master binlog,我猜想在 slaveC 上獲取最新應用事務的方法是從 slaveC 中繼日誌中提取它(使用顯示從屬狀態中的 Relay_Master_Log_File 和 Exec_Master_Log_Pos)。我對嗎?步驟 5 到 8 似乎是正確的。

您可以使用–read-from-remote-server遠端使用mysqlbinlog。此外,您不要回到舊的 Master,ServerA。你在 Slave 之間做這些事情,使 ServerB 成為新的 Master。如果您使用的是託管託管公司,則這些管理員需要參與此過程。至少,他們可以提供一些 SSH 隧道訪問權限,以允許您訪問 Linux 機器和所有必要的文件夾權限。不需要 MySQL 身份驗證。

引用自:https://dba.stackexchange.com/questions/48886