Script simples para backup de servidores web
A forma mais simples de fazer backup das bases de dados do MySQL é simplesmente salvar o conteúdo da pasta "/var/lib/mysql", criando um arquivo .tar.gz ou mesmo copiando os arquivos diretamente para outra partição. O maior problema é que as bases de dados são alteradas continuamente durante a operação do banco de dados, o que leva a cópias inconsistentes. Se alguns dos arquivos dentro da pasta com a base mudam no meio da cópia, o backup conterá uma mistura de dados novos e antigos, uma receita para o desastre.
A forma mais segura é parar o serviço do MySQL antes de fazer o backup, garantindo assim que nada será alterado durante a cópia, como no exemplo abaixo:
# /etc/init.d/mysql stop
# tar -zcvf mysql.tar.gz /var/lib/mysql/
# /etc/init.d/mysql start
Um exemplo de script de backup simples para fazer um backup completo dos arquivos da pasta "/var/www", contendo os arquivos de todos os sites hospedados no servidor e também da base de dados do MySQL, incluindo as datas em que os backups foram realizados nos nomes dos arquivos seria:
#!/bin/sh
# Acessa a pasta onde os backups serão salvos
cd /var/backup
# Cria uma variável contendo a data atual
DATA=`date +%Y-%m-%d-%H.%M`
# Faz backup da pasta /var/www
tar -zcvf www-$DATA.tar.gz /var/www
# Para o MySQL e faz backup das bases de dados
/etc/init.d/mysql stop
tar -zcvf mysql-$DATA.tar.gz /var/lib/mysql
/etc/init.d/mysql start
Ao executar o script, você teria dois arquivos, como em "www-2008-06-27-07.21.tar.gz" e "mysql-2008-06-27-07.21.tar.gz". Veja que a data incluída nos nomes dos arquivos propositalmente contém (além da data) também a hora e os minutos em que foram gerados, de forma que você saiba exatamente quando os arquivos foram gerados e obtenha sempre arquivos de nomes diferentes, mesmo que o script seja executado várias vezes em sequência.
Para automatizar a execução do script, você pode adicionar uma entrada no arquivo "/etc/crontab", como em:
59 4 * * * root /usr/local/bin/script-backup
Esta entrada faria com que o script fosse executado todos os dias às 4:59 da manhã, sempre gerando dois novos arquivos com a data de quando foram executados. Com isso, ficaria faltando apenas copiar ou mover os arquivos regularmente para outro servidor, onde eles forem ficar arquivados.
A limitação deste script é que ele desativa temporariamente o servidor MySQL, causando alguns segundos (ou minutos) de downtime. É possível fazer um backup online, sem parar o servidor usando o mysqldump, mas isso já é tema para outro post.