MySQL备份的Bash脚本 – error handling

我试图备份一堆MyISAM表,这样可以让我将rsync / rdiff备份目录转移到远程位置。 我想出了一个脚本,只转储最近更改的表,并设置文件的date,以便rsync可以拿起只更改的,但现在我不知道如何做error handling – 我想如果出现错误,脚本将以非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 

mysqldump命令成功返回0,警告/错误条件返回> 0。 当你循环时,你需要保护$ ERRORS不被后面的成功命令覆盖,所以需要一些逻辑

 mysqldump ... EXITSTATUS=$? if [ "$ERRORS" -eq "0" -a "$EXITSTATUS" -ne "0" ] then ERRORS=$EXITSTATUS fi 

现在,当你的脚本退出时,它将以0或者遇到的第一个错误的状态退出。

好吧,我不得不重新排列一些东西。 Iain的回答是行不通的,因为mysqldump是通过pipe道传输到gzip的,所以我得到了gzip的返回值,所以我使用了PIPESTATUS,然后我不得不重新sortingwhile循环的命令以获得子shell外部的Errorsvariables。

 #/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 

我用

 ERRORS=$? 

在mysqldump命令之后。

$? 返回最后执行的命令的状态。

如果你希望你可以检查所有命令后的结果,并根据多个结果设置ERRORS。