CONFIG SET appendonly no 不能立即停写 AOF,仅对后续命令生效,需同时检查 appendonly 和 aof-enabled 均为 "no",并立即执行 BGSAVE 和 RDB 冷备,再用 CONFIG REWRITE 永久生效。

可以平滑关闭,但必须立刻验证状态、确认AOF文件不再增长,并补一次RDB冷备——否则有数据丢失风险。
CONFIG SET appendonly no 真的能立即停写 AOF 吗
能,但只对后续命令生效。执行 CONFIG SET appendonly no 后,Redis 会停止追加新命令到当前 AOF 文件,也不会触发重写(bgrewriteaof);但正在写入的 AOF 缓冲区(如果 appendfsync 是 everysec 或 always)仍会刷盘完毕,所以你可能看到 AOF 文件末尾还有几条刚落盘的命令。
常见错误现象:
- 执行完命令后立刻
ls -l appendonly.aof,发现文件大小还在缓慢增长(其实是最后一批缓冲刷盘) - 用
CONFIG GET appendonly返回"no",但redis-cli --stat里仍看到aof_pending_bio_fsync > 0,说明内核 I/O 还没完成
为什么 CONFIG GET appendonly 和 CONFIG GET aof-enabled 都得查
因为 Redis 内部有两个开关:一个是用户态的 appendonly(控制是否开启 AOF 日志追加),另一个是底层的 aof-enabled(表示 AOF 引擎是否已初始化)。当实例启动时加载了 AOF 文件,即使你 CONFIG SET appendonly no,aof-enabled 仍可能是 "yes",意味着 AOF 模块仍在内存中驻留、只是不接收新命令。
必须同时检查:
-
CONFIG GET appendonly→ 应为"no" -
CONFIG GET aof-enabled→ 也应为"no",否则说明 AOF 文件已被加载过,模块未完全卸载
如果 aof-enabled 仍是 "yes",说明实例启动时读取了 AOF 文件(比如配置里写了 appendonly yes 或启用了 auto-aof-rewrite-percentage),此时仅 CONFIG SET appendonly no 不够,需配合 CONFIG SET aof-enabled no(部分版本支持)或直接重启。
关闭后不备份 RDB 就等于裸奔
AOF 关闭瞬间,Redis 只剩内存数据 + 上次 RDB 快照。如果上次 RDB 是几小时前做的,中间所有写入都只存在内存里——一旦进程崩溃或机器断电,全丢。
务必在 CONFIG SET appendonly no 执行成功后,立刻执行:
-
redis-cli BGSAVE→ 触发后台快照,生成新rdb文件 -
redis-cli --rdb /tmp/latest.rdb SAVE→ 强制同步保存一份冷备(推荐,避免BGSAVEfork 失败时无退路)
注意:CONFIG SET save "" 只禁用自动 RDB 规则,不影响手动 BGSAVE;但如果你之前删光了所有 save 规则,又没手动备份,就只剩内存了。
CONFIG SET 的修改不会写回 redis.conf
所有 CONFIG SET 命令都是运行时生效,Redis 进程重启后,一切恢复成 redis.conf 里的原始配置。这意味着:
- 你关掉了 AOF,但重启后它又自动打开(如果配置文件里仍是
appendonly yes) - 想永久关闭?必须执行
CONFIG REWRITE,它会把当前运行时配置(包括appendonly no)覆盖写回redis.conf -
CONFIG REWRITE可能失败:如果redis.conf路径没通过CONFIG GET dir和CONFIG GET dbfilename显式指定,或redis用户无写权限,就会报错
最稳妥做法:先 CONFIG SET appendonly no,再 CONFIG REWRITE,最后用 cat redis.conf | grep appendonly 确认文件已更新。

















