redis数据备份shell脚本(为了可以回滚到当天版本)

  • 这个脚本是我会放2个版本,第一个版本是带有中文详细注释的。第二个版本是无注释清爽版。
  • 这个脚本的作用是每天备份一下/vdb/redis/dump_6379.rdb这个文件。
  • dump_6379.rdb这个文件是Redis 数据库服务器生成的 RDB(Redis Database)持久化文件。每天的这个dump_6379.rdb中的内容都是不一样的,这样我按天来备份这个dump_6379.rdb文件,并且放在以当天日期为名字的文件夹中,这样可以方便后面加载这个 RDB 文件来恢复指定哪天的数据状态;
  • 举个例子,我在2024年10月9日备份了/vdb/redis/dump_6379.rdb这个文件,并把备份文件压缩后放在/vdb/redis_dump中,这样的话,假如我2024年10月11号想看10月9日的redis数据的时候,就可以用他来恢复10月9日当天的redis数据了。
  • 解释完成,下面请看bash脚本
bash 复制代码
#!/bin/bash
#para
 给day赋值为当天的日期,假设今天是2024年10月1日,那么day=20241001
day=`date "+%Y%m%d"`   

给day_del赋值为七天前的日期,假设今天是2024年10月1日,那么day_del=20240924
day_del=`date -d "7 day ago" +%Y%m%d`  

在/vdb/redis中查找"dump.*.rdb"这个字眼的东西。如果存在/vdb/redis/dump_6379.rdb这个文件,那么file=/vdb/redis/dump_6379.rdb
files=`find /vdb/redis|grep dump.*.rdb`

/vdb/redis_dump作为备份的文件夹
bakdir="/vdb/redis_dump"

假日今天是2024年10月1日,那么运行了这个脚本到这一行,就会创建/vdb/redis_dump/20241001这个文件夹
mkdir -p $bakdir/$day

一般来说dump.*.rdb这样的文件可能会有多个,也可能只有一个,看你们是怎么部署的了,主从部署的话只有一个。
for file in $files
do
输出这样一句话"2024年10月1日 COPY /vdb/redis/dump_6379.rdb TO /vdb/redis_dump/20241001",也就是说
echo `date`  COPY $file TO $bakdir/$day

把/vdb/redis/dump_6379.rdb 复制到这个文件夹下面/vdb/redis_dump/20241001,并将其以gz格式来压缩
cp  $file $bakdir/$day && gzip $bakdir/$day/*

如果上一个命令的退出状态码(存储在 $? 变量中)等于 0 ,则输出 "$file bak Successful" ,反之则输出"file bak EEOR",
就是上一句代码"cp  $file $bakdir/$day && gzip $bakdir/$day/*"执行成功了,他的退出状态码才会是0的
if [ $? -eq 0 ];then
echo "$file bak Successful"
else
echo "$file bak EEOR"
exit
fi
done

#del dump
打开/vdb/redis_dump这个路径
cd $bakdir

在当前/vdb/redis_dump这个路径下,搜索以20开头,并且第三第四个元素是0-9中的数字,然后让bak这个参数在其中for循环。
for bak in `ls | grep ^20[0-9][0-9]`
do

首先echo $bak 输出变量 $bak 的值。
然后,cut -c 1-10 从输出的结果中截取前 10 个字符。
最后,sed 's/-//g' 把截取到的这 10 个字符中的 - 全部删除
最后拿这个结果和day_del这个参数进行比较,-le 是 "小于或等于" 的比较运算符
假设今天是2024年10月1日,那么day_del就是20240924,
当bak循环到20241001,那么day_del就是20240924,也就是20241001和20240924来比较大小
20241001没有小于等于20240924,所以不执行后面的代码。
然后当bak循环到20240923,20240923小于等于20240924,所以要执行后面的代码
也就是迭代删除掉20240923这个文件夹中的内容并输出"20240923 need to delete"
        if [ `echo $bak | cut -c 1-10 | sed 's/-//g'` -le $day_del ]
        then
                echo "$bak need to delete"
                rm -rf $bak

如果上一条指令执行成功了,那么上调指令的退出状态码(存储在 $? 变量中)等于 0 ,if判断语句逻辑为
 $? -ne 0 意思是退出状态码$?不等于0
                if [ $? -ne 0 ]
                then
                        echo "ERROR when delete the bak: $bak !!"
                else
                        echo "Delete $bak Successful"
                fi
        fi
done

以下是没有注释的清爽版

bash 复制代码
#!/bin/bash

#para
day=`date "+%Y%m%d"`
day_del=`date -d "7 day ago" +%Y%m%d`
files=`find /vdb/redis|grep dump.*.rdb`
bakdir="/vdb/redis_dump"


mkdir -p $bakdir/$day

for file in $files
do
echo `date`  COPY $file TO $bakdir/$day
cp  $file $bakdir/$day && gzip $bakdir/$day/*
if [ $? -eq 0 ];then
echo "$file bak Successful"
else
echo "$file bak EEOR"
exit
fi
done

#del dump
cd $bakdir
for bak in `ls | grep ^20[0-9][0-9]`
do
        if [ `echo $bak | cut -c 1-10 | sed 's/-//g'` -le $day_del ]
        then
                echo "$bak need to delete"
                rm -rf $bak
                if [ $? -ne 0 ]
                then
                        echo "ERROR when delete the bak: $bak !!"
                else
                        echo "Delete $bak Successful"
                fi
        fi
done
相关推荐
Paraverse_徐志斌4 小时前
MySQL 线上大表 DDL 如何避免锁表(pt-online-schema-change)
数据库·mysql·ddl·mysql锁·锁表·pt-osc
哈哈幸运4 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
愚公搬代码4 小时前
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
数据库·爬虫·python
pwzs4 小时前
深入浅出 MVCC:MySQL 并发背后的多版本世界
数据库·后端·mysql
大熊猫今天吃什么5 小时前
【一天一坑】空数组,使用 allMatch 默认返回true
前端·数据库
双叶8365 小时前
(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)
c语言·数据库·单片机·嵌入式硬件·mongodb·51单片机·nosql
XY.散人5 小时前
初识Redis · C++客户端list和hash
数据库·redis·缓存
码上飞扬6 小时前
深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南
数据库·mysql
海洋与大气科学6 小时前
【matlab】地图上的小图
开发语言·数据库·matlab
Geek__19927 小时前
Sqlite3交叉编译全过程
jvm·数据库·sqlite