xtrabackup 增量与流式备份
导学
每天全量备份 500GB 的数据库,备份窗口可能长达数小时。增量备份只复制自上次备份以来发生变化的数据页,通常只需几分钟。配合流式备份直接传输到远程存储,可以实现高效的备份策略。
定义
增量备份:只备份自上次全量或增量备份以来被修改过的 InnoDB 数据页。XtraBackup 通过比较 LSN(Log Sequence Number)判断哪些页发生了变化。流式备份:将备份数据实时输出到标准输出,通过管道直接传输到远程存储或归档设备,不占用本地备份磁盘。
场景一:基于全备的增量备份
前置条件:周日已完成全量备份。
# 周日全备
xtrabackup --backup --target-dir=/backup/sunday_full \
--user=backup_user --password=BackupPass123
当前数据状态:周一业务运行后,company 库新增了一条员工记录。
INSERT INTO employees (emp_name, dept, score) VALUES ('孔蓝', '产品部', 88);
操作语句:周一执行增量备份。
xtrabackup --backup \
--target-dir=/backup/monday_incr \
--incremental-basedir=/backup/sunday_full \
--user=backup_user --password=BackupPass123
验证增量备份目录:
ls -la /backup/monday_incr/
预期输出包含大量 .delta 文件(增量数据页):
-rw-r--r-- 1 root root 16K Jan 15 02:00 ibdata1.delta
-rw-r--r-- 1 root root 4.0K Jan 15 02:00 company/employees.ibd.delta
查看增量备份元数据:
cat /backup/monday_incr/xtrabackup_info
关键字段:
incremental = Y
from_lsn = 12345678
to_lsn = 12346000
结果解读:
--incremental-basedir指向上次备份(全备或增量备)的目录- XtraBackup 读取基础备份的
xtrabackup_checkpoints中的to_lsn,只备份 LSN 大于该值的数据页 - 增量备份目录只包含变化的
.delta文件,体积通常只有全备的 5%~15% from_lsn和to_lsn记录了本次增量备份覆盖的 LSN 范围
场景二:多级增量备份链
操作语句:周二基于周一增量再做增量。
xtrabackup --backup \
--target-dir=/backup/tuesday_incr \
--incremental-basedir=/backup/monday_incr \
--user=backup_user --password=BackupPass123
周三基于周二:
xtrabackup --backup \
--target-dir=/backup/wednesday_incr \
--incremental-basedir=/backup/tuesday_incr \
--user=backup_user --password=BackupPass123
备份链结构:
/backup/
├── sunday_full/ # 全备(LSN: 0 -> 12345678)
├── monday_incr/ # 增量 1(LSN: 12345678 -> 12346000)
├── tuesday_incr/ # 增量 2(LSN: 12346000 -> 12346500)
└── wednesday_incr/ # 增量 3(LSN: 12346500 -> 12347000)
结果解读:
- 增量备份可以链式进行,每次基于上一次的备份目录
- 恢复时必须按顺序应用:全备 -> 周一增量 -> 周二增量 -> 周三增量
- 链条过长会增加恢复复杂度和风险,建议每周做一次全备,重置链条
场景三:流式增量备份到远程
操作语句:将增量备份直接流式传输到远程服务器。
xtrabackup --backup \
--user=backup_user --password=BackupPass123 \
--incremental-basedir=/backup/sunday_full \
--stream=xbstream \
--target-dir=/tmp | \
ssh backup_server "xbstream -x -C /remote/backup/monday_incr"
结果解读:
--stream=xbstream将增量备份输出为流格式- 增量备份的
.delta文件通过管道实时传输到远程 - 远程服务器用
xbstream -x解压到指定目录 - 适合本地磁盘空间不足、或备份目标在异地数据中心的场景
场景四:压缩增量备份
操作语句:
xtrabackup --backup \
--target-dir=/backup/monday_incr \
--incremental-basedir=/backup/sunday_full \
--compress \
--compress-threads=2 \
--user=backup_user --password=BackupPass123
验证:
ls -lh /backup/monday_incr/company/
预期输出:
-rw-r--r-- 1 root root 2.1K Jan 15 02:00 employees.ibd.delta.qp
结果解读:增量备份本身已经很小,再压缩后通常只有全备的 1%~5%。适合网络带宽有限、需要长期保留多份增量备份的场景。
常见误区
| 误区 | 正解 |
|---|---|
| "增量备份可以独立恢复" | 不能。增量备份必须基于全备,恢复时先恢复全备,再按顺序应用每个增量。 |
| "增量备份链条越长越好" | 不是。链条过长增加恢复时间和失败风险。建议每周做一次全备,重置链条。 |
| "增量备份只备份 InnoDB" | 默认只增量备份 InnoDB 数据页。MyISAM 表在增量备份中会被完整复制(因为 MyISAM 没有 LSN 机制)。 |
| "增量备份后不需要 prepare" | 需要。增量备份的 .delta 文件必须在 prepare 阶段合并到全备中。 |
面试考点
Q:增量备份的原理是什么?
XtraBackup 通过比较 InnoDB 数据页的 LSN(Log Sequence Number)判断哪些页自上次备份后发生了变化。只复制 LSN 大于基础备份
to_lsn的数据页,生成.delta文件。恢复时将这些.delta页合并到全备的数据文件中。
Q:全备 + 增量备份的恢复顺序?
prepare全备(--apply-log --redo-only);2. 按顺序prepare每个增量(--apply-log --redo-only --incremental-dir=incrN);3. 最后一个增量prepare时不加--redo-only(允许回滚未提交事务);4.copy-back到数据目录。
Q:增量备份适合什么场景?
数据量大(> 100GB)、变化率较低(日变更 < 10%)、备份窗口有限的场景。如果每天 80% 的数据都变化,增量备份体积接近全备,不如直接全备。
小结
- 增量备份只复制变化的数据页,体积通常为全备的 5%~15%
--incremental-basedir指向上次备份目录,XtraBackup 通过 LSN 判断变化页- 增量备份可以链式进行,但建议每周做一次全备重置链条
- 恢复时必须按顺序应用:全备 -> 增量 1 -> 增量 2 -> ...
- 流式备份和压缩进一步节省磁盘和网络资源
下一章引子:备份文件生成后,必须经过 prepare 阶段才能用于恢复。这是 xtrabackup 与 mysqldump 最大的流程差异。