Recuperação de MYSQL do Zimbra em caso de desastres

De Wiki Hackstore

Obtendo informações sobre os databases corrompidos

Realize uma checagem da integridado do banco de dados:

source ~/bin/zmshutil ; zmsetvars
/opt/zimbra/mysql/bin/mysqlcheck --defaults-file=/opt/zimbra/conf/my.cnf -S /opt/zimbra/db/mysql.sock -A -C -s --user=root --password=$mysql_root_password


Caso algum banco de dados (mboxgroup) esteja corrompido no mysql,

Descobrir quais contas estão em um determinado mboxgroup

Altere o valor "22" para o grupo desejado, e execute o comando como usuário Zimbra:

mysql -e "select comment from zimbra.mailbox where group_id='22'"


Descobrir qual é o mboxgroup de um determinado usuário

zmprov getMailboxInfo conta@dominio.com.br

Após obter o resultado, basta extrair os dois últimos dígitos do mailboxId. Ex:

[zimbra@webmail ~]$ zmprov getMailboxInfo conta@dominio.com.br
mailboxId: 383
quotaUsed: 866420313

No caso acima, o mboxgroup é o "83". :D

Nota: Caso os dois últimos digitos sejam '00' na realidade o grupo é o mboxgroup100, não mboxgroup0.

Mais infos: http://wiki.zimbra.com/wiki/Account_mailbox_database_structure

teste code teste code teste code teste code


Recuperando o MYSQL

Faça um dump dos DBs

Pare o Zimbra:

/etc/init.d/zimbra stop

Inicie apenas o MSQL (Execute os comandos abaixo como usuário zimbra):

su - zimbra
source ~/bin/zmshutil ; zmsetvars ; mysql.server start

Faça uma lista dos DBs válidos:

mysql --batch --skip-column-names -e "show databases" | grep -e mbox -e zimbra > /tmp/mysql.db.list

Crie o diretório e faça o dump dos DBs:

mkdir /tmp/mysql.sql
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"; sleep 10;  done

Exclua os DBs corrompidos

mysql -u root --password=$mysql_root_password -e "drop database zimbra"
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</code>
mysql.server stop
rm -rf /opt/zimbra/db/data/ib*
mysql.server start

Crie os DBs e importe os dumps

for db in `cat /tmp/mysql.db.list`; do     mysql -e "create database $db character set utf8";     echo "Created $db"; done
mysql zimbra < /tmp/mysql.sql/zimbra.sql
for sql in /tmp/mysql.sql/mbox*; do     mysql `basename $sql .sql` < $sql;     echo -e "Updated `basename $sql .sql` \n"; done


Teste o servidor e inicie o Zimbra

mysql zimbra -e "select * from mailbox order by id desc limit 1"

Caso dê tudo OK, pare o MYSQL e inicie o Zimbra:

mysql.server stop

Como root:

/etc/init.d/zimbra start


Mais infos:

http://wiki.zimbra.com/wiki/Mysql_Crash_Recovery
http://www.zimbra.com/forums/administrators/62221-mysql-crash-stack-trace-corrupt-backup.html