返回首页

Redis 备份恢复实战 — 备份脚本 / 恢复流程 / 容灾方案

📅 创建于 2026-05-08 🔄 更新于 2026-05-08 📝 435 字

Redis 备份恢复实战

核心原则: 备份不等于恢复。有了备份文件不算完,必须定期演练恢复流程。

四层备份策略

层级 方案 目的 成本
L1 自动持久化(RDB + AOF) 防进程崩溃 最低
L2 定时全量备份(RDB 文件) 防误操作/灾难
L3 增量备份(AOF 文件) 时间点恢复
L4 异地容灾(跨机房/S3) 防本地灾难

推荐备份频率

容忍度 RDB 快照 AOF 策略 外部备份
1 小时 每小时 everysec 每天
15 分钟 每 15 分钟 everysec 每 6 小时
1 分钟 每 1 分钟 everysec 每 1 小时
1 秒 辅助 RDB always 每 30 分钟

备份脚本

RDB 备份(crontab 每天凌晨)

#!/bin/bash
# redis_rdb_backup.sh
BACKUP_DIR="/data/redis_backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/dump_${DATE}.rdb"
REDIS_DATA_DIR="/var/lib/redis"
MAX_BACKUPS=7

mkdir -p ${BACKUP_DIR}
redis-cli BGSAVE
sleep 2

# 等待 BGSAVE 完成
while [ $(redis-cli LASTSAVE) -eq $(redis-cli LASTSAVE) ]; do sleep 1; done

cp ${REDIS_DATA_DIR}/dump.rdb ${BACKUP_FILE}

# 清理旧备份
cd ${BACKUP_DIR} && ls -t dump_*.rdb | tail -n +$((MAX_BACKUPS+1)) | xargs -r rm -f

综合备份(RDB + AOF + S3)

# /etc/cron.d/redis_backup
0 3 * * * root /usr/local/bin/redis_backup.sh >> /var/log/redis_backup.log 2>&1

完整的综合备份脚本见原始文章:RDB 快照 → 复制 RDB → 复制 AOF → 生成备份信息 → 上传 S3 → 清理旧备份。


恢复操作流程

标准恢复(本地备份)

① 记录当前状态 → ② 停止 Redis → ③ 备份现有数据文件(防二次损失)
④ 复制备份文件 → ⑤ 设置权限 → ⑥ 启动 Redis → ⑦ 验证数据
# 1. 停止
systemctl stop redis
# 或 redis-cli SHUTDOWN NOSAVE

# 2. 备份现有数据(防二次损失)
mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak_$(date +%Y%m%d)
mv /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak_$(date +%Y%m%d)

# 3. 复制备份
cp /data/redis_backup/20240115/dump_20240115.rdb /var/lib/redis/dump.rdb
cp /data/redis_backup/20240115/appendonly_20240115.aof /var/lib/redis/appendonly.aof

# 4. 启动并验证
systemctl start redis
redis-cli PING
redis-cli DBSIZE
redis-cli INFO keyspace

AOF 修复

# AOF 文件损坏时
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak
redis-check-aof --fix /var/lib/redis/appendonly.aof

从 RDB 恢复(AOF 禁用时)

停止 Redis → 注释 appendonly yes 或设为 no → 确保 RDB 存在 → 启动 → 确认数据 → 重新开启 AOF


主从架构下的备份

备份应在从库执行,不影响主库性能。

redis-cli -h <slave-ip> BGSAVE
# 等待 LASTSAVE 更新后
scp <slave-ip>:/var/lib/redis/dump.rdb /data/backup/dump_$(date +%Y%m%d).rdb

容灾方案

跨机房备份

tar czf /tmp/redis_backup_${DATE}.tar.gz ${SOURCE_DIR}
rsync -avz --bwlimit=5000 /tmp/redis_backup_${DATE}.tar.gz \
  user@dr-site:/mnt/dr_backup/redis/

云对象存储(S3)

aws s3 cp /tmp/redis_${DATE}.tar.gz s3://my-redis-backups/
aws s3api put-object-lifecycle-configuration \
  --bucket my-redis-backups \
  --lifecycle-configuration '{"Rules":[{"ID":"expiry","Prefix":"redis_","Status":"Enabled","Expiration":{"Days":30}}]}'

关键提醒

  • 主从不是备份 — 主从切换依然可能丢数据,复制不能替代备份。Redis 高可用方案参见 redis-ha-replication-sentinel
  • 定期演练恢复 — 很多团队的备份文件实际上无法恢复
  • 生产操作前先备份配置 — 修改 redis.conf 前先备份
  • 监控持久化状态rdb_last_bgsave_statusaof_last_write_status 必须告警
  • 安全配置rename-command FLUSHALL ""requirepassprotected-mode

关联页面

页面关联点
redis-persistence-strategyRedis 持久化机制 RDB/AOF/混合模式(备份的数据基础)
redis-ha-replication-sentinelRedis 高可用:主从复制/哨兵/脑裂/集群踩坑
redis-memory-optimizationRedis 内存优化完全指南(fork/COW 对 BGSAVE 的影响)