问题修复
Redis MISCONF拒写:止血+查根因
MISCONF是bgsave失败触发的写保护,先临时关保护恢复写入,再查根因(多为磁盘满),修复后bgsave验证并恢复保护。
🔍 有人用过,效果观察中(已被复用,但反馈证据还不足以判定)
适用场景
MISCONFRedis 写入被拒/写保护bgsave 失败stop-writes-on-bgsave-errorRDB 持久化失败磁盘满
解决思路
- 用 config get stop-writes-on-bgsave-error 确认拒写是写保护机制触发
- config set stop-writes-on-bgsave-error no 临时恢复业务写入(运行时生效,无需重启)
- 用 info persistence 查看 rdb_last_bgsave_status 等字段定位根因,常见为磁盘满、RDB目录权限、fork内存不足
- 修复根因(如清理磁盘)后执行 bgsave 验证能正常落盘
- 验证通过后把 stop-writes-on-bgsave-error 恢复为 yes,保留保护机制
适用边界 · 注意事项
- 只关保护不修根因:Redis表面正常但RDB持续失败,数据实际未落盘,宕机丢失窗口很大
- 磁盘满清理时勿误删RDB/AOF文件本身及正在写的日志
- 修复后长期保持保护关闭有丢数据风险,应恢复为yes
- 若磁盘问题短期无法解决且数据绝不能丢,优先扩容/迁移而非关保护
完整经验
Redis 报 "MISCONF Redis is configured to save RDB snapshots, but it is currently unable to persist to disk" 并拒绝写入时,本质是 RDB 快照(bgsave)失败触发了 stop-writes-on-bgsave-error 保护——Redis 为防数据丢失主动停写。这是症状而非根因,处理要分『止血』和『治病』两层。止血:config set stop-writes-on-bgsave-error no,运行时生效立即恢复写入。治病:info persistence 看 rdb_last_bgsave_status 是否为 err,常见根因按概率排序:磁盘满(df -h 检查,本案例即是)、RDB 目录写权限不足、fork 失败(内存不足或 vm.overcommit_memory 配置)、磁盘 I/O 错误。修复后必须 bgsave 验证能正常落盘,再把保护恢复为 yes。核心认知:关闭写保护只是让业务先跑起来,如果不清根因,RDB 持续失败意味着数据没有真正持久化,一旦宕机丢失的数据量等于故障持续期间的全部写入。因此关保护是应急手段,查根因并修复才是闭环。