Linux

MySQL 複製:將從屬移動到另一個從屬的從屬,沒有任何(或最少可能的)停機時間

  • January 22, 2012

我有以下設置:

M1 = 主機 1

S1 = 從機 1

S2 = 從機 2

S3 = 從機 3

所有從站都直接從 M1 複製。我想移動 S2 和 S3 成為 S1 的奴隸。

我不確定如何在沒有任何停機時間的情況下執行此操作,並且複制從中斷的地方開始。如何確保從屬伺服器從新主伺服器的日誌中的正確位置繼續,而不會失去任何寫入或嘗試重複他們在更改之前已經完成的寫入。

其中一個奴隸在一個相對較慢的連接上的異地位置,它是一個相當大的數據庫,所以從轉儲重建奴隸或複制數據文件會花費太長時間,在我看來似乎沒有必要!

非常感謝任何幫助或建議!

西蒙

警告:請仔細閱讀,確保您理解並信任它

開始了 :

步驟 01)獲取 S1 的私有 IP 地址(在某處寫下)

$ ip addr show

步驟 02) 從 S1 獲取用於複製的使用者名和密碼

cd /var/lib/mysql
cat master.info

使用者名和密碼在此文件中為純文字

步驟 03) 在 S1 上執行

mysql> GRANT REPLICATION SLAVE ON *.* TO '<username from Step 02>'@'%' IDENTIFIED BY '<password from Step 02>';

步驟 04) 在 S1 上,將其添加到 /etc/my.cnf

[mysqld]
log-slave-updates
log-bin=mysql-bin

步驟 05) 在 S1 上,執行這個

service mysql restart

這會在 S1 上創建二進制日誌

步驟 06) 在 M1 上,在命令行上執行它

$ mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);" &
$ sleep 15
$ mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'

這將使法師處於假死狀態。Master上的二進制日誌位置將停止移動。這將使所有的 Slave 有機會在 Replication 的同一個地方停下來。最後一行將回顯持有讀鎖的 MySQL ProcessID。不要失去這個號碼!

步驟 07) 在 S1 上執行

mysql> RESET MASTER; SHOW MASTER STATUS;

這將清除 S1 上的所有二進制日誌,並顯示 S1 的二進制日誌和位置。應該呼叫日誌文件mysql-bin.000001。該位置將根據 MySQL 的版本而有所不同。對於 MySQL 5.5,它是 107。對於 MySQL 5.1,它是 106。對於 MySQL 5.1 之前的任何版本,它是 98。

步驟 08) 在 S2 和 S3 上執行

mysql> STOP SLAVE;

步驟 09) 在 M1 上,執行以下命令:

mysql> KILL <ProcessID From Step 06>;

這將釋放所有待處理的 INSERT、UPDATE 和 DELETE。

步驟 10) 在 S2 和 S3 上執行它

mysql> CHANGE MASTER TO
MASTER_HOST='<ip address of S1 from Step 01>',
MASTER_PORT=3306,
MASTER_USER='<username from Step 02>',
MASTER_PASSWORD='<password from Step 02>',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

請記住,使用者MASTER_LOG_POS=106是 MySQL 5.1 或MASTER_LOG_POS=98MySQL 5.0 及之後的使用者。

這將使 S2 和 S3 的複制從 S1 開始。

步驟 11) 在 S2 上執行

mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G

這將啟動複製,暫停 5 秒,並顯示從屬狀態。如果Slave_IO_Running=YesSlave_SQL_Running=Yes,一切順利。

步驟 12) 對 S3 重複步驟 11

就是這樣。

警告

停機時間從步驟 06 開始,到步驟 09 結束

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