首页/数据/Redis 进阶速查/BGSAVE 失败与写保护
持久化56 条

BGSAVE 失败与写保护

快照失败(磁盘满、权限错误等)时 lastbgsave_status 变为 err;默认 stop-writes-on-bgsave-error yes 会让写请求直接报错,防止继续写入无法持久化的数据。

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

BGSAVE 失败与写保护

当后台快照因为磁盘写满、目录权限变化或文件系统异常而失败时,Redis 会把 rdb_last_bgsave_status 置为 err,并默认开启写保护:stop-writes-on-bgsave-error 为 yes 时,所有会修改数据的命令一并被拒绝,返回以 MISCONF 开头的错误。这个设计的用意很直接,既然当前数据无法被持久化,就宁可拒绝写入也不要让业务误以为数据安全。

基本信息

失败标志INFO persistence 的 rdb_last_bgsave_status 变为 err
写保护开关stop-writes-on-bgsave-error,默认 yes
报错特征命令返回以 MISCONF 开头的错误文本
常见根因磁盘空间不足、目录权限变化、挂载点掉线
恢复条件快照成功后状态字段回到 ok,写保护自动解除

典型使用场景

  • 写入全面报错时的快速定位:先看错误是否以 MISCONF 开头,把持久化问题与业务问题区分开
  • 磁盘容量治理:把 rdb_last_bgsave_status 与磁盘使用率一起监控,在写满前预警
  • 容器化环境的排查:宿主机挂载卷变化导致目录不可写,表现为实例仍在运行但快照持续失败
  • 临时止血:确认根因前可临时关闭写保护让业务恢复,但必须同步处理磁盘或权限问题
  • 恢复验证:清理空间后手动 BGSAVE 一次,确认状态字段回到 ok 再宣布恢复

排查与恢复

排查与恢复
redis-cli INFO persistence | grep -E 'rdb_last_bgsave_status|rdb_bgsave_in_progress'
redis-cli CONFIG GET stop-writes-on-bgsave-error
redis-cli CONFIG GET dir                     # 确认快照目录
redis-cli CONFIG GET dbfilename
df -h /var/lib/redis                         # 磁盘空间与挂载点
redis-cli BGSAVE                             # 清理空间后手动验证
redis-cli INFO persistence | grep rdb_last_bgsave_status   # 期望回到 ok

常见根因对照

现象根因处置
写入报 MISCONF快照持续失败查磁盘空间与目录权限,修好后等状态恢复
状态为 err 但业务正常尚未触发写保护或已被人工关闭尽快修复根因,关闭写保护只是临时措施
快照耗时突然变长磁盘 IO 饱和或文件系统异常换用独立磁盘或提高 IOPS
磁盘还有空间仍失败目录属主或权限在变更后不匹配核对运行用户与目录属主
写保护的双刃剑性质:它让业务在有数据风险时立刻感知,避免「以为写进去了实际丢了」的静默故障;代价是快照问题会直接升级为全站写入不可用。因此监控必须在快照失败的第一时间告警,而不是等业务开始报错。
关闭 stop-writes-on-bgsave-error 只是止血:它让写入继续成功,但数据仍处于无法持久化的状态,一旦机器故障这段时间的写入全部丢失。关闭后必须在同一维护窗口内解决磁盘或权限问题,并尽快重新打开。

易错点

  • 看到写入报错先怀疑业务代码或网络,忽略错误文本里的 MISCONF 前缀,排查方向被完全带偏
  • 为了恢复业务直接关闭写保护却忘记回头处理磁盘问题,数据长期处于可丢失状态且无人知晓
  • 只监控实例是否存活,不监控 rdb_last_bgsave_status,问题在磁盘写满后才以全量报错的形式暴露
  • 磁盘清理后未手动触发一次快照验证,状态字段仍是 err,写保护未解除但以为已经恢复

数据来源与参考

  • Redis 官方文档:redis.conf stop-writes-on-bgsave-error 注释
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌