bgrewriteaof返回err说明已有重写在运行,redis不支持并发重写;需等待aof_rewrite_in_progress为0后再试,若aof_rewrite_scheduled为1则表示被rdb等任务延迟;磁盘空间不足、appendonly未启用、fork失败或重写失败导致aof_base_size冻结均会阻碍后续自动重写。

BGREWRITEAOF返回ERR Background append only file rewriting already in progress
这是最常见失败现象,说明Redis当前已有AOF重写任务在运行。Redis不支持并发AOF重写,BGREWRITEAOF命令会直接拒绝新请求。
- 检查
INFO persistence中aof_rewrite_in_progress是否为1 - 若为
0但aof_rewrite_scheduled为1,说明重写被延迟(例如正在执行BGSAVE) - 等待
aof_rewrite_in_progress降为0后再试,不要轮询重试
磁盘空间不足导致子进程静默退出
重写需fork子进程并写入全新appendonly.aof.xxx临时文件,若磁盘满,子进程会失败且不报错,旧AOF保持不变。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 用
df -h确认Redis数据目录所在分区剩余空间 ≥ 当前AOF文件大小的1.2倍 - 检查
INFO persistence中aof_last_bgrewrite_status是否为err - 查Redis日志是否有
No space left on device或Can't rewrite append only file
配置未生效或AOF根本没启用
CONFIG GET appendonly返回no时,BGREWRITEAOF直接报错,不是“无效”,而是压根不走重写逻辑。
- 确认
appendonly yes已写入配置文件且Redis重启后加载成功 - 执行一次写命令(如
SET test 1),确保aof_current_size > 0,否则自动机制无法初始化基准值 - 用
CONFIG GET auto-aof-rewrite-percentage确认值非0(设为0即禁用自动重写)
内存不足或fork失败
重写需fork子进程,触发copy-on-write;若实例内存碎片高、存在bigkey或系统vm.overcommit_memory=0,fork可能卡住或失败。
- 观察Redis日志是否出现
Failed to fork或Can't fork for AOF rewrite - 检查
/proc/sys/vm/overcommit_memory,生产环境建议设为1 -
INFO memory中mem_fragmentation_ratio>1.5时需警惕,重写前可先执行MEMORY PURGE(Redis 6.2+)
aof_base_size不会更新,后续自动重写永远无法触发——哪怕你改了配置、清了磁盘,只要没成功过一次,自动机制就等于瘫痪。手动重写必须成功一次,才能让自动阈值判断重新启动。










