Crond 定时备份MySQL失败
记录一次在两台服务器上同时配置 crontab 定时备份 Docker 部署的 MySQL 的经历 .
先说下表现 , 一台轻量服务器上表现正常 , 另外一台云服务器失效 , 完全没有执行定时任务 . 解决未执行的问题后 , 又遇到导出的数据为空问题 , 以下记录下解决办法
Crond 未执行
格式混淆
这个问题一般是 /etc/crontab
与 contab -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 | source /etc/profile |
情况二
而用 docker 安装的 MySQL 数据备份明显不适用于以上情况 ,这里导出为空是因为备份脚本有问题
在执行 docker exec -it
时 -it 参数开启了一个终端 , 计划任务是无法进入任何终端的 , 需要将命令行中的 -it 参数去除
这里附上完整的备份脚本 backup.sh
1 | !/bin/bash |
参考链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Halcyon Days!