Backup de MySQL com shell
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.