出现MISCONF错误说明RDB持久化失败触发写保护,需立即检查rdb_last_bgsave_status、dir目录存在性/权限/磁盘空间/Inode及SELinux策略,而非仅关闭stop-writes-on-bgsave-error。

看日志里有没有 MISCONF 错误信息
只要 Redis 日志或应用报错里出现 MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk,就说明持久化失败已触发保护机制,写操作被禁用。这不是警告,是明确的故障信号——此时读正常、写全拒,业务常误判为“Redis挂了”,但真实问题在磁盘层。
这个错误本身不告诉你原因,只告诉你“RDB 持久化失败了,且 stop-writes-on-bgsave-error 是开启状态”。所以不能停在这行日志上,必须继续查 BGSAVE 失败的原始原因。
查最后一次 BGSAVE 是否真的失败了
运行 redis-cli info persistence,重点关注这几项:
-
rdb_last_bgsave_status:err→ 表示最近一次 BGSAVE 确实失败 -
rdb_last_bgsave_time:0或时间异常久远 → 说明 BGSAVE 长期没成功过 -
rdb_last_bgsave_errno:13(常见值)→ 权限拒绝;errno:28→ no space left on device;errno:2→ 文件或目录不存在
注意:rdb_last_bgsave_status 是最直接证据,比翻 redis.log 更快。如果它是 ok,那 MISCONF 就不是这次触发的,得往前翻日志找更早的失败记录。
验证 dir 目录是否存在、权限是否够、空间是否足
先用 redis-cli config get dir 拿到实际生效路径,比如返回 "/var/lib/redis",然后立刻执行三步检查:
-
ls -ld /var/lib/redis→ 看目录是否存在、属主是否为运行 Redis 的用户(如redis:redis)、权限位是否含rwx -
df -h /var/lib/redis→ 看挂载点剩余空间是否 ≥ 当前used_memory_human(用redis-cli info memory查),RDB 是全量快照,空间不够必失败 -
df -i /var/lib/redis→ inode 耗尽也会导致写失败,IUse%超 95% 就得清理小文件
特别注意:Redis 不会自动创建 dir 目录,也不校验权限。配置写 dir ./data 在不同启动方式下路径可能飘移;用相对路径是线上大忌。
别跳过 SELinux 和安全策略限制
CentOS/RHEL 系统上,即使 ls -ld 显示权限没问题,SELinux 也可能拦截写入。现象是 errno:13 但目录属主正确、chmod 也设好了。
临时确认是否 SELinux 导致:
-
getenforce→ 返回Enforcing就是开启状态 -
ausearch -m avc -ts recent | grep redis→ 查是否有 AVC denied 记录 - 临时设为 permissive:
setenforce 0,再试一次redis-cli bgsave,若成功则锁定是 SELinux 策略问题
生产环境不能长期关 SELinux,得用 semanage fcontext 修正上下文,而不是盲目 chmod 777 —— 后者在启用 SELinux 时反而会让问题更隐蔽。
真正卡点往往不在配置开关,而在目录路径是否真实存在、属主是否匹配、inode 是否耗尽、SELinux 是否静默拦截。这些细节不逐条验证,光改 stop-writes-on-bgsave-error no 只会让数据丢失风险滚雪球。


















