以redis备份为例,rdb适合做冷备,我们只需要备份dump文件即可
- 写crontab定时调度脚本做数据备份
- 每小时都copy一份rdb的备份到一个目录中去,仅仅保留最近48小时的备份
- 每天都保留一份当日的rdb的备份到一个目录中去,仅仅保留最近一个月的备份
- 每次copy备份的时候都删除太久的备份文件
- 每天晚上将当前服务器的所有数据备份,发送一份到远程的云服务器上
- 当前位置
- 创建copy目录并进入 mkdir copy && cd copy 这个目录主要放脚本
- 创建按小时备份的脚本 vi redis-rdb-copy-hourly.sh
-
#!/bin/sh cur_date=`date +%Y%m%d%k` rm -rf /usr/local/docker/redis/snapshotting/$cur_date mkdir -p /usr/local/docker/redis/snapshotting/$cur_date cp /usr/local/docker/redis/data/dump.rdb /usr/local/docker/redis/snapshotting/$cur_date cp /usr/local/docker/redis/data/appendonly.aof /usr/local/docker/redis/snapshotting/$cur_date del_date=`date -d -48hour +%Y%m%d%k` rm -rf /usr/local/docker/redis/snapshotting/$del_datel_date
-
赋予权限 chmod 777 redis-rdb-copy-hourly.sh
-
返回上一级目录并创建snapshotting文件夹 cd .. && mkdir snapshotting 用来存放备份文件
-
创建定时任务 crontab -e
-
0 * * * * sh /usr/local/docker/redis/copy/redis-rdb-copy-hourly.sh
每小时的0分执行脚本
- 创建按天备份的脚本 cp redis-rdb-copy-hourly.sh redis-rdb-copy-daily.sh
- vi redis-rdb-copy-daily.sh
-
#!/bin/sh cur_date=`date +%Y%m%d` rm -rf /usr/local/docker/redis/snapshotting/$cur_date mkdir -p /usr/local/docker/redis/snapshotting/$cur_date cp /usr/local/docker/redis/data/dump.rdb /usr/local/docker/redis/snapshotting/$cur_date cp /usr/local/docker/redis/data/appendonly.aof /usr/local/docker/redis/snapshotting/$cur_date del_date=`date -d -1month +%Y%m%d` rm -rf /usr/local/docker/redis/snapshotting/$del_date
-
添加定时任务 crontab -e
-
0 * * * * sh /usr/local/docker/redis/copy/redis-rdb-copy-hourly.sh 0 0 * * * sh /usr/local/docker/redis/copy/redis-rdb-copy-daily.sh
每天的0时0分执行脚本
-
可以手动执行 [root@localhost redis]# ./copy/redis-rdb-copy-daily.sh 进行测试 (先创建一个过期时间的目录)
数据恢复
当开启了appendonly=yes后,如果同时存在appendonly.aof和dump.rdb,redis会有限使用appendonly.aof进行恢复.
当redis自动生成的appendonly.aof和dump.rdb损坏或者丢失后,我们用备份的dump.rdb来进行恢复.
- 首先修改docker-compose.yml,去掉--appendonly yes
- 将备份文件复制到data目录 [root@localhost data]# cp ../snapshotting/2019102220/dump.rdb .
- 启动docker-compose up -d
- 进入 docker exec -it redis-master bash
- 连接 redis-cli
- 查看键 keys *
- 此时数据已经通过dump.rdb恢复
- 下面要开启appendonly, config get appendonly
- 退出,查看data目录有了appendonly.aof文件
- 停止 docker-compose down
- 修改docker-compose.yml,加上之前删除的--appendonly yes,然后再启动docker-compose.这样我们的数据也恢复了,redis也开启了appendonly. 之所以这样麻烦,是因为redis开启了appendonly后,如果data目录没有appendonly.aof文件,会自动创建一个空的appendonly.aof,然后用空的appendonly.aof去恢复数据,这样我们备份的dump.rdb没起作用.