一、问题描述
某业务系统的mysql自动备份定时任务检查执行过程中,发现mysqldump备份出的文件默认只有4K大小,即文件成功生成了但大小不对。但检查脚本,手动执行脚本,输出结果正常。
二、分析处理
1、从故障看,既然文件生成了,那么脚本就执行了,查看/var/log/cron日志也能佐证。
2、查看脚本权限正常;
3、相关经验表明:脚本引入某些变量会导致定时任务执行失败,但本事件中走完了变量,变量后命令都执行了;
4、另获悉,crontab执行时,如果脚本中命令不是系统默认的或当前用户的环境变量中的内容,会因命令路径问题,导致相关命令执行失败,你也可以查看.bash_profile 和.bashrc来验证是否相关命令在该环境下;查看 cat /etc/profile|grep PATH,是否命令路径在该文件下,本次事件如是。
5、据上,我们可判定mysqldump命令应该时执行失败了,但gzip命令执行成功了,故文件可以正常生成;
6、处理:修改脚本,在mysqldump行前新增source /etc/profile
7、重新编辑定时任务,现场验证定时任务执行脚本正常。
三、附录:备份脚本
#!/bin/bash
#author:junn
#date:2022-07-20
source /etc/profile
dir="/opt/mysql/data_dump"
#获取本地时间,并格式化时间
Date=`date +%Y-%m-%d-%H-%M-%S`
#判断文件夹是否存在
if [ ! -e $dir ]
then
echo "the source dir doesn't exist." > /opt/mysql/data_dump/mysql_bak_$Date.log
exit 1
fi
#数据库备份,打包导出为文件
mysqldump -uroot -p'Passw0rd' --all-databases |gzip > /opt/mysql/data_dump/"$Date"_b-mysql_backup.gz
if [ $?=0 ]
then
cd $dir
fileName="$Date"_b-mysql_backup.gz
file_size=`/usr/bin/du -sm ./$fileName |awk '{ print $1}'`
if [ $file_size -gt 1000 ];then
echo "$Date mysql backup have accomplished." >> /opt/mysql/data_dump/mysql_bak_$Date.log
rsync -azhv "$fileName" root@:172.31.9.1/home/backup #异地备份
else
echo "backup falied,please check and retry" >> /opt/mysql/data_dump/mysql_bak_$Date.log
fi
fi