web-dev-qa-db-ja.com

bashスクリプトでmd5sumテストを使用してループを作成する方法は?

データベースの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
gtludwig
  • rsyncは、ファイルが不完全であることを認識しています。 rsyncを定期的に実行するだけで、必要に応じてファイルの新しい部分を再送信するようになります。
  • $ TEMPDIRが小さすぎてtarczvfを含めることができない可能性がありますか?次に、その(不完全な)ファイルをrsyncで送信しますか?
  • 単純化しない理由:

    • あなたがしたようにDBをダンプします
    • 次にcd "$LOCALDIR" && rsync -azvh *_bkp_*.sql "$BACKUPHOST":"$REMOTEDIR"
1
Olivier Dulac

あなたが説明していることは、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:少なくとも複数のマシンがある場合は、実際のバックアップシステムを検討する必要があります。

1
derobert