shell脚本定时备份docker部署的MySQL数据库

之前由于服务器一直被攻击,数据库总是中勒索病毒,在前篇文章中,说了一些提高安全性的办法,但是我认为还是有些不靠谱。也结合之前研究定时备份的脚本,今天来写一篇关于定时备份数据的文章。

一、脚本

我的MySQL是使用docker部署的,所以备份的命令是要通过docker进入容器,再执行备份命令。

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="root"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4"
 
# 备份文件存放地址(根据实际情况填写)
backup_location=/usr/local
 
# 是否删除过期数据
expire_backup_delete="ON"
expire_days=7
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
 docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1 > $backup_dir/mysql_backup_test-$backup_time.sql
 
# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
        `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
        echo "Expired backup data delete complete!"
fi

说明:
上边主要都是对变量的定义,已经有详细说明了,我这里主要是对备份的命令进行解释

docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1 > $backup_dir/mysql_backup_test-$backup_time.sql

撇开这些,我们进入容器,来测试一下备份的命令,先对命令拆解分析

# docker进入容器的命令
docker exec -it 容器名
# 备份数据库的命令
mysqldump -uroot -p123456 -B 数据库名 > /usr/111.sql

连起来就是(这是我这边的命令,你本人根据自己实际情况进行修改)

docker exec -it mysql01 mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql

二、定时任务

# 启动定时任务
crontab -e

# 将定时任务写入其中 分 时 日 月 年
* * * * * /bin/bash /usr/data/backup/backupdb.sh

# 查看定时任务列表
crontab -l

2020年7月6日19:43:44二次补充

今天早上起来进入服务器查看昨晚写的定时备份脚本有没有执行成功,进入备份目录,发现生成了文件,然后cat查看发现没有任何输出,就很奇怪,明明昨天手动执行成功了,可是放进crontab里定时执行就出了问题,为什么?

带着这个问题我百度了好久好久好久好久,网上普遍说的是两种情况,一、mysqldump命令的路径没有给全,二、环境变量没有添加;

结合这两个方向,我进行了所有解决方案的尝试,全部以失败告终;

失败一,补全mysqldump命令的路径
如果你是直接装在服务器上的MySQL也许这对你而言不会很复杂,网上绝大多数的解决方案也是基于此,但是我的MySQL是docker装的,所以我需要进入容器来找他的mysqldump的位置。然后补全

docker exec -it mysql01 /usr/bin/mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql

其中,/usr/bin 就是容器里mysqldump文件的路径
结果:失败

失败二,添加环境变量
way1:在脚本里添加

source /etc/profile
这里被我注释了
在这里插入图片描述

结果:失败

way2:在执行任务的脚本里添加

crontab -e

*/1 0 * * * source profile;/home/backup/mysql_backup_test_backup.sh 2>&1

结果:失败

然后又林林总总找了很多办法,但是出发点和方向都是这两个,而且也一直没有成功,看网上信誓旦旦说的一定成功,评论也有成功的,可是我就成功不了,搞得我很怀疑人生;最后我开始怀疑这个命令是不是有问题?虽然手动执行是正常的,也许因为什么原因,自动执行就出现问题了,于是我开始百度“crontab执行docker”,不得不说,百度对方向真的很重要,划重点。一百度就找到问题了

在这里插入图片描述
跟加了 -it参数有关系

Your docker exec command says it needs “pseudo terminal and runs in interactive mode” (-it flags) while cron doesn’t attach to any TTYs.
大致意思 exec 加了 -it 参数就开启了一个终端,计划任务是无法进入任何终端的。

把 docker exec 的参数 -it 去掉后问题解决了。

看了这个我才知道原来是这个原因,然后再想想之前他们的帖子,貌似也确实没有 -it的参数,然后放入定时任务执行,果然成功了,哎,真艰辛!

docker exec mysql01 mysqldump -uroot -p123456 -B cj > $backup_dir/cj-$backup_time.sql

猜你喜欢

转载自blog.csdn.net/Curtisjia/article/details/107143830