Eu já fiz um post aqui no mês passado contando como eu fazia backup dos meus diretórios de publicação e dos meus bancos de dados direto pro S3 com alguns scripts shell. Não sabe do que eu tô falando? Então olhe aqui.

Depois que publiquei recebi um feedback do Bruno Padilha contando que ele modificou o script de backup de DB para jogar direto para um repositório GIT e usar o versionamento como backup incremental.

Tomando essa ideia como parâmetro (e também a vontade de cortar custos da AWS), eu criei uma versão modificada do script de backup que, antes de tudo, verifica se o dump foi realmente modificado, remove a última linha que contém timestamp da exportação e aí sim faz commit e push pra master do origin.

O script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
NOW=$(date +"%Y-%m-%d_%H-%M-%S_%z")
Y=$(date +"%Y")
M=$(date +"%m")
D=$(date +"%d")
BASENAME=$1
DB_HOST=$2
DB_USER=$3
DB_PASS=$4
GIT_DIR=$5
echo "******************************************************************************"
echo "BEGIN: $NOW"
echo "------------------------------------------------------------------------------"
echo "CREATING FILE..."
mysqldump -h $DB_HOST --user=$DB_USER --password="${DB_PASS}" --all-databases --extended-insert=FALSE > mysqldump.sql
head -n -1 mysqldump.sql > mysqldump-no_last_line.sql
mv mysqldump-no_last_line.sql mysqldump.sql
diff mysqldump.sql last_mysqldump.sql > diff.txt
if [ -s diff.txt ] || [ ! -e last_mysqldump.sql ]
  then
    echo "NEW FILE DIFFERENT FROM THE LAST ONE."
    rm diff.txt
    cp mysqldump.sql "$GIT_DIR/$BASENAME.sql"
    mv mysqldump.sql last_mysqldump.sql
    echo "ENTERING GIT DIR..."
    cd $GIT_DIR
    git add .
    git commit -m "$NOW"
    echo "COMMIT DONE."
    git push origin master
  else
    echo "NO CHANGES."
    rm diff.txt
    mv mysqldump.sql last_mysqldump.sql
fi
echo "------------------------------------------------------------------------------"
END=$(date +"%Y-%m-%d_%H-%M-%S_%z")
echo "BEGIN: $NOW"
echo "  END: $END"
echo "******************************************************************************"

Parâmetros

Esse script recebe 5 parâmetros:

  • BASENAME: o nome que será padrão no arquivo
  • DB_HOST: o endereço do host do MySQL
  • DB_USER: o usuário de acesso do MySQL
  • DB_PASS: a senha do usuário de acesso ao MySQL
  • GIT_DIR: o diretório do repositório git onde o arquivo será salvo

Alguns pontos precisam ser lembrados:

  • A última linha do arquivo é removida por conter informações de data e hora da realização do dump, assim todas tentativas teriam alterações;
  • O parâmetro –extended-insert=FALSE faz com que cada registro seja gerado em uma linha de INSERT separada; isso aumenta a quantidade de linhas e o tamanho do arquivo mas ajuda o git na hora do diff e processamento da mudança.

Execução

Eu continuo executando o script a cada 15 minutos, mas como tirei a máquina de backup da AWS, o tempo para um backup de todos os DBs passou de 2 minutos para 8 minutos. Então minha dica é: execute o script numa máquina com acesso rápido à máquina do MySQL.

Qualquer dúvida, entre em contato em hi[AT]eduardoquagliato[dot]com.

Os scripts continuam disponíveis no GitHub em https://github.com/quagliato/backup-with-shell.