记录一次在两台服务器上同时配置 crontab 定时备份 Docker 部署的 MySQL 的经历 .

先说下表现 , 一台轻量服务器上表现正常 , 另外一台云服务器失效 , 完全没有执行定时任务 . 解决未执行的问题后 , 又遇到导出的数据为空问题 , 以下记录下解决办法

Crond 未执行

格式混淆

这个问题一般是 /etc/crontabcontab -e 两种格式混淆

定时任务有两种编辑方法 , 一种是 root 用户下编辑 /etc/crontab 命令是 vim /etc/crontab

一种是在特定用户身份下 (可能是root,可能非root) 执行 crontab -e 进行编辑

前者的格式相比于后者 , 多了一个表示执行命令的 “用户身份” 的字段

echo "right" >> /tmp/output1.txt 命令为例

在编辑 /etc/crontab 时需要写成

1
*/1 * * * * root echo "right" >> /tmp/output1.txt

crontab -e 的情况需要写成

1
*/1 * * * * echo "right" >> /tmp/output1.txt

crond 服务未启动

service crond status 命令检查服务运行状态

若未启动 , 则执行命令启动

1
service crond start

Crond 已执行,但是数据备份为空

情况一

通常我们的备份定时任务是执行一个 shell

1
0 2 * * * root sh /tmp/backup.sh

手动执行时可以正常导出数据 , 但是定时任务执行时导出数据为空 , 这种情况可能是导出时缺少某些环境变量 , 需要在 shell 文件开头 #!/bin/sh 下面增加

1
2
source /etc/profile
source ~/.bash_profile

情况二

而用 docker 安装的 MySQL 数据备份明显不适用于以上情况 ,这里导出为空是因为备份脚本有问题

在执行 docker exec -it 时 -it 参数开启了一个终端 , 计划任务是无法进入任何终端的 , 需要将命令行中的 -it 参数去除

这里附上完整的备份脚本 backup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

DAT=`date +%m%d`
HOR=`date +%H`
begin=`date +%F" "%T`
# 目录类似 /tmp/db
DIR=目录

if [[ ! -d $DIR/$DAT ]];then
mkdir $DIR/$DAT
fi

# 这里list文件放在指定目录下,内容未要备份的数据库名一行一个
for i in `cat ${DIR}/mysql-back.list`
do
docker exec mysql容器名 mysqldump -u账号名 -p密码 $i > $DIR/$DAT/$i-$DAT$HOR.sql
done
find $DIR/* -mtime +20 -exec rm -rf {} \;
end=`date +%F" "%T`

echo "$begin dump mysql -------> $end has done" >> ${DIR}/mysqldump.log

参考链接