Arreglando un BD en ZIMBRA — Table ‘mboxgroup33.appointment’ doesn’t exist

Si te gustan los articulos, por favor deja tu comentario, eso me ayuda a motivarme y seguir escribiendo mas sobre estos temas!!

 

Este error sucede con frecuencia al momento de actualizar Zimbra a una version superior, en este caso yo trataba de actualizar Zimbra 8.0.9 hacia 8.7.11.

#./install.sh

...........

................

Do you agree with the terms of the software license agreement? [N] y

 

Checking current number of databases...

Do you want to verify message store database integrity? [Y] y
Verifying integrity of message store databases. This may take a while.
mysqld is alive
Database errors found.
/opt/zimbra/mysql/bin/mysqlcheck --defaults-file=/opt/zimbra/conf/my.cnf -S /opt/zimbra/db/mysql.sock -A -C -s -u root --auto-repair --password=XXXXXXXX
mboxgroup33.appointment
Error    : Table 'mboxgroup33.appointment' doesn't exist
mboxgroup33.appointment
Error    : Table 'mboxgroup33.appointment' doesn't exist

 

Y no te deja continuar!!!

Paso previo.- Actualizar metadata de YUM

Verificar que las metadatas de los repositorios esten actualizados. Resolverlo de la siguiente manera:

 yum clean metadata

 

Paso 1.- Identificando el error

Revisar esto: tail -f /opt/zimbra/log/mysql_error.log

Sale esto:

[ERROR] Cannot find or open table mboxgroup33/appointment from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html
how you can resolve the problem.

 

Paso 2.- Intentando reparar de manera simple

Ingresamos como usuario zimbra y ejecutamos los siguiente comandos:

[zimbra@mail ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 364
Server version: 5.5.39-log Zimbra binary distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>  use mboxgroup33
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> repair table appointment;
+-------------------------+--------+----------+-----------------------------------------------+
| Table                   | Op     | Msg_type | Msg_text                                      |
+-------------------------+--------+----------+-----------------------------------------------+
| mboxgroup33.appointment | repair | Error    | Table 'mboxgroup33.appointment' doesn't exist |
| mboxgroup33.appointment | repair | status   | Operation failed                              |
+-------------------------+--------+----------+-----------------------------------------------+
2 rows in set (0.00 sec)

mysql> quit;

No pudimos reparar a la primera.

Paso 3.- Identificando el error dentro de la tabla

Muchas veces el error se debe a una simple mala linea dentro de la BD, hay que identificar esto.

(Revisar esto para mas información: https://wiki.zimbra.com/wiki/Mysql_Crash_Recovery_(alternate_method))

Para identificar el error, necesitamois 2 cosas:

  • Listar todos los Mailbox dentro del mboxgroup previamente identificado. (en mi caso el 33), ejecutar como usuario ZIMBRA.(tener en cuenta el group_id del siguiente comando, alli se pone el numero de mi tabla)
 mysql --skip-column-names -e "SELECT id FROM zimbra.mailbox WHERE group_id=33" > /tmp/XXlist

El archivo XXlist me muestra lo siguiente:

[zimbra@mail ~]$ cat /tmp/XXlist
133
233

Esto me indica que tengo 2 Mailbox dentro de este grupo. Estos Mailbox tienen el id 133 y 233.

  • Necesitamos tambien listar las tablas existentes en el mboxgroup33.
[zimbra@mail ~]$ mysql --skip-column-names -e "CONNECT mboxgroup33;SHOW TABLES" > /tmp/tables
[zimbra@mail ~]$ cat /tmp/tables
appointment
mail_item
mail_item_dumpster
open_conversation
revision
revision_dumpster
tag
tagged_item

Este  comando me lista las tablas afectadas dentro del mboxgroup.

Paso 4.-  Identificando las cuentas de correo  dañadas

Debemos ingresar a Mysql y hacer una consulta , alli les listará a quien le pertenece la cuenta.

mysql>  use mboxgroup33
mysql> SELECT * FROM mboxgroup33.mail_item WHERE mailbox_id=133;
mysql> SELECT * FROM mboxgroup33.mail_item WHERE mailbox_id=233;

En mi caso las cuentas eran ventas@midominio.com.pe y marketing@midominio.com.pe

Paso 5.- Como se habran dado cuenta la tabla “appointment” esta dañada y parece como que no existiera.

Voy a verificar en otra BD “Mboxgroup32” por ejemplo que valores tiene esta tabla “appointment” y cual es su estructura.

mysql> SELECT * FROM mboxgroup32.appointment;
Empty set (0.03 sec)

mysql> SHOW COLUMNS FROM mboxgroup32.appointment;
+------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| mailbox_id | int(10) unsigned | NO | PRI | NULL | |
| uid | varchar(255) | NO | PRI | NULL | |
| item_id | int(10) unsigned | NO | | NULL | |
| start_time | datetime | NO | | NULL | |
| end_time | datetime | YES | | NULL | |
+------------+------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

Esta tabla esta vacia, hice la misma verificacion para Mboxgroup31, Mboxgroup30 y da el mismo resultado, por lo que puedo pensar que si elimino esta tabla (Mboxgroup33.appointment) y la vuelvo a crear con la misma estructura deberiamos de dejar de tener el mensaje de error en la BD.

mysql> DROP TABLE IF EXISTS mboxgroup33.appointment;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE mboxgroup33.appointment LIKE mboxgroup32.appointment;
Query OK, 0 rows affected (0.18 sec)

mysql> SELECT * FROM mboxgroup33.appointment;
Empty set (0.00 sec)

mysql> SHOW COLUMNS FROM mboxgroup33.appointment;
+------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| mailbox_id | int(10) unsigned | NO | PRI | NULL | |
| uid | varchar(255) | NO | PRI | NULL | |
| item_id | int(10) unsigned | NO | | NULL | |
| start_time | datetime | NO | | NULL | |
| end_time | datetime | YES | | NULL | |
+------------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

Hice esto:

  • Elimine la tabla mboxgroup33.appointment
  • Volví a crear la tabla mboxgroup33.appointment desde mboxgroup32.appointment (pasa con la misma estructura)
  • Verifique que exista la tabla y su estructura de mboxgroup33.appointment

Despues de esto volivi a ejecutar el instalador… todo OK.!

OPCIONAL (si deseas puedes eliminar todo el MBOXGROUP, debes de tener en cuenta qué correos se alojan allí como ya lo describimos lineas arriba)

Paso 6.- Eliminación de la cuenta dañada (Caso eXTREMO si no funciona el paso 5)

En mi caso las cuentas dañadas eran 2. En este punto lo que hice fue, Mediante cualquier cuenta de correo como Outlook, descargue todos los correos de las cuentas dañadas a la PC y procedi a eliminar todas las cuentas del MBOXGROUP33 desde la consola de la BD.

Copia de seguridad de la BD

– Antes debemos de detener los buzones para que ninguna data nueva sea escrita en la BD.

$zmmailboxdctl stop

 

– Buscamos el usuario y password de Mysql Zimbra

zmlocalconfig -s zimbra_mysql_password

Tambien es buena idea que saques una copia a la carpeta en donde se almacena la Base de datos

cp /opt/zimbra/db/data /opt/zimbra/db/data_old

 

Descargamos (por siacaso) la BD sin el mailbox dañado

/opt/zimbra/mysql/bin/mysqldump --socket=/opt/zimbra/db/mysql.sock -u zimbra -p mboxgroupXX --where=mailbox_id!=33 > /tmp/dbdump.out

Aqui nos solicitará el password del MySql . Colocar  el que aparecio 2 comandos mas arriba.

ELIMINACION DE LA CUENTA Y VOLVEMOS A CREAR LA TABLA

mysql -e "DROP DATABASE mboxgroup33"
mysql -e "CREATE DATABASE mboxgroup33 DEFAULT CHARACTER SET utf8" 

 

Con esto ya deberiamos haber eliminado el problema, reiniciamos el servidor y procedemos a validar algun error en la BD.

 tail -f /opt/zimbra/log/mysql_error.log

 

Con esto ya podemos proseguir con el upgrade de nuestro servidor.

Paso 7.- Reiniciar el UPGRADE

#./install.sh

Importante.- Si la cuenta es de mucha importancia y deseamos crear de nuevo la cuenta con sus buzones. seguir el documento indicado al inicio.

https://wiki.zimbra.com/wiki/Mysql_Crash_Recovery_(alternate_method)

o

https://wiki.zimbra.com/wiki/Mysql_Crash_Recovery

 

Otros errores.

Si al momento de actualizar les sale el siguiente error:

Downloading packages (9):
   zimbra-core-components
   zimbra-ldap-components
   zimbra-mta-components
   zimbra-snmp-components
   zimbra-store-components
   zimbra-apache-components
   zimbra-spell-components
   zimbra-memcached
   zimbra-proxy-components
      ...Unable to download packages from repository. System is not modified.

 

Verificar que las metadatas de los repositorios esten actualizados. Resolverlo de la siguiente manera:

 yum clean metadata

o

 yum clean all

Luego reiniciar la actualización

Algunos problemas adicionales:

Solución – Zimbra – Error Upgrade 8.0.9 to 8.7.11 – Starting ldap…failed with exit code: 256.

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *