데이터베이스의 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
당신이 할 수 있는 또 다른 방법(아마도 바람직함)은 MD5 파일을 rsync에 추가하고 이를 백업과 함께 저장하는 것입니다. 이를 통해 백업이 손상되지 않았는지 확인할 수 있습니다.
추신: 적어도 여러 대의 시스템이 있는 경우에는 실제 백업 시스템을 고려해야 합니다.