Script que fiz juntamente com o Will de Souza para realizar o backup do banco de dados MYSQL em um servidor CentOs6.
O script vai, na ordem, verificar se o diretório de destino do backup existe, depois realizar o backup, fazer a retenção local de 7 dias, sincronizar com servidor de backup e por último enviar um e-mail com o log com o procedimento que foi realizado.
Não existe (ainda) tratamento de erro para o script. A compactação foi realizada utitlizando o gzip. Para realizar o sincronização, é necessário autenticação sem senha utilizando certificados. Para saber como é feito, veja o post sobre o assunto: http://161.35.238.43/linux-conexao-ssh-sem-senha/
O envio do e-mail é feito utilizando o servidor postfix instalado localmente.
Para ser executado automaticamente, basta criar um arquivo e adicioná-lo ao Cron do servidor onde está o seu banco de dados.
Fiquem à vontade para modificar o script de acordo com a necessidade do seu servidor. Qualquer dúvida, sugestão e colaboração pode ser feita através dos comentários do blog.
Abraços e até a próxima.
#!/bin/bash ### Script para realizar o backup do banco de dados, compactar com gzip, reter os arquivos locais por de 7 dias, sincronizar com o servidor Storage e enviar um e-mail ao final ### ### Definindo as Variáveis ### data=`date +%Y-%m-%d` logbkp="/etc/bancos/backup/mysql/$data.log" # Local onde o log ficará armazenado. dircopy="/etc/bancos/backup/mysql/$data" # Diretório onde ficará armazenado o backup. MySQLUser=root # Usuário do banco de dados. MySQLUserPW='senha123' # Senha do usuário do banco de dados. listardbs=`mysql -S /var/lib/bancos/mysql/mysql.sock -N -s -u "${MySQLUser}" -p"${MySQLUserPW}" -e 'show databases;'` # Caminho do banco de dados e autenticação. argumentos="--ignore-table=mysql.event --single-transaction -S /var/lib/bancos/mysql/mysql.sock" email="usuariodoemail@email.com.br" # Endereço do e-mail para ser enviado o log. echo "----------------------------------------------------" >> $logbkp echo "[$data `date +%Hh:%Mm:%Ss`] Início do script de Backup do MySQL" | tee -a $logbkp ### Verificando o Diretório ### if [ -d "$dircopy" ]; then echo "[$data `date +%Hh:%Mm:%Ss`] Diretório $dircopy já existe" | tee -a $logbkp else echo "[$data `date +%Hh:%Mm:%Ss`] Criando diretório $dircopy" | tee -a $logbkp mkdir $dircopy fi ### Iniciando o Backup e Compactando com gzip ### echo "[$data `date +%Hh:%Mm:%Ss`] Iniciando o Backup da Base de dados!" | tee -a $logbkp for bancodedados in $listardbs; do if [ $bancodedados != 'performance_schema' ] ; then echo "[$data `date +%Hh:%Mm:%Ss`] Backup do $bancodedados" | tee -a $logbkp mysqldump $argumentos -u "${MySQLUser}" -p"${MySQLUserPW}" $bancodedados > $dircopy/$bancodedados.sql echo "[$data `date +%Hh:%Mm:%Ss`] Compactando o $bancodedados" | tee -a $logbkp gzip -9 -f "$dircopy/$bancodedados.sql" fi done echo "[$data `date +%Hh:%Mm:%Ss`] Fim do Backup!" | tee -a $logbkp ### Retenção e Sincronização ### find $dircopy -iname '$data*' -type d -mtime +7 -exec rm -rf '{}' ';' rsync -AagoPprzqe 'ssh -p 22' /etc/bancos/backup/mysql/* root@192.168.1.1:/BACKUP/BANCOS/MYSQL/ # Aqui coloca-se o endereço do servidor remoto de backup. echo "[$data `date +%Hh:%Mm:%Ss`] Fim do script de Backup do MySQL." | tee -a $logbkp echo "----------------------------------------------------" >> $logbkp ### Enviando o E-mail ### lerlogbkp=`cat $logbkp` echo "$lerlogbkp" | sendmail -F mysqlbackup-$data $email echo "[$data `date +%Hh:%Mm:%Ss`] E-mail para $email enviado!"