我正在尝试以一种允许我将备份目录 rsync/rdiff 到远程位置的方式备份一组 MyISAM 表。我想出了一个脚本,它只转储最近更改的表并设置文件的日期,以便 rsync 可以只获取更改的表,但现在我不知道如何进行错误处理 - 如果出现错误,我希望脚本以非 0 值退出。我该怎么做?
#/bin/bash
BKPDIR="/var/backups/db-mysql"
mkdir -p $BKPDIR
ERRORS=0
FIELDS="TABLE_SCHEMA, TABLE_NAME, UPDATE_TIME"
W_COND="UPDATE_TIME >= DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND TABLE_SCHEMA<>'information_schema'"
mysql --skip-column-names -e "SELECT $FIELDS FROM information_schema.tables WHERE $W_COND;" | while read db table tstamp; do
echo "DB: $db: TABLE: $table: ($tstamp)"
mysqldump $db $table | gzip > $BKPDIR/$db-$table.sql.gz
touch -d "$tstamp" $BKPDIR/$db-$table.sql.gz
done
exit $ERRORS
答案1
该mysqldump
命令返回 0 表示成功,>0 表示警告/错误情况。由于您正在循环,因此您需要保护 $ERRORS 不被后续成功命令覆盖,因此需要一点逻辑
mysqldump ...
EXITSTATUS=$?
if [ "$ERRORS" -eq "0" -a "$EXITSTATUS" -ne "0" ]
then
ERRORS=$EXITSTATUS
fi
现在,当您的脚本退出时,它将以 0 或遇到的第一个错误的状态退出。
答案2
好吧,我不得不稍微重新排序一下。Iain 的答案不起作用,因为 mysqldump 被管道传输到 gzip,所以我得到了 gzip 的返回值,所以我使用了 PIPESTATUS,然后我不得不重新排序 while 循环的命令,以便在子 shell 之外获取 Errors 变量。
#/bin/bash
ERRORS=0
BKPDIR="/var/backups/db-mysql"
mkdir -p $BKPDIR
FIELDS="TABLE_SCHEMA, TABLE_NAME, UPDATE_TIME"
W_COND="UPDATE_TIME >= DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND TABLE_SCHEMA<>'information_schema'"
while read db table tstamp; do
echo "DB: $db: TABLE: $table: ($tstamp)"
mysqldump $db $table | gzip > $BKPDIR/$db-$table.sql.gz
EXITSTATUS=${PIPESTATUS[0]}
if [ "$EXITSTATUS" -ne "0" ]
then
echo "ERROR when backing up $db $table!"
ERRORS=$((ERRORS+1))
fi
touch -d "$tstamp" $BKPDIR/$db-$table.sql.gz
done < <(mysql --skip-column-names -e "SELECT $FIELDS FROM information_schema.tables WHERE $W_COND;")
if [ "$ERRORS" -ne "0" ]
then
echo "ERRORS when backing up MySQL!"
fi
exit $ERRORS
答案3
我用
ERRORS=$?
在 mysqldump 命令之后。
$? 返回最后执行的命令的状态。
如果您愿意,您可以在所有命令后检查结果并根据多个结果设置错误。