MySQL 複製:將從屬移動到另一個從屬的從屬,沒有任何(或最少可能的)停機時間
我有以下設置:
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=98
MySQL 5.0 及之後的使用者。這將使 S2 和 S3 的複制從 S1 開始。
步驟 11) 在 S2 上執行
mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G
這將啟動複製,暫停 5 秒,並顯示從屬狀態。如果
Slave_IO_Running=Yes
和Slave_SQL_Running=Yes
,一切順利。步驟 12) 對 S3 重複步驟 11
就是這樣。
警告
停機時間從步驟 06 開始,到步驟 09 結束