crontab 执行docker exec命令(mysql备份)

前人挖坑后人遭殃

最近小编在开发项目的时候发现竟然没有数据备份(为防止系统出现操作失误或系统故障导致数据丢失),项目没有数据备份怎么能行,万一哪一天数据丢失了可怎么整,岂不是让总监diss,是可忍孰不可忍。

crontab 执行docker exec命令(mysql备份)

操作(源代码)

噼里啪啦一通操作猛如虎,写了个备份mysql容器的脚本如下:

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="xxxxx"
mysql_host="110.110.110.110"
mysql_port="3306"
container_name="mysql8.0.20"
# 备份文件存放地址
backup_location=/data/wechat_backup
# 是否删除过期数据
expire_backup_delete="ON"
expire_days=1
backup_time=$(date +%Y%m%d%H%M)
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
echo "$welcome_msg"
# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
/usr/bin/docker exec -it $container_name mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B database_name >$backup_dir/wechat_mysql_backup-$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

测试一下bash ./mysql_backend.sh,生成数据,大功告成。

crontab 执行docker exec命令(mysql备份)

把脚本推到服务器,开启我的crontab,大功告成。

crontab -e 
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
50 23 * * * sh /root/mysql_backend.sh

service cron restart

无情打脸

上班第二天小编高兴的向总监展示自己成果,cd .......ll........纳尼,0kb ????

crontab 执行docker exec命令(mysql备份)

为什么是空文件。啪啪打脸。。。无处安放的双手噼里啪啦不知道在敲打着什么命令,一边小时嘀咕:不应该啊,昨天都已经测试过,为什么没有数据。。。。

crontab 执行docker exec命令(mysql备份)

回到工位小编开始反思哪里出了问题,网上查了资料,有的说文没有权限,有的说没有root权限,各种都尝试了还是不行,问总监显得多尴尬。一度怀疑自己是不是自己脚本写错了,明明手动执行没问题,放到计划任务就备份文件大小为0.怎么都不行(小编的操作系统是Linux18.04)。

解决方案

谷歌搜索结果(百度搜了许久,没一个靠谱的答案):

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 参数就开启了一个终端,计划任务是无法进入任何终端的。

修改后的正确脚本如下:

#!/bin/bash
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="xxxxx"
mysql_host="110.110.110.110"
mysql_port="3306"
container_name="mysql8.0.20"
# 备份文件存放地址
backup_location=/data/data/wechat_backup
# 是否删除过期数据
expire_backup_delete="ON"
expire_days=1
backup_time=$(date +%Y%m%d%H%M)
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
echo "$welcome_msg"
# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
/usr/bin/docker exec $container_name /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B predictor_dev >$backup_dir/wechat_mysql_backup-$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

修改crontab每两分钟执行一次,查看备份目录:

crontab 执行docker exec命令(mysql备份)

搞定!!!

crontab 执行docker exec命令(mysql备份)

总结

遇到问题多去一些知名网站查阅资料

推荐:Google、stackoverflow、官网

另外:bash脚本尽量写绝对路径

/usr/bin/docker exec container_name /usr/bin/mysqldump.......

是不是解决你们的问题了,欢迎大神指点交流,关注并私信小编,我们一起学编程啊。

crontab 执行docker exec命令(mysql备份)

展开阅读全文

页面更新:2024-04-15

标签:备份   文件大小   大神   终端   大功告成   脚本   总监   命令   用户名   密码   操作   地址   数据库   计划   数据   资料   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top