Redis备份与恢复
前言 备份前需要先确定redis是否开启持久化。
方法一 只要网络环境互通就行
方法二 适用于未打开持久化
方法三 适用于打开持久化
# 持久化配置查询
[root@ops /root]# grep -E 'bind|dir |appendonly' /usr/local/redis/redis.conf |grep -v '^\s*#'
bind 0.0.0.0 -::1 # 所有ipv4可以连接redis并禁用ipv6
dir /usr/local/redis/data # 指定 Redis 用来存储数据文件的路径
appendonly yes # 启用或禁用 AOF(Append-Only File)持久化方式
appendfilename "appendonly.aof" # 指定 AOF 文件的名称
appenddirname "appendonlydir" # 指定 AOF 文件存储的目录
方法一 数据迁移
两个环境一致的情况下建议使用此方法,方便对比数据,操作简单,不用管是否启用持久化。
在需要备份的服务器执行如下脚本:(**注意IP**)
#!/bin/bash
# 导出库配置
src_redis="192.168.1.11" # 源 Redis IP(导出库)
src_port="6379" # 源 Redis 端口(导出库)
# 导入库配置
dest_redis="192.168.1.12" # 目标 Redis IP(导入库)
dest_port="6379" # 目标 Redis 端口(导入库)
# 成功导入的键数计数器
total_success=0
# 遍历 Redis 数据库 0-15(注意看库名是否一致)
for db in {0..15}; do
echo "正在处理数据库 ${db}..."
keys=$(redis-cli -h ${src_redis} -p ${src_port} -n ${db} keys "*")
keys_count=$(echo "$keys" | wc -l)
count=0
for key in $keys; do
# 尝试迁移每个键并检查结果
if redis-cli -h ${src_redis} -p ${src_port} -n ${db} migrate ${dest_redis} ${dest_port} "${key}" ${db} 1000 copy replace > /dev/null 2>&1; then
((total_success++))
fi
((count++))
# 打印进度条
printf "\r进度: %d/%d 个键" "$count" "$keys_count"
done
echo # 换行
done
# 打印总成功数
echo "总共成功迁移的键数: ${total_success}"
方法二 使用 RDB 快照备份与恢复(恢复需要禁用 AOF 持久化 appendonly no,否则无效)
-
同步保存 RDB 快照文件
/usr/local/redis/bin/redis-cli SAVE
-
备份保存的 dump.rdb 文件。
cp /usr/local/redis/date/dump.rdb /data/databak/redisbak/
-
停用需要恢复的 redis
systemctl stop redis
-
将 dump.rdb 文档复制到对应目录下
cp /data/databak/redisbak/dump.rdb /usr/local/redis/date/
-
启动恢复备份 redis
systemctl start redis
附redis备份脚本
#!/bin/bash
# 设置变量
redis_bin_path="/usr/local/redis/bin/redis-cli"
rdb_path="/usr/local/redis/data/dump.rdb"
backup_path="/data/databak/redisbak"
log_file="$backup_path/redis_backup_log.txt"
# 打印并记录日志
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$log_file"
}
# 创建备份文件存放路径
if [ ! -d "$backup_path" ]; then
log_message "文件夹 $backup_path 不存在,正在创建..."
mkdir -p "$backup_path"
if [ $? -eq 0 ]; then
log_message "文件夹 $backup_path 创建成功!"
else
log_message "文件夹 $backup_path 创建失败!"
exit 1
fi
else
log_message "文件夹 $backup_path 已经存在,跳过创建."
fi
# 执行 RDB 快照备份
log_message "开始执行 Redis RDB 快照备份..."
$redis_bin_path SAVE
# 检查 SAVE 命令是否成功执行
if [ $? -eq 0 ]; then
log_message "RDB 快照备份成功!开始复制 dump.rdb 文件..."
# 备份 dump.rdb 文件
cp "$rdb_path" "$backup_path"
if [ $? -eq 0 ]; then
log_message "dump.rdb 文件备份成功!备份路径:$backup_path"
else
log_message "dump.rdb 文件备份失败!"
exit 1
fi
else
log_message "RDB 快照备份失败!请检查 Redis 服务状态。"
exit 1
fi
方法三 开启 AOF 持久化的备份与恢复
导出数据的redis和导入数据的redis,数据目录必须一样,不然可能会失败。我理解的逻辑就是备份数据文件然后复制到另一个redis启动度文件,恢复前建议停止redis。
-
直接打包并复制文件
tar -czvf /usr/local/redis/data/redis_backup.tar.gz -C /usr/local/redis/data/appendonlydir
-
停用需要恢复的 redis
systemctl stop redis
-
将 redis_backup.tar.gz 解压到对应目录下
tar -zxvf redis_backup.tar.gz -C /usr/local/redis/data/appendonlydir
-
启动 redis 读取文件恢复数据
systemctl start redis
评论区