Redis 数据备份与恢复

Redis 数据备份与恢复指南

Redis 提供 RDB(快照)AOF(追加日志) 两种持久化方式,备份与恢复通常围绕这两种文件进行。下面系统化地介绍 备份策略、操作步骤、恢复流程、常见坑点,适用于 Redis 6/7/8(截至 2025-11-13)。


1. 持久化方式快速对比

方式文件特点适用场景
RDBdump.rdb点-in-time 快照,体积小,恢复快冷备、灾备、跨机迁移
AOFappendonly.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(最快)

  1. 停服务(或在新机器启动空实例)
   redis-cli SHUTDOWN
  1. 替换文件
   cp /backup/redis_rdb_2025-11-13.rdb /var/lib/redis/dump.rdb
   chown redis:redis /var/lib/redis/dump.rdb
  1. 启动
   systemctl start redis

恢复后数据是 快照时刻 的状态,之后的所有写操作丢失。

3.2 仅恢复 AOF(最大程度不丢数据)

  1. 确保配置开启 AOF
   appendonly yes
  1. 替换 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
  1. 启动,Redis 会自动重放 AOF。

3.3 RDB + AOF 混合恢复(推荐)

  1. 先恢复 RDB(快速加载大批量数据)。
  2. 再把 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. 小结

  1. 备份BGSAVE → 复制 dump.rdb + appendonly.aof(推荐热备)。
  2. 恢复:停机 → 替换文件 → 启动(RDB 快,AOF 完整,混合最佳)。
  3. 生产:开启 RDB+AOF,定期校验 redis-check-rdb/aof,结合主从/云快照实现零停机备份。

如需 Redis ClusterSentinel云平台 的具体备份脚本,或 自动化运维(Ansible/Terraform) 示例,随时告诉我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部