データベースのmysqlダンプを生成してストレージサーバーに送信するスクリプトがあります。ところで、rsyncを使用してファイルを送信すると、生成されたファイルサイズが間違っていることがわかりました。
リモートファイルのmd5sumをテストし、ハッシュが同じ場合はローカルファイルを削除したいと思います。しかし、ハッシュが異なる場合、rsyncは再試行されます。
元のスクリプトは次のとおりです。
#!/bin/bash
# database credentials
DATABASEHOST=<host>
DATABASEUSER=<user>
DATABASEPASSWORD=<password>
DATABASESCHEMA=<schema>
DATABASEENV=<env>
# Local directory of mysqldump file
LOCALDIR=<localdir>
# Temporary directory for compressed file
TEMPDIR=<tempdir>
# Remote Directory for backups.
REMOTEDIR=<remote-dir>
# USERname to login as
BACKUPUSER=<backupuser>
# Backup host to login to
BACKUPHOST=<backuphost>
# mysqldump file
MYSQLDUMPFILE="$(date +%Y%m%d)"_bkp_"$DATABASESCHEMA".sql
# compressed file
COMPRESSEDFILE="$(date +%Y%m%d)"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz
#--- end config
echo $(date +%H:%M)
echo "Creating the MySQL dump"
mysqldump --host="$DATABASEHOST" --user="$DATABASEUSER" --password="$DATABASEPASSWORD" --single-transaction "$DATABASESCHEMA" > "$LOCALDIR"/"$MYSQLDUMPFILE"
#echo "Generating md5sum"
md5sum "$LOCALDIR"/* > "$LOCALDIR"/checklist.chk
#echo "Compressing the dump and checklist"
tar -cvzf "$TEMPDIR"/$(date +%Y%m%d)"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz" "$LOCALDIR"/*
#echo "Sending the compressed file to storage location"
rsync -azvh "$TEMPDIR"/"$COMPRESSEDFILE" "$BACKUPHOST":"$REMOTEDIR"
echo "Removing generated files"
rm "$LOCALDIR"/checklist.chk > /dev/null 2>&1
rm "$LOCALDIR"/"$MYSQLDUMPFILE" > /dev/null 2>&1
rm "$TEMPDIR"/"$COMPRESSEDFILE" > /dev/null 2>&1
echo $(date +%H:%M)
答え1
- rsyncはファイルが不完全な時期を知っています。 rsync を定期的に実行すると、必要に応じてファイルの新しい部分を独自に再送信します。
- $TEMPDIRにtar czvfを含めるには小さすぎますか?それでは、rsyncを使用して対応する(不完全な)ファイルを送信しますか?
単純化しない理由:
- あなたがしたようにデータベースをダンプしてください
- それから
cd "$LOCALDIR" && rsync -azvh *_bkp_*.sql "$BACKUPHOST":"$REMOTEDIR"
答え2
エラーを示すrsyncが存在しない場合、またはシステムがクラッシュした場合(したがってシステムがシャットダウンしてrsyncが返されない場合)、説明する内容は決して発生しません。バラより私のコメントこれに関するいくつかの提案。
しかし、チェックサムを計算して保存するのは良い習慣であり、検査は非常に簡単です。別のコンピュータでsshを実行したり、別のスクリプトを実行したりできる限り(すべてのファイル名に一重引用符がないと仮定):
# the cut below is to get the MD5 only, without the file name.
md5_local="$(md5sum "$REMOTEDIR/$COMPRESSEDFILE" | cut -d' ' -f1)"
md5_remote="$(ssh "$BACKUPHOST" "md5sum '$REMOTEDIR/$COMPRESSEDFILE'" | cut -d' ' -f1)"
if [ "$md5_local" = "" ]; then
echo "Something went terribly wrong."
elif [ "$md5_local" = "$md5_remote" ]; then
echo "MD5s match"
else
echo "MD5s DO NOT match"
fi
あなたができるもう1つの方法(おそらく望ましい)は、MD5ファイルをrsyncに追加し、それをバックアップと共に保存することです。これにより、バックアップが破損していないことを確認できます。
PS:少なくとも複数のシステムがある場合は、実際のバックアップシステムを考慮する必要があります。