從奴隸獲取錯過的交易
我正在嘗試編寫災難恢復計劃,我有 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 身份驗證。