面试题:redis持久化失效怎么做?
一、先确认是不是真的持久化失效登录 Redisredis-cli INFO PERSISTENCE重点看rdb_last_bgsave_status应该是ok不是erraof_last_write_status应该是okrdb_last_bgsave_time最近一次 RDB 时间aof_enabled是否为 1开启再看日志一般/var/log/redis/redis-server.log出现MISCONF、Cant save in background、No space left、fork failed就是持久化失败。二、常见原因快速定位磁盘满df -h看 redis data 目录是否 100%。权限不足redis 用户对dir目录无写权限。内存不足导致 fork 失败plaintextFailed opening .rdb for saving: No child processes原因BGSAVE 要 fork 子进程内存不够直接失败。配置错误dir目录不存在dbfilename/appendfilename写错AOF 没开appendonly no。磁盘 I/O 卡死iostat 长期 100%AOF 刷盘卡住。三、紧急处理先让 Redis 能写1磁盘满清理空间或扩容然后bash运行# 手动触发一次保存 redis-cli BGSAVE redis-cli BGREWRITEAOF2fork 失败内存不足临时允许写入conf# redis.conf stop-writes-on-bgsave-error no改完重启或bash运行redis-cli CONFIG SET stop-writes-on-bgsave-error no长期方案降低 Redis 内存占用maxmemory开启vm.overcommit_memory1Linux3AOF 文件损坏bash运行# 先备份 cp appendonly.aof appendonly.aof.bak # 修复 redis-check-aof --fix appendonly.aof按提示输入y截断坏部分Redis。4RDB 文件损坏bash运行redis-check-rdb dump.rdb损坏严重只能用最近备份恢复。四、数据恢复流程关键停止 Redisredis-cli SHUTDOWN # 或 systemctl stop redis备份当前损坏文件cp dump.rdb dump.rdb.bak cp appendonly.aof appendonly.aof.bak用健康的 RDB/AOF 覆盖# 假设你有备份 cp /backup/dump-good.rdb /var/lib/redis/dump.rdb cp /backup/appendonly-good.aof /var/lib/redis/appendonly.aof启动 Redissystemctl start redis验证数据redis-cli INFO keyspace五、彻底解决配置优化必做# 1. 开启 RDB合理触发 save 300 10 save 60 10000 # 2. 开启 AOF强一致 appendonly yes appendfsync everysec # 平衡性能与安全 # 3. 磁盘满不拒绝写入应急 stop-writes-on-bgsave-error no # 4. AOF 自动重写 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 5. 内存策略防止 OOM maxmemory 4gb maxmemory-policy allkeys-lru六、监控与预防避免再次发生监控指标rdb_last_bgsave_statusaof_last_write_status磁盘使用率 80% 告警定时备份# 每日备份 RDB cp /var/lib/redis/dump.rdb /backup/dump-$(date %F).rdb架构主从 哨兵 / Cluster持久化失败可从库恢复。