6.5.3 物理备份(Percona XtraBackup)与恢复流程
物理备份采用 Percona XtraBackup 进行热备,适用于 InnoDB 表的全量、增量备份与快速恢复。本节强调备份一致性、资源控制、目录规划与恢复验证,确保业务连续性。
原理草图(物理备份与恢复流程)
适用场景与优势
- 大数据量、低停机窗口:热备不锁表,减少业务影响
- 更快恢复:直接拷贝数据文件,恢复时间短
- 支持增量链路:基于 LSN 的增量备份,节省空间与时间
安装与环境准备
- 版本兼容:MySQL 5.7/8.0 与对应 XtraBackup 版本
- 账号权限:RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT
- 目录规划:全量、增量、日志、元数据分离;确保磁盘空间与 IOPS
# Ubuntu/Debian 安装示例
apt-get update
apt-get install -y percona-xtrabackup-80
# CentOS/RHEL 安装示例
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only tools release
yum install -y percona-xtrabackup-80
# 创建备份用户
mysql -uroot -p -e "
CREATE USER 'backup'@'%' IDENTIFIED BY 'Backup@123';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'backup'@'%';
FLUSH PRIVILEGES;"
# 目录规划
mkdir -p /data/backup/{full,inc,logs,meta}
chown -R mysql:mysql /data/backup
全量备份流程(含命令解释)
1. 执行备份(--parallel 提升速度,--target-dir 指定输出目录)
xtrabackup --backup \
--target-dir=/data/backup/full/20240101 \
--user=backup --password='Backup@123' \
--parallel=4 \
--log=/data/backup/logs/full_20240101.log
- 备份完成检查(关注 LSN 与状态)
cat /data/backup/full/20240101/xtrabackup_checkpoints
# 预期:backup_type = full-backuped, from_lsn/to_lsn 有效
- 准备阶段(apply log,使备份可恢复)
xtrabackup --prepare \
--target-dir=/data/backup/full/20240101 \
--log=/data/backup/logs/prepare_full_20240101.log
- 归档校验(记录元数据,生成校验和)
tar -czf /data/backup/meta/full_20240101.tar.gz -C /data/backup/full/20240101 .
sha256sum /data/backup/meta/full_20240101.tar.gz > /data/backup/meta/full_20240101.sha256
恢复流程(全量)
1. 停库与清理数据目录
systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
- 数据拷贝回放(copy-back)
xtrabackup --copy-back \
--target-dir=/data/backup/full/20240101 \
--log=/data/backup/logs/copyback_20240101.log
- 权限修复与启动验证
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p -e "SELECT COUNT(*) FROM information_schema.tables;"
增量备份与合并示例
# 第一次增量,基于全量
xtrabackup --backup \
--target-dir=/data/backup/inc/20240101_01 \
--incremental-basedir=/data/backup/full/20240101 \
--user=backup --password='Backup@123'
# 合并增量(apply-log-only 保持可继续合并)
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full/20240101 \
--incremental-dir=/data/backup/inc/20240101_01
# 若有第二个增量,继续合并
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full/20240101 \
--incremental-dir=/data/backup/inc/20240101_02
# 最后一轮合并完成后去掉 apply-log-only
xtrabackup --prepare \
--target-dir=/data/backup/full/20240101
命令关键参数说明
- --backup:执行备份模式,输出为物理文件
- --prepare:回放 redo/undo,使备份可恢复
- --copy-back:将备份文件拷回 datadir
- --incremental-basedir:指定基准目录(全量或上一次增量)
- --parallel:并行线程数,提高 IO 吞吐
性能与资源控制示例
# 使用 ionice 降低对线上 IO 影响
ionice -c2 -n7 xtrabackup --backup --target-dir=/data/backup/full/20240101 \
--user=backup --password='Backup@123' --parallel=4
# 使用 xbstream 压缩与传输(便于远端归档)
xtrabackup --backup --stream=xbstream --compress \
--target-dir=/data/backup/full/20240101 \
--user=backup --password='Backup@123' | ssh backup@10.0.0.2 "cat > /data/archive/full_20240101.xbstream"
排错清单(含定位命令)
- 准备失败:检查 redo/数据页损坏
grep -i "error\|fail" /data/backup/logs/prepare_full_20240101.log
- 权限错误:确认备份用户权限
mysql -uroot -p -e "SHOW GRANTS FOR 'backup'@'%';"
- 恢复后启动失败:检查 datadir 与 ib_logfile
ls -l /var/lib/mysql
grep -i "InnoDB" /var/log/mysqld.log | tail -n 50
练习任务
1. 在测试库中创建 1GB 数据表,执行全量备份并恢复到新实例,记录恢复耗时。
2. 模拟增量链路(全量 + 2 次增量),故意跳过一个增量,观察 prepare 的报错并写出原因。
3. 使用 ionice 降低备份优先级,比较备份耗时和业务 QPS 变化。