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 licenseType ‘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 -ADatabase 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.
Este fichero «dcm4chee_ddl.sql» es la estructura basica DDL de la BD pero sin datos.
Me salvaste la raja !! había echo de todo menos esto gracias !