首先,我说它无法正常使用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
问题出在哪里?之前有没有人遇到这样的问题?
问候。
答案 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
您可能需要为mysqlshow
和mysqldump
命令插入其他参数。当然,这不会创建tarball,但它会为您提供压缩备份。
答案 1 :(得分:1)
您可以尝试在脚本中使用mysqldump
和mysql
的完整路径名。
所以:
如果
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