L O A D I N G
«

mysql dump文件大小_crontab mysqldump 定时任务 备份 及 创建文件 大小 为 0 解决方案+分析...

童话里,我们在一起 发布于 阅读:647 群辉


今天现网Mysql数据库要求开始做备份,于是决定把mysqldump命令写到脚本里,然后做到crontab里让它每天定时执行。
系统:centos7.9,Mysql5.7
路径:/tmp/tmp
mysqldump写到test.sh,:wq保存后,赋予执行权限:
mysqldump -A -uroot -pyourpassword > /tmp/tmp/mysqlallbak.sql chmod a+x test.sh
接下来手工执行一下
./test.sh

[root@local tmp]# ll total 648 -rw-r--r-- 1 root root 662849 Nov 29 10:20 mysqlallbak.sql
有sql文件生成,文件大小不为0,一切正常,美滋滋。
接下来删掉那个sql文件,做定时任务,把脚本加入定时执行,设10点22
crontab -e 22 10 * * * /tmp/tmp/test.sh
时间一到,马上到tmp下查看
[root@local tmp]# ll total 0 -rw-r--r-- 1 root root 0 Nov 29 10:22 mysqlallbak.sql
文件确实有,可大小为0,打开看就是个空文件。
检查步骤:
1.打开脚本仔细检查,看是不是语句里忘写mysql登陆密码。
2.脚本检查无误,crontab -e仔细检查定时任务是否有误。
3.crontab检查无误,开始怀疑crontab本身有问题。百度了一下,大多数解决方案是,mysqldump命令写成绝对路径即可。
于是
[root@neoska tmp]# find / -name mysqldump /usr/local/mysql/bin/mysqldump
打开脚本,把mysqldump换成/usr/local/mysql/bin/mysqldump,重新crontab测试,果然奏效了。
4.用绝对路径写了脚本,测了几次,没问题。但手工执行成功,定时任务挂掉,百思不得其解,遂继续百度之。
原来crontab运行时,使用自己的环境变量,相当于独立的环境。
其自动运行的环境配置写在/etc/crontab。
于是打开看看
[root@neoska tmp]# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # 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
!有个PATH长的好像系统环境变量PATH!
这个path里,没有步骤3中mysqldump的路径,因此肯定是crontab的环境找不到mysqldump指令,自然也不能执行成功。
原因弄明白了,问题就好解决了。
方案1
采用软链接方式,将mysqldump软链接到crontab配置文件中PATH后面的任意一个下,如/usr/bin:
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
回去编辑脚本,把mysqldump的绝对路径删掉,保存重新crontab测试,成功。
方案2
修改/etc/crontab的内容,在PATH最后面加上:/Your_project_path(注意冒号别掉了)(此处就是mysqldump的存放路径/usr/local/mysql/bin/)保存退出。
没有软链接的情况下,测试成功。
总结
crontab运行采用独立环境,PATH变量可在/etc/crontab文件中编辑。不只是mysql或mysqldump,所有自定义的命令,都可采用这两种方法,让crontab能够找到该指令,这样就不会出现crontab定时脚本不能执行的现象。
另外,一些需要更改环境变量才能执行的项目,可以在脚本开头写上source /etc/profile或者JAVA_HOME=XXXXX/export XXXXX(使用指定jdk等),来指定该脚本需要的环境变量。
参考资料
Linux中crontab的坑爹环境变量问题
http://blog.csdn.net/dancen/article/details/24355287
corantab 不能自动执行的一些问题-环境变量
http://xiachaofeng.iteye.com/blog/1405184
mysqldump参数之-A -B
http://blog.csdn.net/u010587433/article/details/47417051
附录
完整脚本
#创建一个以当天日期为名的文件夹如171129 mkdir -p /home/neoska/backup/data/`date +%Y%m%d` #写备份文件,-A为备份所有库。其他常用选项:-B database1 database2 ...为指定的多个库,-d为只导出表结构,-h40.11.12.13为备份IP为10.11.12.13的远程数据库。 mysqldump -A -uroot -ppasswd > /home/neoska/backup/data/`date +%Y%m%d`/mysqldumpall.sql #删掉3天前的备份数据,可自定义周期,若数据太大则应设小点以免磁盘写满。 rm -rf /home/neoska/backup/data/`date +%Y%m%d -d "-3days"`
原文出处:Neoska’s Blog -> http://www.neoska.me/archives/167/


扫描二维码,在手机上阅读

推荐阅读:

收藏