mysql 8.0.17+开启redo日志归档可避免备份中断,因默认redo log循环覆盖导致mysqlbackup来不及读取即被覆盖;启用需设innodb_redo_log_archive_dirs、用innodb_redo_log_archive权限用户调用innodb_redo_log_archive_start()、确保os目录权限700且与datadir隔离,并禁用--no-redo-log-archive参数。

MySQL 8.0.17+ 开启 innodb_redo_log_archive_dirs 并调用 innodb_redo_log_archive_start() 后,mysqlbackup 才能自动从归档文件读取增量日志,否则仍会因循环覆盖导致备份中断。
为什么备份会中断:Redo Log 循环覆盖是默认行为
MySQL 的 Redo Log 文件默认采用固定大小、循环写入机制。当备份耗时较长(比如大库导出、高并发写入场景),mysqlbackup 还没来得及把旧 Redo Log 拷走,这些日志就被新事务覆盖了。一旦缺失中间段日志,备份就无法保证一致性,最终失败并报错类似:Lost redo log records due to overwrite。
归档功能不是替代原有 Redo Log,而是额外开启一个「追加写」通道,把每条 Redo 记录实时同步写入独立归档文件,从而绕过循环覆盖限制。
配置归档目录前必须检查的三件事
归档目录权限或路径不合规会直接导致 DO innodb_redo_log_archive_start() 报错,常见错误包括:ERROR 3845 (HY000)(目录与 datadir 重叠)、ERROR 3846 (HY000)(权限太宽松)、ERROR 3844 (HY000)(目录不存在)。
- 目录必须提前创建,且不能是
datadir、innodb_data_home_dir或其任意子/父目录 - OS 层级权限必须为
700(仅属主可读写执行),不能是755或更开放 - MySQL 进程用户(通常是
mysql)必须对目录有完整读写权限:chown -R mysql:mysql /path/to/archive_dir
启动归档的最小可行操作链
归档不是设完变量就生效,必须显式调用函数启动。且 mysqlbackup 只在满足全部条件时才自动启用归档读取,缺一不可:
- 执行
SET GLOBAL innodb_redo_log_archive_dirs = "arch1:/data/mysql/redo-arch"(别名可自定义) - 用具备
INNODB_REDO_LOG_ARCHIVE权限的 MySQL 用户执行:DO innodb_redo_log_archive_start("arch1", "20260903") -
mysqlbackup启动时需确保运行用户对归档目录有 OS 级读写权限(不能用root直接跑备份命令) - 备份命令中不带
--no-redo-log-archive参数(该参数会强制禁用归档读取)
成功后,归档目录下会出现 archive_*.log 文件,大小持续增长;mysqlbackup 日志里会有类似 Using redo log archive for backup 的提示。
归档不是长期开启状态,停用和清理要手动做
归档文件会持续增长,且不自动轮转或压缩。备份任务结束后必须主动停止,否则可能填满磁盘:
- 调用
DO innodb_redo_log_archive_stop()停止写入 - 确认
mysqlbackup已完成且无其他依赖进程在读该归档目录 - 再执行
rm -rf /data/mysql/redo-arch/20260903清理(注意别删错目录层级)
最容易被忽略的是:归档目录名(如 "20260903")是传给 innodb_redo_log_archive_start() 的第二个参数,它会作为子目录名创建,但 MySQL 不管理这个子目录的生命周期——你得自己记、自己删、自己按日期归档归档。











