web-dev-qa-db-ja.com

mysqlバックアップ用のBashスクリプト-エラー処理

バックアップディレクトリをリモートの場所に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
Jure1873

mysqldumpコマンドは、成功の場合は0を返し、警告/エラー状態の場合は> 0を返します。ループしているので、$ ERRORSが後続の成功したコマンドによって上書きされないように保護する必要があるため、少しのロジックが必要です。

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

これで、スクリプトが終了すると、0または最初に発生したエラーのステータスで終了します。

2
user9517

わかりました、私は物事を少し並べ替えなければなりませんでした。 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
1
Jure1873

私が使う

ERRORS=$? 

mysqldumpコマンドの後。

$?最後に実行されたコマンドのステータスを返します。

必要に応じて、すべてのコマンドの後で結果を確認し、複数の結果に基づいてエラーを設定できます。

0