como fazer um loop com o teste md5sum em um script bash?

1

Eu tenho esse script que cria um dump mysql de um banco de dados e o envia para um servidor de armazenamento. Mas vejo que, às vezes, os arquivos gerados são de tamanho errado, mesmo enviando o arquivo com o rsync.

Eu gostaria de testar o arquivo remoto para md5sum e se o hash é o mesmo, o arquivo local é removido. Se o hash for diferente, o rsync será tentado novamente.

O script original é:

#!/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)
    
por gtludwig 19.04.2017 / 16:57

2 respostas

1
  • O rsync sabe quando um arquivo está incompleto. Basta executar o rsync regularmente e, por si só, terá o cuidado de reenviar novas partes do arquivo conforme necessário.
  • Pode acontecer que $ TEMPDIR seja pequeno demais para conter o tar czvf? então você enviaria aquele arquivo (incompleto) com o rsync?
  • por que não simplificar:

    • despeje o DB como você fez
    • , em seguida, cd "$LOCALDIR" && rsync -azvh *_bkp_*.sql "$BACKUPHOST":"$REMOTEDIR"
por 19.04.2017 / 17:28
1

O que você está descrevendo nunca deve acontecer sem rsync indicando um erro ou sua máquina falhando (e, portanto, o rsync nunca retornando, porque a máquina morreu). Consulte meu comente para algumas sugestões sobre isso.

No entanto, calcular e armazenar uma soma de verificação é uma boa prática, e a verificação é bastante fácil - contanto que você possa executar o ssh na outra máquina ou executar um script separado (presumindo que nenhum dos nomes de arquivo tenha aspas simples na eles):

# 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

Outra coisa que você poderia fazer - e provavelmente é preferível - é adicionar o arquivo MD5 ao seu rsync e armazená-lo com o backup. Isso permite confirmar se o backup não foi corrompido.

PS: Você deve considerar um sistema de backup real, pelo menos se você tiver várias máquinas.

    
por 19.04.2017 / 18:12