場景與約束
- 版本:MySQL 5.1.61(無 GTID,需手動指定 Binlog 文件+Position)
- 架構:主 192.168.1.101 → 從1 192.168.1.102(正常) → 新從2 192.168.1.103
- 引擎:InnoDB(支持 xtrabackup 熱備不鎖表)
- 備份工具:Percona XtraBackup 已安裝
操作步驟
1. 主庫熱備(業務持續寫入)
# 插入測試數據模擬業務寫入
mysql> INSERT INTO a SELECT * FROM a;
# xtrabackup 熱備
innobackupex --user=root --password=xxx --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. 備份傳輸與從庫還原
# 壓縮傳輸
tar zcvf login.tar 2014-02-22_07-43-36
scp login.tar 192.168.1.103:/tmp/
# 從庫解壓應用日志
tar -xf login.tar
innobackupex --apply-log /tmp/2014-02-22_07-43-36/
# 停庫、清空數據目錄、還原
/etc/init.d/mysqld stop
mv /var/lib/mysql/* /tmp/mysqlback/
innobackupex --copy-back /tmp/2014-02-22_07-43-36/
mv /tmp/mysqlback/* /var/lib/mysql/ # 補回原配置/日志文件
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysqld start
3. 驗證數據一致性
mysql> SELECT COUNT(*) FROM a;
+----------+
| count(*) |
+----------+
| 5418272 | ← 與備份瞬間主庫一致
+----------+
4. 建立主從關係
# 讀取備份時位點
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/SQL_Running = Yes
關鍵提示
- 只複製數據文件(.ibd/.frm),勿覆蓋目標庫原有日志/配置
--apply-log 步驟不可省略,保證數據頁一致性
- MySQL 5.6+ 可用 GTID 簡化:
CHANGE MASTER TO MASTER_AUTO_POSITION=1
- 若原從庫可停機,也可在從庫備份並記錄
Relay_Master_Log_File/Exec_Master_Log_Pos