首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 主從複寫中變更 Master IP 完整操作手冊:零停機遷移實戰

     編輯:MySQL 資料庫相關知識

業務背景

公司所有伺服器遷移至同一機房,開通內網連線。需將多台 Slave 的 Master 連線從公網 IP 切換至內網 IP,**要求業務零感知、資料零丟失**。

核心原理

MySQL 複寫元資料儲存在 Slave 的 master.info 檔案 (或 `mysql.slave_master_info` 表,MySQL 5.6+)。直接修改此檔案/表中的 `Master_Host` 欄位,配合 `SKIP_SLAVE_START` 啟動,即可無縫切換。

標準操作流程 (MySQL 5.6+ 使用表儲存元資料)

步驟 1:停止 Slave 並備份元資料

# 1. 停止複寫執行緒
mysql> STOP SLAVE;

# 2. 備份 master.info (舊版檔案式) 或查詢 slave_master_info 表 (新版)
# 檔案式 (MySQL 5.5 及之前)
cp /var/lib/mysql/master.info /var/lib/mysql/master.info.bak.$(date +%F)

# 表式 (MySQL 5.6+)
SELECT * FROM mysql.slave_master_info \G
# 記錄下 Master_Host, Master_User, Master_Port, Master_Log_File, Read_Master_Log_Pos 等關鍵欄位

步驟 2:修改 Master Host (兩種方式)

方式 A:使用 CHANGE MASTER TO (推薦、安全、無需重啟)

mysql> CHANGE MASTER TO MASTER_HOST='new_internal_ip';
# 僅修改 Host,其他參數 (User, Password, Log_File, Log_Pos) 保持不變

方式 B:直接更新 slave_master_info 表 (需重啟生效,謹慎操作)

# 1. 以 --skip-slave-start 啟動 MySQL (防止 Slave 自動啟動)
systemctl stop mysqld
systemctl start mysqld --skip-slave-start
# 或臨時修改 my.cnf: skip_slave_start=1 後重啟

# 2. 登入更新
mysql> UPDATE mysql.slave_master_info SET Master_Host='new_internal_ip' WHERE Master_Host='old_public_ip';
# 3. 重啟 MySQL 移除 skip_slave_start
systemctl restart mysqld
✅ 強烈建議使用方式 A (CHANGE MASTER TO):無需重啟、自動保留位置、官方支援、可審計。方式 B 僅供極特殊情況 (如密碼加密導致 CHANGE MASTER TO 無法使用) 參考。

步驟 3:驗證並啟動複寫

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS \G

確認關鍵輸出:

Master_Host: new_internal_ip
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Master_SSL_Allowed: Yes (若原本啟用 SSL)

進階場景:同時變更 IP、Port、User、Password

mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
    MASTER_HOST='10.0.1.50',
    MASTER_PORT=3306,
    MASTER_USER='repl_user_new',
    MASTER_PASSWORD='NewStrongPass123!',
    MASTER_SSL=1,
    MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem',
    MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem',
    MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
mysql> START SLAVE;

GTID 模式下的特殊處理 (MySQL 5.6+)

若啟用 GTID (`gtid_mode=ON`),**不需指定 MASTER_LOG_FILE/POS**,MySQL 會自動基於 GTID 定位:

mysql> CHANGE MASTER TO
    MASTER_HOST='new_internal_ip',
    MASTER_AUTO_POSITION=1;  -- 關鍵:啟用 GTID 自動定位

驗證清單 (切換後必檢)

檢查項目命令預期結果
IO 執行緒狀態SHOW SLAVE STATUS \GSlave_IO_Running: Yes
SQL 執行緒狀態SHOW SLAVE STATUS \GSlave_SQL_Running: Yes
延遲秒數Seconds_Behind_Master0 或 極小值
新 Master 連線Master_Host顯示新內網 IP
錯誤日誌tail -f /var/log/mysql/error.log無新錯誤
應用端讀寫業務驗證讀從庫正常、寫主庫正常

回滾方案 (切換失敗時)

# 1. 立即停止 Slave
mysql> STOP SLAVE;

# 2. 恢復原 Master Host
mysql> CHANGE MASTER TO MASTER_HOST='old_public_ip';

# 3. 重新啟動
mysql> START SLAVE;

# 4. 驗證恢復正常
mysql> SHOW SLAVE STATUS \G

自動化腳本範例 (Bash + MySQL Client)

#!/bin/bash
# 用法: ./change_master_ip.sh   [mysql_user] [mysql_pass]

SLAVE_HOST=$1
NEW_MASTER_IP=$2
MYSQL_USER=${3:-root}
MYSQL_PASS=${4:-}

echo "[$(date)] 開始切換 $SLAVE_HOST Master IP 至 $NEW_MASTER_IP"

ssh $SLAVE_HOST "
    mysql -u$MYSQL_USER -p$MYSQL_PASS -e \"STOP SLAVE;\"
    mysql -u$MYSQL_USER -p$MYSQL_PASS -e \"CHANGE MASTER TO MASTER_HOST='$NEW_MASTER_IP';\"
    mysql -u$MYSQL_USER -p$MYSQL_PASS -e \"START SLAVE;\"
    sleep 3
    mysql -u$MYSQL_USER -p$MYSQL_PASS -e \"SHOW SLAVE STATUS \G\"
"

echo "[$(date)] 切換完成,請人工確認 Slave_IO_Running=Yes, Slave_SQL_Running=Yes"

最佳實踐總結

  1. 優先使用 CHANGE MASTER TO:官方標準、無需重啟、保留複寫位置
  2. 操作前必備份:master.info / slave_master_info 截圖或匯出
  3. GTID 模式加 MASTER_AUTO_POSITION=1:自動定位,無需手動找位置
  4. SSL 憑證路徑不可變:確保新 Master 同樣部署 SSL、CA 一致
  5. 切換後觀察 30 分鐘:確認 Seconds_Behind_Master 穩定在 0
  6. 納入變更管理流程:記錄變更單、審批、驗證、回滾預案

掌握此流程,即可在機房遷移、雲端上云、災難演練等場景中,安全、快速完成 MySQL 複寫 Master IP 變更,保障資料同步連續性與業務零中斷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved