侧边栏壁纸
博主头像
mnshy 博主等级

行动起来,活在当下

  • 累计撰写 5 篇文章
  • 累计创建 3 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Redis备份与恢复

mnshy
2025-01-20 / 0 评论 / 2 点赞 / 54 阅读 / 0 字

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,否则无效
  1. 同步保存 RDB 快照文件

    /usr/local/redis/bin/redis-cli SAVE

  2. 备份保存的 dump.rdb 文件。

    cp /usr/local/redis/date/dump.rdb /data/databak/redisbak/

  3. 停用需要恢复的 redis

    systemctl stop redis

  4. 将 dump.rdb 文档复制到对应目录下

    cp /data/databak/redisbak/dump.rdb /usr/local/redis/date/

  5. 启动恢复备份 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。
  1. 直接打包并复制文件

    tar -czvf /usr/local/redis/data/redis_backup.tar.gz -C /usr/local/redis/data/appendonlydir

  2. 停用需要恢复的 redis

    systemctl stop redis

  3. 将 redis_backup.tar.gz 解压到对应目录下

    tar -zxvf redis_backup.tar.gz -C /usr/local/redis/data/appendonlydir

  4. 启动 redis 读取文件恢复数据

    systemctl start redis

2

评论区