バックアップディレクトリをリモートの場所に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
mysqldump
コマンドは、成功の場合は0を返し、警告/エラー状態の場合は> 0を返します。ループしているので、$ ERRORSが後続の成功したコマンドによって上書きされないように保護する必要があるため、少しのロジックが必要です。
mysqldump ...
EXITSTATUS=$?
if [ "$ERRORS" -eq "0" -a "$EXITSTATUS" -ne "0" ]
then
ERRORS=$EXITSTATUS
fi
これで、スクリプトが終了すると、0または最初に発生したエラーのステータスで終了します。
わかりました、私は物事を少し並べ替えなければなりませんでした。 mysqldumpがgzipにパイプされているため、Iainの回答は機能しませんでした。そのため、gzipの戻り値を取得したので、PIPESTATUSを使用し、whileループのコマンドを並べ替えて、サブシェルの外で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
私が使う
ERRORS=$?
mysqldumpコマンドの後。
$?最後に実行されたコマンドのステータスを返します。
必要に応じて、すべてのコマンドの後で結果を確認し、複数の結果に基づいてエラーを設定できます。