在生產環境中,主從架構搭建通常需要停機維護,但對於 7×24 小時不間斷服務的業務(如遊戲、金融系統),停機不可接受。本文實測並記錄在 MySQL 5.1 環境下,使用 Percona XtraBackup 實現「不停機、不鎖表」熱備,並在線新增從庫的完整操作流程。
| 角色 | IP 地址 | 說明 |
|---|---|---|
| 主庫 | 192.168.1.101 | 正常讀寫,開啟 binlog |
| 現有從庫 | 192.168.1.102 | 已正常同步 |
| 新增從庫 | 192.168.1.103 | 待配置同步 |
login(表引擎為 InnoDB,否則 XtraBackup 仍會鎖表)xtrabackup(含 innobackupex 腳本)a 最終行數 5,418,272innobackupex 進行線上熱備,備份完成時自動記錄該時刻的 binlog file 與 position(存於 xtrabackup_binlog_info)。--apply-log 恢復資料一致性。--copy-back 還原備份資料。CHANGE MASTER TO 指向主庫,啟動同步。# 在主庫持續寫入時執行備份
innobackupex --user=root --password=kongzhong \
--defaults-file=/etc/my.cnf --port=3306 \
--database=login /tmp/backup/ > /tmp/backup/innoback.log 2>&1
備份完成後,查看位點資訊:
cat /tmp/backup/2014-02-22_07-43-36/xtrabackup_binlog_info
# 輸出範例: mysql-101-bin.000008 2423
cd /tmp/backup
tar zcvf login.tar.gz 2014-02-22_07-43-36
scp login.tar.gz 192.168.1.103:/tmp/
cd /tmp
tar -xf login.tar.gz
# 1. 應用 redo log,確保資料一致性
innobackupex --apply-log /tmp/2014-02-22_07-43-36/
# 2. 停止 MySQL
/etc/init.d/mysqld stop
# 3. 備份原資料目錄(建議只移動資料檔,保留原 log/ibdata 等)
mkdir -p /tmp/mysqlback
mv /var/lib/mysql/* /tmp/mysqlback/
# 4. 還原備份資料
innobackupex --copy-back /tmp/2014-02-22_07-43-36/
# 5. 修正權限並啟動
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysqld start
mysql> SELECT COUNT(*) FROM login.a;
+----------+
| count(*) |
+----------+
| 5418272 |
+----------+
行數與主庫一致,資料還原成功。
讀取備份目錄下的 xtrabackup_binlog_pos_innodb 獲取精確位點:
cat /var/lib/mysql/xtrabackup_binlog_pos_innodb
# 輸出: mysql-101-bin.000008 2423
在新從庫執行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='mysql-101-bin.000008',
MASTER_LOG_POS=2423;
START SLAVE;
SHOW SLAVE STATUS\G
確認 Slave_IO_Running: Yes 與 Slave_SQL_Running: Yes,主從同步建立完成。
若主庫負載極高,也可暫停現有從庫(STOP SLAVE),在從庫上執行 XtraBackup 備份,並記錄該從庫執行到的 Relay_Master_Log_File 與 Exec_Master_Log_Pos(即主庫對應位點),後續流程相同。此法可完全避開主庫備份開銷。
rsync 增量同步,縮短傳輸窗口。innobackupex --copy-back 會覆蓋目標目錄所有檔案,務必先備份原資料目錄。掌握此流程,即可在業務零停機前提下,靈活擴展 MySQL 讀取能力,滿足高可用架構演進需求。