Executando backup do MySQL e enviando por FTP
Neste artigo mostrarei como montar um sistema que realiza o backup de um banco de dados do MySQL e envia o dump automaticamente por FTP para um servidor de sua preferência.
Introdução
Este mês aconteceu algo comigo que pode parecer piada, mas é verdade. Saí de Taubaté
para São Paulo para curtir um pouco na festa skoll beats e quando cheguei na Segunda
de manhã crente que passaria o dia contando as novidades, fui surpreendido com a
bomba. Um de nossos servidores com um HD SCSI de 80GB havia queimado e nem dava sinal
de vida.
Para minha sorte, havia exatamente uma semana que eu tinha instalado um servidor de backup, logo se um servidor parou, basta colocar o outro no ar.
Para vocês terem uma idéia, existiam cinco máquinas penduradas num único no-break, porém em apenas esta algum tipo de curto destruiu o hardware a nível de o próprio teclado não funcionar em nenhuma outra máquina. Foram por água abaixo um disco SCSI, controlador, teclado, placas de rede, placa de vídeo, placa mãe.
Chega de papo furado e vamos ao artigo, que foi escrito baseado num ambiente que roda RedHat, porém neste caso a distribuição Linux não importa, pois os procedimentos aqui apresentados funcionarão em qualquer delas.
Como descubro se minha conta de usuário do MySQL tem direito de acesso remoto?
Fácil! Abra um terminal do MySQL com o seguinte comando:
# mysql
Isso te levará ao console do programa, feito isso, digite o seguinte comando:
MYSQL> GRANT ALL PRIVILEGES ON seu_banco_dados.* TO usuario@host_remoto IDENTIFIED BY 'senha_do_usuario' WITH GRANT OPTION;
MYSQL> FLUSH PRIVILEGES;
Onde:
$ mysql -h nome_servidor -u usuario -psenha_do_usuario seu_banco_dados
Se tudo estiver OK, você cairá no terminal do MySQL do servidor.
Crie um diretório de backup no local de sua preferência, no meu caso optei por /var/backup.
# mkdir /var/backup
E dentro deste diretório vou armazenar o script que realiza backup. Eis o código do arquivo, que vou chamá-lo de backup.sh:
Para minha sorte, havia exatamente uma semana que eu tinha instalado um servidor de backup, logo se um servidor parou, basta colocar o outro no ar.
Para vocês terem uma idéia, existiam cinco máquinas penduradas num único no-break, porém em apenas esta algum tipo de curto destruiu o hardware a nível de o próprio teclado não funcionar em nenhuma outra máquina. Foram por água abaixo um disco SCSI, controlador, teclado, placas de rede, placa de vídeo, placa mãe.
Chega de papo furado e vamos ao artigo, que foi escrito baseado num ambiente que roda RedHat, porém neste caso a distribuição Linux não importa, pois os procedimentos aqui apresentados funcionarão em qualquer delas.
Requerimentos
- Serviço cron na estação que executa o backup
- MySQL no servidor de produção que precisa de backup
- Conta de usuário no MySQL com permissão de acesso remoto a partir da estação que executa o backup
- Conta de usuário no servidor FTP que receberá o backup
MySQL
Como descubro se minha conta de usuário do MySQL tem direito de acesso remoto?
Fácil! Abra um terminal do MySQL com o seguinte comando:
# mysql
Isso te levará ao console do programa, feito isso, digite o seguinte comando:
MYSQL> GRANT ALL PRIVILEGES ON seu_banco_dados.* TO usuario@host_remoto IDENTIFIED BY 'senha_do_usuario' WITH GRANT OPTION;
MYSQL> FLUSH PRIVILEGES;
Onde:
- seu_banco_dados = o nome do banco de dados que seu usuário precisa ter acesso
- usuario = login no usuário
- host_remoto = máquina remota que irá acessar o servidor MySQL
- senha_do_usuario = o nome já diz tudo né?
$ mysql -h nome_servidor -u usuario -psenha_do_usuario seu_banco_dados
Se tudo estiver OK, você cairá no terminal do MySQL do servidor.
Backup
Crie um diretório de backup no local de sua preferência, no meu caso optei por /var/backup.
# mkdir /var/backup
E dentro deste diretório vou armazenar o script que realiza backup. Eis o código do arquivo, que vou chamá-lo de backup.sh:
#!/bin/bash
# define o formato do nome do arquivo de backup
NARQUIVO="base--`date +%d_%m_%Y__%H_%M`"
# utiliza o programa mysqldump para efetuar backup no banco de dados do servidor de MySQL,
# direcionando a saída para o arquivo de backup em si. O sinal '&&' no final do
# comando significa que o próximo comando só será executado caso este seja realizado
# com sucesso.
mysqldump --host=servidor_mysql --user=usuario --password=senha_do_usuario --databases seu_banco_dados > /var/backup/$NARQUIVO.sql
&&
# targiando o arquivo para que não fique muito grande e comer a banda da lan
tar -cvzf /var/backup/$NARQUIVO.tar.gz /var/backup/$NARQUIVO.sql
# removendo o arquivo original para liberar espaço
rm -f /var/backup/$NARQUIVO.sql
# espere por 90 segundos
sleep 90
FTPSERVER="servidor de ftp"
USERNAME="usuario de ftp"
PASSWORD="sua senha"
LOCALDIR="/var/backup"
# conecte-se ao servidor FTP e envie o arquivo
ftp -ni $FTPSERVER <<FIM
user $USERNAME $PASSWORD
lcd $LOCALDIR
mdelete *.tar.gz
mput $NARQUIVO.tar.gz
bye
FIM
# define o formato do nome do arquivo de backup
NARQUIVO="base--`date +%d_%m_%Y__%H_%M`"
# utiliza o programa mysqldump para efetuar backup no banco de dados do servidor de MySQL,
# direcionando a saída para o arquivo de backup em si. O sinal '&&' no final do
# comando significa que o próximo comando só será executado caso este seja realizado
# com sucesso.
mysqldump --host=servidor_mysql --user=usuario --password=senha_do_usuario --databases seu_banco_dados > /var/backup/$NARQUIVO.sql
&&
# targiando o arquivo para que não fique muito grande e comer a banda da lan
tar -cvzf /var/backup/$NARQUIVO.tar.gz /var/backup/$NARQUIVO.sql
# removendo o arquivo original para liberar espaço
rm -f /var/backup/$NARQUIVO.sql
# espere por 90 segundos
sleep 90
FTPSERVER="servidor de ftp"
USERNAME="usuario de ftp"
PASSWORD="sua senha"
LOCALDIR="/var/backup"
# conecte-se ao servidor FTP e envie o arquivo
ftp -ni $FTPSERVER <<FIM
user $USERNAME $PASSWORD
lcd $LOCALDIR
mdelete *.tar.gz
mput $NARQUIVO.tar.gz
bye
FIM
Agora dê permissão de execução ao script:
# chmod 755 /var/backup/backup.sh
E agende sua execução a partir do crontab. No meu caso, escolhi fazer backup uma vez por hora:
# crontab -e
0 */1 * * * /var/backup/backup.sh
Gostaria de agradecer ao Fábio, pois aproveitei seu script de fazer FTP como ponto de partida para o resto das funcionalidades.
Parabéns