8.3.5 数据损坏修复与恢复流程
数据损坏修复与恢复流程#
- 典型损坏场景:磁盘故障导致RDB/AOF文件不完整、进程异常退出引发AOF尾部损坏、误操作覆盖数据文件、主从切换期间文件未刷盘。
- 处置前置原则:立即停止写入、隔离实例、对现有RDB/AOF做只读备份(拷贝到安全路径),避免二次破坏。
原理草图(恢复决策路径)
环境与工具安装
- Redis自带工具一般位于/usr/bin/或源码src/下:redis-check-rdb、redis-check-aof
- 若未安装工具,可在源码目录编译:
# 安装依赖与编译(以源码为例)
tar -xf redis-7.2.4.tar.gz
cd redis-7.2.4
make
# 生成工具在 src/
ls src/redis-check-rdb src/redis-check-aof
RDB修复与恢复(示例与命令解释)
# 1) 备份当前RDB(只读拷贝,防二次破坏)
cp /var/lib/redis/dump.rdb /data/backup/dump.rdb.bak
# 2) 检测RDB完整性
/usr/bin/redis-check-rdb /var/lib/redis/dump.rdb
# 预期:输出 OK 表示可用;若有损坏会提示错误偏移
# 3) 从最近备份恢复(演示替换)
cp /data/backup/dump.rdb.good /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
# 4) 启动实例并验证
systemctl start redis
redis-cli INFO persistence | egrep 'rdb_last_bgsave_status|rdb_changes_since_last_save'
- 排错点:
redis-check-rdb报错:优先从备份或从库导出。- 启动后
rdb_last_bgsave_status:fail:检查磁盘剩余空间与文件权限。
AOF修复与恢复(示例与命令解释)
# 1) 备份AOF
cp /var/lib/redis/appendonly.aof /data/backup/appendonly.aof.bak
# 2) 修复AOF尾部损坏
/usr/bin/redis-check-aof --fix /var/lib/redis/appendonly.aof
# 预期:提示 truncated and fixed
# 3) 允许加载截断文件
grep -n '^aof-load-truncated' /etc/redis/redis.conf
# 若未开启,追加配置
echo "aof-load-truncated yes" >> /etc/redis/redis.conf
# 4) 启动并观察日志
systemctl start redis
journalctl -u redis -n 50 | egrep 'AOF|loading|error'
- 排错点:
- 启动卡在AOF重放:检查AOF文件过大,考虑临时切换到RDB恢复。
AOF load aborted:回退备份并用RDB恢复或从从库重建。
混合持久化场景(RDB+AOF)
# 确认混合持久化是否启用
redis-cli CONFIG GET aof-use-rdb-preamble
# 触发重写生成新AOF,减少损坏风险
redis-cli BGREWRITEAOF
- 要点:RDB快照可用时优先恢复,AOF可重建。
从库/集群恢复流程(示例)
# 选定健康节点作为恢复源,重建损坏从库
# 在损坏从库上执行:
redis-cli SLAVEOF 10.0.0.10 6379
# 观察复制状态
redis-cli INFO replication | egrep 'role|master_link_status|slave_repl_offset'
- 排错点:
master_link_status:down检查网络连通与requirepass配置。
恢复后验证清单(含命令)
# 关键Key抽样校验
redis-cli DBSIZE
redis-cli RANDOMKEY
redis-cli GET important:key:001
# 持久化与复制状态
redis-cli INFO persistence | egrep 'aof_current_size|aof_last_rewrite_status|rdb_last_bgsave_status'
redis-cli INFO replication | egrep 'role|connected_slaves|master_link_status'
练习(动手验证)
1. 人为制造AOF尾部损坏:编辑AOF末尾追加无效命令,然后用redis-check-aof --fix修复并启动。
2. 生成RDB后手动截断文件(仅在测试环境),使用redis-check-rdb验证报错并从备份恢复。
3. 模拟从库重建:对从库执行SLAVEOF指向新主,观察复制偏移变化。
预防性措施
- 定期离线备份与异地存储(RDB+AOF)。
- appendfsync everysec并监控磁盘延迟与AOF膨胀。
- 定期巡检:redis-check-rdb、redis-check-aof离线校验,提前发现潜在损坏。