首页/数据/Redis 进阶速查/增量文件轮转与重写关系
持久化56 条

增量文件轮转与重写关系

7.0 多文件 AOF 中,重写会生成新的 base 基线并开启新的 incr 增量文件,旧文件在切换完成后被清理,目录始终由 manifest 描述有效集合。

Redis 进阶速查数据更新于 2026-10-13

多文件 AOF 的轮转机制

Redis 7.0 起 AOF 不再是一个大文件:appendonlydir 目录下由 manifest 描述一组有效文件,包括 base 基线文件与 incr 增量文件。写入先追加到当前 incr,重写在子进程里生成新的 base 与新的 incr,切换完成后旧文件被清理。因此「目录里有几个文件」和历史重写次数有关,跟当前数据量没有直接关系。

基本信息

适用版本Redis 7.0 及以上(多文件 AOF)
目录位置dir 下的 appendonlydir(由 appenddirname 决定)
有效集合由 appendonly.aof.manifest 描述
base 格式由 aof-use-rdb-preamble 控制,开启时为 RDB 格式

典型使用场景

  • 核对实例究竟会加载哪些文件:数据比预期少时先看 manifest,而不是只看文件名
  • 备份前确认目录内容与 manifest 一致,避免只拷到半套文件
  • 重写完成后确认旧 incr 已被清理、磁盘水位是否回落
  • 手工迁移 AOF 目录时保证 base 与 incr 一起搬,manifest 同步随行
  • 排查磁盘被吃满:先看 incr 是否长期没有重写而在持续膨胀

查看轮转结果

查看轮转结果
ls -l /data/redis/appendonlydir/      # 看到 base 与 incr 两类文件
cat /data/redis/appendonlydir/appendonly.aof.manifest   # manifest 是权威清单
redis-cli INFO persistence | grep -E 'aof_base_size|aof_current_size'  # 基线与增量大小
redis-cli BGREWRITEAOF                # 手工触发一次重写,观察轮转
redis-cli INFO persistence | grep -E 'aof_last_bgrewrite_status'  # 确认重写结果

base 与 incr 的区别

文件内容何时产生
base(.base.rdb 或 .base.aof)一次重写时的全量基线每次重写生成新的 base
incr(.incr.aof)重写之后追加的写命令重写切换后开启新的 incr
manifest记录上述文件的文件名与序号每次重写时更新
manifest 里每个文件都带序号与类型标记:序号在每次重写后递增,类型区分基线(base)与增量(incr);不在清单里的旧文件和中断产生的临时文件都属残留,不参与加载。
自动重写由 auto-aof-rewrite-percentage 与 auto-aof-rewrite-min-size 触发,只针对当前增量相对基线的增长比例;写入量小的实例可能长期不重写,需要人工安排 BGREWRITEAOF。
备份必须是「整目录加 manifest」一起拷:只拷 incr 恢复不出完整数据,只拷 base 会丢掉最近写入;用手工挑选的文件替换整个目录,则可能直接启动失败。

易错点

  • 按文件名猜状态:目录里存在旧 incr 不代表它仍被使用,是否有效只以 manifest 为准
  • 重写需要旧文件与新 base 同存的峰值空间,磁盘水位不足会让重写反复失败并持续占用 IO
  • 手工删除目录内文件破坏清单一致性,实例可能直接起不来,只能退回整目录备份恢复
  • 迁移时只搬一半文件(漏掉 base 或漏掉 manifest),恢复后数据缺失且难以定位缺在哪一段

数据来源与参考

  • Redis 7.0 多文件 AOF 机制说明(Release Notes)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌