apply-incremental-backup 必须基于完整全量备份目录运行,通过 --incremental-backup-dir 指向增量目录进行lsn连续合并,不可跳过中间环节,合并后需 copy-back 至空 datadir 才能恢复。

mysqlbackup apply-incremental-backup 命令必须基于全量备份目录运行
增量合并不是独立操作,它必须作用于一个已存在的全量备份目录(--backup-dir),而不是直接对增量备份目录本身执行。常见错误是把 apply-incremental-backup 当成“把增量备份变成新全量”的一键命令,结果报错 Cannot find backup-my.cnf in backup directory 或 Backup directory does not contain a valid full backup。
真正流程是:先有合法全备(含 backup-my.cnf、ibdata1 等完整文件),再用该目录作为基底,通过 --incremental-backup-dir 指向增量目录进行合并。
- 全量备份目录结构必须完整,不能只保留
backup_data子目录 - 增量备份目录里不能包含
backup-my.cnf—— 它只在全量中存在 - 若全量目录被手动删减或移动过,
apply-incremental-backup会失败,需重新做全备
增量链必须严格按 LSN 或时间顺序应用,不能跳过中间环节
MySQL Enterprise Backup 的增量依赖 LSN(Log Sequence Number)连续性。如果做了三次增量(inc1 → inc2 → inc3),恢复时必须依次执行:apply-incremental-backup 用 inc1 合并到全量,再用 inc2 合并,最后用 inc3。跳过任意一环会导致数据不一致,甚至恢复后启动 mysqld 失败(报错 InnoDB: Database page corruption on disk)。
可用 mysqlbackup --backup-dir=xxx --format=JSON list-backup 查看每个备份的 start_lsn 和 end_lsn,确认是否首尾相接。
-
--incremental-base=history:last_backup是自动取上一次备份的 LSN,适合脚本化调度,但不可用于跨主机或手动管理的备份集 - 手动指定
--incremental-base=dir:/path/to/prev_inc时,路径必须指向一个已完成的、可验证的增量备份目录(含backup_variables.txt) - 若某次增量备份损坏(如磁盘写入中断),后续所有增量都失效,只能从上一个完好的全量或增量点重来
合并完成后必须 copy-back 才能用于恢复,且 datadir 必须为空
apply-incremental-backup 只修改全量备份目录里的文件(如重放 redo 日志、更新 ibdata1),它**不触碰真实数据库目录**。要让这些变更生效,必须执行 copy-back,把处理后的文件复制到 MySQL 的 datadir 中。
关键限制:目标 datadir 必须完全为空,否则 copy-back 会报错 Directory /var/lib/mysql is not empty 并退出。这不是警告,是硬性拒绝。
- 停掉 mysqld 是必须前置步骤,否则
copy-back会失败(即使 datadir 空着) - 执行
copy-back前,务必确认--datadir路径与 MySQL 实际配置一致,否则恢复后无法启动 - Linux 下注意权限:复制后的文件属主应为
mysql:mysql,否则 mysqld 启动时报Can't open file: 'mysql/plugin.frm'
Windows 上路径空格和反斜杠容易引发参数解析失败
Windows 用户常因路径含空格(如 C:\Program Files\MySQL\...)或混用 \ 和 / 导致 mysqlbackup 报错 Failed to parse command line arguments 或找不到配置文件。
解决方式不是加引号那么简单——mysqlbackup 对 Windows 路径解析很敏感,尤其在 --defaults-file 参数上。
- 统一使用正斜杠
/,例如--defaults-file="C:/Program Files/MySQL/MySQL Server 8.0/my.ini" - 路径含空格时,引号必须紧贴等号,不能有空格:
--defaults-file="C:/my config/my.ini"✅,--defaults-file = "C:/my config/my.ini"❌ - 避免在路径末尾加反斜杠,
--backup-dir="J:/mysqlbackup\"会导致创建子目录mysqlbackup\,进而使后续apply-incremental-backup找不到预期结构
apply-incremental-backup 后,全量备份目录的 LSN 范围会更新,但它的物理大小不会明显变大(因为只是重放日志、调整页),所以不能靠目录大小判断是否成功;必须用 list-backup 验证 end_lsn 是否推进,再配合 copy-back 后启动 mysqld 并连上查一条数据才算闭环。











