Redis 数据备份与恢复指南
Redis 提供 RDB(快照) 和 AOF(追加日志) 两种持久化方式,备份与恢复通常围绕这两种文件进行。下面系统化地介绍 备份策略、操作步骤、恢复流程、常见坑点,适用于 Redis 6/7/8(截至 2025-11-13)。
1. 持久化方式快速对比
| 方式 | 文件 | 特点 | 适用场景 |
|---|---|---|---|
| RDB | dump.rdb | 点-in-time 快照,体积小,恢复快 | 冷备、灾备、跨机迁移 |
| AOF | appendonly.aof | 每条写命令追加,数据完整性高,体积大 | 要求最大程度不丢数据 |
推荐:生产环境 RDB + AOF 同时开启(
appendonly yes+save配置),备份时两者都保留,恢复时可灵活选择。
2. 备份(Backup)
2.1 在线热备(推荐)
方法 A:BGSAVE + 复制文件
# 1. 触发后台保存(不阻塞)
redis-cli BGSAVE
# 2. 等待完成(可通过 LASTSAVE 检查时间戳)
redis-cli LASTSAVE # 返回时间戳
# 3. 复制 RDB 和 AOF(如果开启)
cp /path/to/redis/dump.rdb /backup/redis_$(date +%F_%H%M%S).rdb
cp /path/to/redis/appendonly.aof /backup/redis_$(date +%F_%H%M%S).aof
方法 B:使用 CONFIG GET dir 动态定位
DIR=$(redis-cli CONFIG GET dir | tail -1)
RDB=$(redis-cli CONFIG GET dbfilename | tail -1)
redis-cli BGSAVE
cp "$DIR/$RDB" /backup/
方法 C:Redis 官方 redis-check-rdb 校验备份完整性
redis-check-rdb /backup/dump_2025-11-13.rdb
2.2 离线冷备(停机)
redis-cli SHUTDOWN
cp /var/lib/redis/dump.rdb /backup/
cp /var/lib/redis/appendonly.aof /backup/
注意:冷备会中断服务,仅用于维护窗口或单机测试。
2.3 自动化脚本示例(Linux Cron)
#!/bin/bash
TS=$(date +%F_%H%M%S)
BACKUP_DIR="/data/backup/redis"
mkdir -p $BACKUP_DIR
# 触发后台保存
redis-cli -h 127.0.0.1 -p 6379 BGSAVE
# 等待 30 秒或轮询 LASTSAVE
sleep 5
while [ $(redis-cli LASTSAVE) -le $(date -d '30 seconds ago' +%s) ]; do
sleep 1
done
# 复制文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/redis_rdb_$TS.rdb
[ -f /var/lib/redis/appendonly.aof ] && \
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/redis_aof_$TS.aof
# 保留最近 7 天
find $BACKUP_DIR -type f -mtime +7 -delete
3. 恢复(Restore)
3.1 仅恢复 RDB(最快)
- 停服务(或在新机器启动空实例)
redis-cli SHUTDOWN
- 替换文件
cp /backup/redis_rdb_2025-11-13.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
- 启动
systemctl start redis
恢复后数据是 快照时刻 的状态,之后的所有写操作丢失。
3.2 仅恢复 AOF(最大程度不丢数据)
- 确保配置开启 AOF
appendonly yes
- 替换 AOF(可选先用
redis-check-aof --fix修复)
redis-check-aof --fix /backup/redis_aof_2025-11-13.aof
cp /backup/redis_aof_2025-11-13.aof /var/lib/redis/appendonly.aof
- 启动,Redis 会自动重放 AOF。
3.3 RDB + AOF 混合恢复(推荐)
- 先恢复 RDB(快速加载大批量数据)。
- 再把 AOF 放回,Redis 启动时会 先加载 RDB,随后 增量重放 AOF(仅重放 RDB 之后的部分)。
关键配置(确保兼容):
aof-use-rdb-preamble yes # Redis 7+ 默认开启
3.4 跨版本恢复注意
| 场景 | 操作 |
|---|---|
| 低版本 → 高版本 | 直接复制 RDB/AOF 即可 |
| 高版本 → 低版本 | 不兼容,需 redis-check-rdb 校验,或使用 MIGRATE/SYNC 导出 |
4. 高级备份方案
| 方案 | 适用 | 关键点 |
|---|---|---|
| 主从复制 + 备份从库 | 高可用 | 从库 slave-read-only yes,备份不影响主库 |
| Redis Cluster | 分布式 | 每个节点独立 BGSAVE,或使用 redis-cli --cluster backup 脚本 |
| 云原生(Redis Enterprise / AWS ElastiCache) | 云环境 | 使用快照导出 S3 / OSS |
| 逻辑备份(SCAN + DUMP) | 小数据量、跨结构迁移 | redis-cli --scan --pattern "*" | while read k; do redis-cli dump "$k"; done > dump.txt |
5. 常见问题与坑
| 问题 | 原因 | 解决 |
|---|---|---|
BGSAVE 失败,日志 Background save error | 磁盘满 / 权限 | 检查磁盘、/proc/sys/vm/overcommit_memory=1 |
| AOF 文件巨大 | auto-aof-rewrite-percentage 未配置 | auto-aof-rewrite-percentage 100 + auto-aof-rewrite-min-size 64mb |
| 恢复后数据不一致 | 备份时未 BGSAVE,直接 cp 正在写入的 RDB | 必须 BGSAVE 后再复制 |
| Cluster 节点恢复后槽不匹配 | 直接替换 RDB 破坏集群状态 | 使用 CLUSTER FORGET + CLUSTER ADDSLOTS 重建 |
6. 一键恢复脚本示例
#!/bin/bash
BACKUP_FILE=$1 # e.g. /backup/redis_rdb_2025-11-13.rdb
REDIS_DIR=/var/lib/redis
if [[ ! -f $BACKUP_FILE ]]; then
echo "Backup file not found!"
exit 1
fi
systemctl stop redis
cp "$BACKUP_FILE" "$REDIS_DIR/dump.rdb"
chown redis:redis "$REDIS_DIR/dump.rdb"
systemctl start redis
echo "Restore completed. Check with redis-cli INFO persistence"
7. 小结
- 备份:
BGSAVE→ 复制dump.rdb+appendonly.aof(推荐热备)。 - 恢复:停机 → 替换文件 → 启动(RDB 快,AOF 完整,混合最佳)。
- 生产:开启 RDB+AOF,定期校验
redis-check-rdb/aof,结合主从/云快照实现零停机备份。
如需 Redis Cluster、Sentinel、云平台 的具体备份脚本,或 自动化运维(Ansible/Terraform) 示例,随时告诉我!