在大规模mysql集群中,mysqldump --incremental-basedir不可用;真正可用的增量备份只有基于binlog的逻辑增量或基于xtrabackup的物理增量,后者是大规模集群唯一靠谱方案。

直接说结论:在大规模MySQL集群中,mysqldump --incremental-basedir 不可用,它根本不存在;真正能落地的增量备份只有两条路——基于 binlog 的逻辑增量,或基于 xtrabackup 的物理增量。前者适合中小规模、RPO要求宽松的场景;后者才是大规模集群的标配,否则存储和恢复时间都会失控。
为什么 mysqldump 不支持真正的增量备份
mysqldump 是逻辑备份工具,它导出的是 SQL 语句。所谓“增量”只是社区误传或某些定制脚本的伪实现,官方版本从没提供 --incremental 或 --incremental-basedir 参数。你如果在文档或脚本里看到这类写法,基本是混淆了 Percona XtraBackup 的参数,或者用了非官方补丁版。
常见错误现象包括:Unknown argument: --incremental-basedir、备份结果和全量完全一致、恢复后数据丢失等。
- mysqldump 只能通过
--where或--ignore-table做“选择性导出”,不是增量 - 它不感知 LSN、不读取 redo log、不比较页变更,无法识别“哪些数据块变了”
- 即使配合
--single-transaction,也只是保证一致性快照,不是增量逻辑
基于 binlog 的增量备份:简单但有硬伤
这是最轻量、无需额外工具的方案,核心就是定期归档 mysql-bin.* 文件,并用 mysqlbinlog 解析重放。适用于日增数据
关键操作点:
- 必须确保所有节点
server_id全局唯一,否则 binlog 事件会丢失或错乱 - 启用
log_bin = ON后,建议加expire_logs_days = 7防止磁盘打满 - 执行
FLUSH LOGS后再归档,避免正在写的 binlog 被截断 - 归档命令示例:
mysqlbinlog --base64-output=DECODE-ROWS --verbose mysql-bin.000012 > inc_20260602.sql
性能影响:binlog 写入本身有开销(约 5–10% QPS 下降),但归档过程是只读的,不影响主库。问题在于——恢复时必须按顺序重放所有 binlog,一旦中间某个文件损坏,后续全部失效。
基于 xtrabackup 的增量备份:大规模集群唯一靠谱方案
Percona XtraBackup 是目前唯一被大规模验证过的 MySQL 物理增量方案。它利用 InnoDB 数据页的 LSN 值判断变化,只拷贝自上次备份以来修改过的数据页,压缩后体积通常只有全量的 3–15%。
实操要点:
- 全量备份必须带
--no-timestamp并指定--target-dir=/backup/full,后续增量才可依赖 - 第一次增量命令:
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full - 第二次增量必须指向前一次增量目录:
--incremental-basedir=/backup/inc1,不能跳链 - 恢复时必须按“全量 → inc1 → inc2”顺序 apply,且每次都要
--apply-log --redo-only(最后一次除外)
容易踩的坑:
- 不同版本 xtrabackup(2.4 / 8.0)对 MySQL 5.7 / 8.0 的兼容性不同,混用会导致
Invalid data block - 增量备份期间若发生 DDL(如
ALTER TABLE),可能造成目标表空间不一致,需避免在备份窗口内执行 - 不要把
--parallel=4设得过高,SSD 阵列下超过 8 反而因锁竞争降低吞吐
集群维度的增量协调难点
单实例好办,但大规模集群(比如分库分表 + 多主从)的增量策略必须统一调度,否则会出现“A 库用 binlog 增量,B 库用 xtrabackup 增量,C 库还在用 mysqldump 脚本”的混乱局面。
真实运维中必须明确:
- 所有节点启用
log_bin是底线,哪怕不用它做增量,也必须开启——它是 PITR(时间点恢复)的唯一依据 - 主库优先用
xtrabackup做物理增量;从库可关闭 binlog 归档以节省 IO,但要保留 relay log 备查 - 备份元数据(时间戳、LSN 范围、binlog 文件名、校验和)必须集中写入一个配置库,不能靠文件名或本地日志推断
最常被忽略的一点:增量备份不是“存下来就完事”。每周至少要跑一次 xtrabackup --prepare 模拟恢复流程,否则等到故障那天才发现 inc2 的 LSN 断层,已经晚了。











