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

MySQL 5.1 線上環境不停機添加從庫實戰:基於 XtraBackup 熱備方案

     編輯:MySQL 資料庫相關知識

在生產環境中,主從架構搭建通常需要停機維護,但對於 7×24 小時不間斷服務的業務(如遊戲、金融系統),停機不可接受。本文實測並記錄在 MySQL 5.1 環境下,使用 Percona XtraBackup 實現「不停機、不鎖表」熱備,並在線新增從庫的完整操作流程。

一、環境與前提條件

角色IP 地址說明
主庫192.168.1.101正常讀寫,開啟 binlog
現有從庫192.168.1.102已正常同步
新增從庫192.168.1.103待配置同步
  • MySQL 版本:5.1.61(不支援 GTID,需手動指定 binlog file + position)
  • OS:Red Hat Linux 6
  • 同步資料庫:login(表引擎為 InnoDB,否則 XtraBackup 仍會鎖表)
  • 已安裝 xtrabackup(含 innobackupex 腳本)
  • 假設場景:備份期間主庫持續寫入,表 a 最終行數 5,418,272

二、核心思路

  1. 主庫使用 innobackupex 進行線上熱備,備份完成時自動記錄該時刻的 binlog file 與 position(存於 xtrabackup_binlog_info)。
  2. 將備份檔傳輸至新從庫,執行 --apply-log 恢復資料一致性。
  3. 停止新從庫 MySQL,清空資料目錄,用 --copy-back 還原備份資料。
  4. 啟動 MySQL,根據備份記錄的 binlog 位點執行 CHANGE MASTER TO 指向主庫,啟動同步。

三、詳細操作步驟

1. 主庫:線上熱備並記錄位點

# 在主庫持續寫入時執行備份
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

2. 壓縮傳輸備份檔至新從庫

cd /tmp/backup
tar zcvf login.tar.gz 2014-02-22_07-43-36
scp login.tar.gz 192.168.1.103:/tmp/

3. 新從庫:解壓、應用日志、還原資料

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

4. 驗證資料一致性

mysql> SELECT COUNT(*) FROM login.a;
+----------+
| count(*) |
+----------+
|  5418272 |
+----------+

行數與主庫一致,資料還原成功。

5. 建立主從同步關係

讀取備份目錄下的 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(即主庫對應位點),後續流程相同。此法可完全避開主庫備份開銷。

五、關鍵提醒

  • 僅限 InnoDB 表:MyISAM 表會觸發全表鎖,失去「不鎖表」優勢。
  • 版本差異:MySQL 5.6+ 支援 GTID,僅需還原備份即可自動定位位點,流程更簡化。
  • 網路傳輸:大資料量建議用內網高速連線或 rsync 增量同步,縮短傳輸窗口。
  • innobackupex --copy-back 會覆蓋目標目錄所有檔案,務必先備份原資料目錄。

掌握此流程,即可在業務零停機前提下,靈活擴展 MySQL 讀取能力,滿足高可用架構演進需求。

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