Página Inicial > Linux > Zimbra: Recuperando MySQL corrompido

Zimbra: Recuperando MySQL corrompido

Opa,

Recentemente tive um problema grave com o servidor de colaboração Zimbra, todo o tráfego de e-mail estava parado e, após uma busca nos logs, descobri que o problema estava no banco de dados MySQL que estava com algumas tabelas corrompidas, segue abaixo os passos que foram necessários para fazer um dump de todas as tabelas relacionadas, limpeza da base e importação dos dados.

OBS.: Mantenha sempre um backup, essa opção pode não funcionar em alguns casos! Não me responsabilizo pelo que pode ocorrer ao seu banco, realize esses passos por sua conta e risco!

Primeiro pare os serviços do Zimbra:

[zimbra@meuservidoremail ~]$ zmcontrol stop

Adicione a variável abaixo no arquivo de configuração do banco MySQL dentro da sessão [mysqld]:

[zimbra@meuservidoremail ~]$ vim /opt/zimbra/conf/my.cnf

innodb_force_recovery = 1

Inicie o serviço do MySQL:

[zimbra@meuservidoremail ~]$ mysql.server start

Carregue as variáveis do Zimbra:

[zimbra@meuservidoremail ~]$ source ~/bin/zmshutil ; zmsetvars

Crie uma lista dos bancos de dados existentes:

[zimbra@meuservidoremail ~]$ mysql –batch –skip-column-names -e “show databases” | grep -e mbox -e zimbra > /tmp/mysql.db.list

Crie um diretório na pasta tmp para armazenar os dumps dos bancos:

[zimbra@meuservidoremail ~]$ mkdir /tmp/mysql.sql

Faça o dump dos bancos:

[zimbra@meuservidoremail ~]$ for db in $(cat /tmp/mysql.db.list); do
~/mysql/bin/mysqldump $db -S $mysql_socket -u root –password=$mysql_root_password > /tmp/mysql.sql/$db.sql
echo “Dumped $db”
done

OBS1.: Se forem apresentados erros na execução dos dumps dos bancos, incremente o valor da variável innodb_force_recovery (o valor máximo é 6), reinicie o banco e execute o comando novamente até não obter erros.

OBS2.: Caso tenha problemas em executar os dumps acesse esse link para resetar a senha do banco MySQL.

Remova todos os bancos existentes e possivelmente corrompidos:

[zimbra@meuservidoremail ~]$ for db in $(cat /tmp/mysql.db.list |grep mbox)
do
mysql -u root –password=$mysql_root_password -e “drop database $db”
echo -e “Dropped $db”
done

[zimbra@meuservidoremail ~]$ mysql -u root –password=$mysql_root_password -e “drop database zimbra”

Remova a váriavel innodb_force_recovery do arquivo de configuração do banco MySQL e reinicie o serviço:

[zimbra@meuservidoremail ~]$ vim /opt/zimbra/conf/my.cnf
[zimbra@meuservidoremail ~]$ mysql.server restart

Crie os bancos e importe os dumps:

[zimbra@meuservidoremail ~]$ for db in $(cat /tmp/mysql.db.list)
do
mysql -e “create database $db character set utf8”
echo “Created $db”
done

[zimbra@meuservidoremail ~]$ mysql zimbra < /tmp/mysql.sql/zimbra.sql

[zimbra@meuservidoremail ~]$ for sql in /tmp/mysql.sql/mbox*
do
mysql $(basename $sql .sql) < $sql
echo -e “Updated $(basename $sql .sql) \n”
done

Teste o acesso ao banco e inicie os serviços do Zimbra:

[zimbra@meuservidoremail ~]$ mysql zimbra -e “select * from mailbox order by id desc limit 1”
[zimbra@meuservidoremail ~]$ zmcontrol start

Pronto! Verifique nos logs se os erros continuam e lembre-se de executar backup’s!

Abraço!

Fonte: http://wiki.zimbra.com/index.php?title=Mysql_Crash_Recovery

Categories: Linux Tags: , ,