docker 定时任务备份mysql数据库与恢复

1.编写执行脚本备份数据库

#! /bin/bash

#读取用户环境变量
source /etc/profile

#数据库备份目录
DATA_PATH=/home/java/backup/mysql

#容器名
DOCKER_NAME=mysql

#数据库用户及密码
DB_NAME=
DB_USER=root
PASSWORD=XXXXXX

#linux:备份mysql数据库
#mysqldump -u$DB_USER -p$PASSWORD --all-databases > $DATA_PATH/backups_$(date +%F).sql

#docker:备份容器中的数据
docker exec $DOCKER_NAME mysqldump -u$DB_USER -p$PASSWORD --all-databases > $DATA_PATH/backups_$(date +"%y-%m-%d-%H:%M").sql

#重命名文件,时间格式':'符号不能作为文件名进行ssh传输
cp $DATA_PATH/backups_$(date +"%y-%m-%d-%H:%M").sql $DATA_PATH/remote_backup.sql

#将生成的备份文件远程传到备份服务器备份, 没需求的可以注释(需要设置ssh公钥不然会失败)
scp $DATA_PATH/remote_backup.sql  [email protected]:./backup/remote_mysql/remote_backup.sql

#删除10天前的备份文件
find /var/lib/mysql -ctime +10 -name "*.sql" -exec rm -rf {} \;

脚本文件存放路径(自己根据情况放置就行)

/home/java/shell/dbBackup.sh

2.添加定时任务

打开定时任务配置文件,添加执行脚本命令。这里我用的系统级定时任务好避免一些权限问题,也可以根据需要使用用户级定时任务

sudo vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
#每隔8小时定时备份数据库
0 */8 * * * root /home/java/shell/dbBackup.sh

3.复原备份数据

将备份数据拷贝到容器中
$ docker cp backups_01.sql mysql-stage(容器名):/tmp/
进入容器中
$ docker exec -it mysql-stage(容器名) /bin/bash
进入mysql
/bin/bash: mysql -uroot -p密码
恢复数据库
mysql> source /tmp/backups_01.sql

也可以用下面命令直接恢复数据

docker exec -it mysql-stage /bin/bash -c 'mysql -uroot -pcierp123. < /tmp/backups_01.sql'

4.定时任务执行失败常见问题解决:

查看定时任务日志记录
$ sudo tail /var/log/cron
1.the input device is not a TTY:

直接执行dbBackup.sh,是可以正常执行的。创建crontab后,执行定时任务,会提示the input device is not a TTY!查找资料并测试发现,只要把-it去掉即可。

linux执行定时任务的时候没有终端设备,TTY一词源于Teletypes,或teletypewriters。其实出现该错误和我们的一个习惯有关,一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数,而在定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。

2.[Warning] Using a password on the command line interface can be insecure.

意思:在命令行中直接输入密码账号信息是不安全的。可以直接不用管,不影响具体结果

也可以通过修改mysql配置文件,添加下面内容

[mysqldump]
user=root
password=你的密码

然后重启mysql,修改mysqldump语句,去掉-uroot -p参数

3.环境变量导致的问题

直接执行dbBackup.sh,是可以正常执行的,但是定时任务执行出来的结果不对。有可能是环境变量的问题,定时任务不会加载用户的环境变量,解决方法:脚本文件主动引入环境变量

#读取用户环境变量
source /etc/profile

猜你喜欢

转载自blog.csdn.net/weixin_44863237/article/details/128892356
今日推荐