Seleccionar página

Recuperación de tablas InnoDB en MySQL: Error 1146 (42S02)

por | Jun 18, 2010 | MySQL

Un cliente ha conseguido reventar la base de datos MySQL al llenarse la partición de datos al 100%

Tras efectuar los pertinentes cambios para dar más tamaño a la partición de datos, al acceder a la base de datos salía el siguiente error:

[root@neodoo fsolans] # mysql

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input statement.

mysql> use dcm4chee;

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> select * from users;

ERROR 1146 (42S02): TABLE ‘dcm4chee.users’ doesn’t exist

Éste problema me ha pasado sobre una máquina virtualizada con Xen,  CentOS 5.1 y MySQL 5.0.

Curiosamente, al hacer un show tables aparecen las tablas y tanto el directorio ./data/dcm4chee (que representa la database dcm4chee) y los ficheros .frm (que representan las tablas InnoDB) están físicamente.

Tras mucho googlear, descubro que las tablas InnoDB (a no ser que se indique lo contrario) contiene información fuera de la propia database dcm4chee y almacena información en MySQL; de este error, deduzco que se han perdido estos metadatos y MySQL es incapaz de conocer lo que hay en dcm4chee.

¿ Cómo solucionarlo ?

El cliente no tenía copia de seguridad (sino habría sido muy fácil con un simple mysqldump) y sólo disponíamos de unos scripts con las definiciones de las tablas.

Primero, paramos el MySQL y copiamos el directorio completo ./data/dcm4chee (en mi caso /tmp/dcm4chee).

He borrado la base de datos directamente desde SO haciendo un rm -Rf dcm4chee puesto que el drop database dcm4chee tampoco funcionaba al no ‘saber’ dónde están las tablas.

A continuación, he lanzado el script con:

[root@neodoo fsolans] # mysql < dcm4chee_ddl.sql

Automáticamente, genera la base de datos, las tablas y demás recursos. Físicamente, se ha creado el directorio dcm4chee y en su interior, aparecen los ficheros que representan las tablas con extensión .frm. Pero ADEMÁS, ha metido en MySQL los metadatos con esta información por lo que ahora el SELECT de las tablasya NO FALLA.

Casí lo tenemos. Faltan los datos de las tablas…

Paramos la BD MySQL y copiamos los .frm de la copia temporal de dcm4chee (en nuestro caso en /tmp/dcm4chee_17_10_2010) encima de los que ha generado MySQL.

[root@neodoo fsolans] # cp -Rf /tmp/dcm4chee/*.frm /var/lib/mysql/data/dcm4chee/

Rearrancamos la BD y voilà ! Ya tenemos acceso a las tablas con sus datos. Al menos en mi caso.

Te puede interesar…

2 Comentarios

  1. maznar

    Este fichero «dcm4chee_ddl.sql» es la estructura basica DDL de la BD pero sin datos.

    Responder
    • fhserver

      Me salvaste la raja !! había echo de todo menos esto gracias !

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *