Recuperando bancos InnoDB no MySQL

Hoje enfrentei um problema difícil no trabalho, um cliente pediu para recuperar um backup de um banco que acidentalmente teve seus dados apagados, como levei algum tempo para juntar as peças e montar o quebra cabeça resolvi postar aqui pra compartilhar com todos essa experiência.

Então, vamos ao cenário:

  1. Cliente pede para recuperar o backup de um banco no MySQL
  2. Percebi que não tinhamos backup em dump daquele banco, somente backup em tarball de todo o /var/lib/mysql (normalmente é lá que ficam os arquivos contendo os dados e índices dos bancos de dados)

A partir deste ponto normalmente se pensa que basta recuperar o diretório com o nome do banco de dentro do tarball, ou seja extrair do tarball /var/lib/mysql/nome_banco. Acontece que isso geralmente funciona, mas para bancos com tabelas MyISAM. Bancos com tabelas InnoDB possuem uma pequena diferença no MySQL, seus dados não ficam autocontidos no diretório de nome do banco, mas sim dentro do arquivo /var/lib/mysql/ibdata1, este arquivo vai conter os dados de todos os bancos que utilizarem a engine InnoDB, e é justamente por causa disso que NÃO podemos restaurar o backup de um banco específico sobrescrevendo o ibdata1, pois senão iremos voltar dados para o passado no banco de dados de TODOS os usuários!!!

O que então precisamos fazer?

Pré-requisitos:

  1. Ter uma máquina extra (física ou virtual)
  2. O MySQL instalado nesta máquina extra e sem estar sendo utilizado em produção

A primeira coisa que devemos fazer é copiar para a máquina extra o /var/lib/mysql/ibdata1 e o /var/lib/mysql/nome_do_banco que foram extraídos do nosso tarball com o backup. Antes de fazer alguma alteração nos dados do MySQL vamos parar o banco com o comando (em distribuição debian):

invoke-rc.d mysql stop

Depois de parar o MySQL vamos fazer uma cópia do /var/lib/mysql só por precaução:

cp -a /var/lib/mysql /var/lib/mysql.20090617

Agora vamos sobrescrever o /var/lib/mysql/ibdata1 com aquele que extraímos do tarball e em seguida copiar o diretório contendo os demais arquivos do banco, aquele /var/lib/mysql/nome_do_banco.

Para garantir vamos ajustar as permissões:

chown -R mysql:mysql /var/lib/mysql/ibdata1 /var/lib/mysql/nome_do_banco

Neste ponto já podemos levantar o MySQL novamente:

invoke-rc.d mysql start

Nos logs do MySQL você vai perceber que ele vai acusar diversos erros, pois os dados de outros bancos que estão contidos no ibdata1 não possuem o seus respectivos diretórios no /var/lib/mysql, apenas ignore estes erros já que você está trabalhando em um sistema de produção, o objetivo aqui é conseguir um dump dos dados do banco que precisa ser recuperado.

O próximo passo então é gerar o dump dos dados com o comando:

mysqldump -uroot -p"senha_de_root" --databases nome_do_banco > dump.sql

Caso o MySQL te retorne erros de conexão ao executar esse comando você deve tentar novamente até conseguir, isso acontece por causa daqueles erros que citei anteriormente pelos bancos que não existem (comigo não foram mais do que duas tentativas).

Bem, é isso ai, agora já temos um arquivo com o dump de todos os dados contidos no banco que precisamos recuperar, basta enviar para o servidor de produção e importar, mas o comando pra fazer isso eu vou deixar como lição de casa! :P

Um abraço e até a próxima!

Tags: , , ,

Java até que não é de todo ruim!

Muita gente vai querer me apedrejar depois de um título desses, mas é que quem me conhece sabe que não troco python por nenhuma outra linguagem. Já programei em Java no passado mas nunca gostei muito.

Enfim, estou fazendo meu TCC e meu projeto vai ser uma aplicação web para gerência de Sprints de software e pensei em fazer a GUI utilizando o Google Web Toolkit [1] ou somente GWT para os que já conhecem.

O GWT possibilita que você programe toda sua GUI em Java e depois compile para JavaScript. Muitos aqui vão perguntar: “tá certo, mas e por que não programar diretamente em JavaScript? Ainda mais que você não gosta de Java?”

E a minha resposta é a seguinte:

  • Plugin para o Eclipse [2] desenvolvido pela própria Google
  • Compatibilidade cross-browser sem precisar se preocupar
  • Suporte à internacionalização e localização
  • O Eclipse é cheio de frescuras (verificação de sintaxe, debugging, geração automática de trechos comuns de código, etc) que me ajudam, já que não sou tão íntimo com Java
  • E outras vantagens

Até agora fiz somente o tutorial inicial [3] sobre GWT mas já deu pra pegar bem como funciona o negócio. Gostei e se até o final do meu TCC continuar gostando por que não utilizar para meus próximos projetos?

Fica ai a dica para o pessoal que programa bastante pra web e as vezes tem que se virar fazendo as interfaces bonitinhas pros usuários exigentes mas tem pouco tempo pra isso: dêem uma change ao GWT!

Ahhh e sem esquecer, toda a parte de servidor da minha aplicação web vai ser escrita em Python, utilizando o framework Django e sendo servido pelo Google App Engine [4]!

[1] http://code.google.com/webtoolkit/

[2] http://www.eclipse.org/

[3] http://code.google.com/intl/en/webtoolkit/tutorials/1.6/gettingstarted.html

[4] http://appengine.google.com/

Google Wave, substituindo o e-mail?

Como muitos já devem estar sabendo a esta hora é que o Google mostrou ao mundo seu mais novo projeto chamado Wave. Depois de assistir o vídeo [1] de 1:20h de duração notei que parece ser um projeto com bastante futuro pela frente.

O Wave é uma espécie de e-mail, instant messenger, editor de documentos, álbum de fotos, etc… e tudo de forma colaborativa! O mais interessante de tudo isto é que o Google planeja disponibilizar todo o código fonte da plataforma, de maneira que cada empresa vai poder ter seu servidor Wave pra alocar seus domínios e desfrutar de todas as ferramentas que o Wave disponibiliza. Eu vejo o Wave como um futuro substituto ao e-mail, uma vez que toda a integração que o Wave traz parece tornar a comunicação muito mais fácil.

Já baixei a API pra fazer robots em python e assim que sobrar um tempo vou começar a brincar com o Wave. :P

Só nos resta esperar quando o Google vai disponibilizar o código do seu servidor e cliente de referência para começarmos a botar em produção nossos próprios servidores Wave!

Pra se ter uma idéia do que pode ser feito com a API é só dar uma olhada no blog [2] de desenvolvimento do Wave.

[1] http://wave.google.com

[2] http://googlewavedev.blogspot.com