TAR无法与crontab一起正常工作

时间:2013-01-10 02:45:07

标签: bash backup mysqldump freebsd tar

首先,我说它无法正常使用crontab,因为当我手动运行脚本时,它可以正常工作。

问题在于,当我使用cronjob运行备份脚本并且......它正在调试mysql转储时,tar存档只有16字节大小(并且它是空的,所以它看起来像没有文件要打包到存档中,奇怪的是,当我手动运行脚本时,它运行大约5分钟,tar包大小为~1.8GB

这是我的bash代码:

#!/usr/local/bin/bash
# Configuration
BACKUPD="/backup/mysql"
MySQLuser='root'
MySQLpass='xxxx'
# End configuration
ROK=`date +%Y`
MIESIAC=`date +%m`
DZIEN=`date +%d`
GIM=`date +%H-%M`

if [ -d $BACKUPD/$ROK/$MIESIAC/$DZIEN ]
then
echo
else
mkdir -p $BACKUPD/$ROK/$MIESIAC/$DZIEN
fi

for db in $(echo "SHOW DATABASES;" | mysql --user=$MySQLuser --password=$MySQLpass | grep -v -e "Database" -e "information_schema")
do
    mysqldump --skip-lock-tables --ignore-table=log.log --user="$MySQLuser" --password="$MySQLpass" $db >$BACKUPD/$ROK/$MIESIAC/$DZIEN/$db.sql
done

cd $BACKUPD/$ROK/$MIESIAC/$DZIEN && tar jcPf $BACKUPD/$ROK/$MIESIAC/$DZIEN/mysql-$GIM.tar.bz2 *.sql && rm -rf *.sql

问题出在哪里?之前有没有人遇到这样的问题?

问候。

2 个答案:

答案 0 :(得分:1)

我的猜测是最后一行是你的问题。 shell glob(*.sql)位于:

cd $BACKUPD/$ROK/$MIESIAC/$DZIEN && tar jcPf $BACKUPD/$ROK/$MIESIAC/$DZIEN/mysql-$GIM.tar.bz2 *.sql && rm -rf *.sql

在当前目录中展开,而不是cd之后,正如您所料。请尝试以下方法,它更安全。

old_dir=`pwd`
cd "$BACKUPD/$ROK/$MIESIAC/$DZIEN"
tar jcPf mysql-$GIM.tar.bz2 *.sql
rm -fr *.sql
cd "$old_dir"

仍然可能没有任何.sql个文件来tar球。我没有安装mysql,但我怀疑for循环也搞砸了。请尝试以下内容:

mysqlshow | \
xargs mysqldump --databases | \
bzip2 > $BACKUPD/$ROK/$MIESIAC/$DZIEN/mysql-$GIM.bz2

您可能需要为mysqlshowmysqldump命令插入其他参数。当然,这不会创建tarball,但它会为您提供压缩备份。

答案 1 :(得分:1)

您可以尝试在脚本中使用mysqldumpmysql的完整路径名。

所以:

  

如果which mysql等于/usr/local/mysql/bin/mysql

     

     

如果which mysqldump等于/usr/local/mysql/bin/mysqldump

将您的脚本修改为:

for db in $(echo "SHOW DATABASES;" | /usr/local/mysql/bin/mysql --user=$MySQLuser --password=$MySQLpass | grep -v -e "Database" -e "information_schema")
do
    /usr/local/mysql/bin/mysqldump --skip-lock-tables --ignore-table=log.log --user="$MySQLuser" --password="$MySQLpass" $db >$BACKUPD/$ROK/$MIESIAC/$DZIEN/$db.sql
done