0

首先,我说它不能与 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

哪里有问题?以前有没有人遇到过这样的问题?

问候。

4

2 回答 2

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"

.sqltar 球可能仍然没有任何文件。我没有mysql安装,但我怀疑for循环也搞砸了。请尝试以下方法:

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

您可能需要为mysqlshowandmysqldump命令插入其他参数。当然,这不会创建一个 tarball,但它会给你一个压缩备份。

于 2013-01-10T02:54:29.080 回答
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
于 2013-01-10T04:59:40.120 回答