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 java@192.168.20.2:./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