8.3.5 数据损坏修复与恢复流程

数据损坏修复与恢复流程#

  • 典型损坏场景:磁盘故障导致RDB/AOF文件不完整、进程异常退出引发AOF尾部损坏、误操作覆盖数据文件、主从切换期间文件未刷盘。
  • 处置前置原则:立即停止写入、隔离实例、对现有RDB/AOF做只读备份(拷贝到安全路径),避免二次破坏。

原理草图(恢复决策路径)

文章图片

环境与工具安装
- Redis自带工具一般位于/usr/bin/或源码src/下:redis-check-rdbredis-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-rdbredis-check-aof离线校验,提前发现潜在损坏。