domingo, 29 de novembro de 2009

Usando o mysqlbinlog para refazer o banco de dados

Ah os backups...
Por mais que você se esforce para mantê-los em dia e para não precisar deles, você vai precisar e, justo neste dia você vai descobrir que quem tem uma fonte de backup apenas, não tem nenhuma e se tiver duas fontes, periga não ter nenhuma do mesmo jeito.
Caso os seus backups do banco de dados mysql estiverem comprometidos, mas consiga ter acesso aos logs binários, pode existir uma luz no fim do túnel. É possível refazer o banco totalmente, ou em partes, a partir destes arquivos que são uma verdadeira mão na roda.
Os arquivos binários do servidor mysql são arquivos que contém a descrição das modificações ocorridas dentro de um banco de dados. O servidor grava estes arquivos no formato binário, então, não basta apenas abrir o arquivo para poder compreender o que ocorre dentro dele.
O MySQL possui um programa chamado mysqlbinlog que permite converter estes arquivos para o formato texto e, a partir dai, pode-se usar as informações gravadas nestes arquivos para os mais diversos fins, que vão desde uma auditoria no banco para descobrir quem fez o que e quando, até mesmo a recuperação de todo o banco de dados após a corrupção de suas tabelas.
Em distribuições linux, os arquivos binários geralmente se encontram em /var/log/mysql. Nesta pasta serão encontrados arquivos numerados sequencialmente no seguinte formato mysql-bin.000233.
O acesso a estes arquivos pode se dar remotamente, mas em geral, opta-se pelo acesso direto à pasta onde estão os arquivos. Daremos continuidade, partindo deste pressuposto.
A abordagem mais usada é a de gerar arquivos texto a partir dos arquivos binários e aplicar este arquivo texto ao banco de dados:
mysqlbinlog mysql-bin-000233 > /tmp/arquivo.txt.
Outro ponto importante com relação ao log binário: a cada vez que o servidor MySQL é reiniciado, um novo arquivo é gerado. Portanto, os dados que se queira reparar podem estar espalhados em diversos arquivos. Neste caso, pode-se usar os recursos do shell script para direcionar a saída de vários arquivos de log para um único arquivo de texto. Supondo que as informações que queiramos estejam nos arquivos mysql-bin.000233 a mysql-bin.000245, podemos fazer da seguinte forma:
for i in $( seq 233 245 ) ; do mysqlbinlog mysql-bin.$(printf "%06d" $i) >> /tmp/saida.txt ; done
Este laço executa o mysqlbinlog em cima de todos os arquivos que tenham numeração entre 233 e 245 e direcionam o resultado para o arquivo saida.txt.
Pode se agora fazer com que os comandos armazenados em saida.txt sejam executados no seu servidor de banco de dados:
mysql -h seuHost -u seuUsuario seuBancoDados - p
Feito isto todas os comandos que foram armazenados nos logs binarios redirecionados para o arquivo saida.txt serão executados no banco de dados seuBancoDados.
Cuidados Importantes:
  • O mysqlbinlog armazena informações de todos os bancos de dados gerenciados pelo servidor. Caso se queira recuperar informações de apenas um banco de dados, deve-se indicar explicitamente qual das bases se deseja trabalhar.
  • O mysqlbinlog armazena informações sobre o momento em que as alterações ocorreram no banco de dados e é possível indicar este momento a partir de parâmetros passados ao mysqlbinlog. Ter isto em mente ajuda a uma recuperação mais consistente e segura.
  • LEIA O MANUAL antes de aplicar as idéias deste POST. Perca 5 minutos entendendo o que é possível fazer com este aplicativo tão útil do MySQL. Caso consiga melhorar esta minha idéia, ficarei agradecido se postar a solução aqui como comentário.

Nenhum comentário:

Postar um comentário