mysqlのバックアップとrsyncスクリプトの問題

mysqlのバックアップとrsyncスクリプトの問題

MySQLデータベースをバックアップしてからリモートの場所に同期するbashスクリプトがあります。昨夜、このプロセスが完全に失敗し、デフォルトのbackup-dbディレクトリが33GBでいっぱいになりました! 4時間ごとにcronジョブを実行するスクリプトがあります。フォルダを見てみると、4時間ごとに1分間隔でバックアップが実行されているようです。たとえば、午前4時に一度ではなく、その時間の毎分。午前8時も同じだ。

問題は、バックアップが完了する前にrsyncが実行され、シャットダウンせずにループに陥るということです。バックアップが失敗した場合は、スクリプトを終了するか、rsyncを実行する前にバックアップが成功したことを確認する方法はありますか?

今、私はrsyncを別の小さなスクリプトとして削除しました(しかし、私は複数のサーバーに複製する必要があるので、すべてを一箇所に保管したいと思います)。

#!/bin/bash

NOW=$(date +"%Y-%m")
BACKUPDIR="/home/deploy/backup-db/$NOW"
BKUPSSH="[email protected]"
BKUPSERVDIR="/home/user/backups/databases"

# Remove files older than 30 days
find $BACKUPDIR/ -mtime +31 -exec rm {} \;

# DO NOT BACKUP these databases
IGNOREDB="
information_schema
mysql
test
"

#* MySQL binaries *#
MYSQL=$(which mysql)
MYSQLDUMP=$(which mysqldump)
GZIP=$(which gzip)

# assuming that BACKUPDIR exists
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR
else
 :
fi

# get all database listing
DBS="$(mysql --login-path=dbbkup -Bse 'show databases')"


# SET DATE AND TIME FOR THE FILE
NOW=$(date +"%Y-%m-%d_%H.%M"); # year-month-day_hour.minute format

# start to dump database one by one
for db in $DBS
do
        DUMP="yes";
        if [ "$IGNOREDB" != "" ]; then
                for i in $IGNOREDB # Store all value of $IGNOREDB ON i
                do
                        if [ "$db" == "$i" ]; then # If result of $DBS(db) is equal to $IGNOREDB(i) then
                            DUMP="NO";         # SET value of DUMP to "no"
                            #echo "$i database is being ignored!";
                    fi
            done
    fi

    if [ "$DUMP" == "yes" ]; then # If value of DUMP is "yes" then backup database
            FILE="$BACKUPDIR/$NOW-$db.sql.gz";
            echo "BACKING UP $db";
    $MYSQLDUMP --login-path=dbbkup --add-drop-database --opt --lock-all-tables --set-gtid-purged=OFF $db | $GZIP > $FILE
    fi
done

# change permissions on files
chmod -R 755 $BACKUPDIR

# rsync backup to the backup server and append the log file
rsync -azv $BACKUPDIR -e ssh $BKUPSSH:$BKUPSERVDIR >> /home/deploy/db_rsync.log 2>&1
RESULT="$?"

# check result or rsync
if [ "$RESULT" != "0" ]; then
echo -e "Rsync exit Code:" $RESULT "\nFailed to rsync databases" >> /home/deploy/db_rsync.log 2>&1
else
echo "succesfully rsynced databases" >> /home/deploy/db_rsync.log 2>&1
fi

ベストアンサー1

cronjobジョブとそこで発生する可能性のある問題を公開します。また、私が推奨する方法は、バックアップを実行する前にそのファイルが存在することを確認できるどこかにファイルをタッチしてロックファイルを作成することです。データベースがどれほど大きいかはわかりませんが、私の場合は、データベースが大きすぎてバックアッププロセスがすでに実行されている他のプロセスと重複する可能性があるため、実行中の/tmp/backup.lockファイルなどのファイルが常に存在します。スクリプトに触れる前にif [-e /tmp/backup.lock];そして…

あなたの場合、cronjobにバグがあり、4時間ごとに1分ごとに実行していると確信しています。

おすすめ記事