Bash

如何在 bash 腳本上使用 md5sum 測試進行循環?

  • April 19, 2017

我有這個腳本,它創建數據庫的 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)
  • rsync 知道文件何時不完整。只需定期執行 rsync,它自己就會根據需要重新發送文件的新部分。

  • $TEMPDIR 可能太小而無法包含 tar czvf 嗎?那麼你會用rsync發送那個(不完整的)文件嗎?

  • 為什麼不簡化:

    • 像你一樣轉儲數據庫
    • 然後cd "$LOCALDIR" && rsync -azvh *_bkp_*.sql "$BACKUPHOST":"$REMOTEDIR"

如果沒有 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

您可以做的另一件事(可能更可取)是將 MD5 文件添加到您的 rsync 中,並將其與備份一起儲存。這使您可以確認備份沒有損壞。

PS:你應該考慮一個真正的備份系統,至少如果你有多台機器的話。

引用自:https://unix.stackexchange.com/questions/359957