今天现网Mysql数据库要求开始做备份,于是决定把mysqldump命令写到脚本里,然后做到crontab里让它每天定时执行。
系统:RHEL6.5,Mysql5.5
路径:/tmp/tmp
mysqldump写到test.sh,:wq保存后,赋予执行权限:
mysqldump -A -uroot -pyourpassword > /tmp/tmp/mysqlallbak.sql
chmod a+x test.sh
接下来手工执行一下
./test.sh
[root@neoska 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@neoska 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为只导出表结构,-h10.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"`