The world's most popular open source database
Un problema específico de las tablas es que el servidor MySQL mantiene
la información relativa al diccionario de datos dentro de ficheros
.frm que guarda en los directorios de las bases de
datos, en tanto que InnoDB también almacena la
información dentro de su propio diccionario de datos, en el interior de
los ficheros de espacio de tablas. Si se mueven los ficheros
.frm o si el servidor sufre una caída durante una
operación de diccionario de datos, los ficheros
.frm pueden quedar con diferencias respecto al
diccionario de datos interno de InnoDB.
Un síntoma de que ha ocurrido esto es si falla una sentencia
CREATE TABLE. Si esto sucede, se debería observar el
registro (log) de errores del servidor. Si el registro indica que la
tabla ya existía dentro del diccionario de datos interno de
InnoDB, se tiene una tabla que ha quedado únicamente
dentro de los ficheros de espacio de tablas de InnoDB
y que no tiene el correspondiente fichero .frm. El
mensaje de error tiene este aspecto:
InnoDB: Error: table test/parent already exists in InnoDB internal InnoDB: data dictionary. Have you deleted the .frm file InnoDB: and not used DROP TABLE? Have you used DROP DATABASE InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another InnoDB: database and moving the .frm file to the current database. InnoDB: Then MySQL thinks the table exists, and DROP TABLE will InnoDB: succeed.
Se puede eliminar la tabla que causa el conflicto siguiendo las instrucciones del mensaje de error. Esto es, crear una tabla InnoDB con el mismo nombre en otra base de datos y mover al directorio de la base de datos actual el fichero .frm resultante. MySQL asumirá que la tabla ya existe, y se podrá eliminar con DROP TABLE. creará.
Otro síntoma de un diccionario de datos desactualizado es que MySQL
emite un mensaje de error donde dice que no puede abrir un fichero
.InnoDB:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
En el registro de errores puede encontrarse un mensaje similar a este:
InnoDB: Cannot find table test/child2 from the internal data dictionary InnoDB: of InnoDB though the .frm file for the table exists. Maybe you InnoDB: have deleted and recreated InnoDB data files but have forgotten InnoDB: to delete the corresponding .frm files of InnoDB tables?
Esto significa que hay un fichero .frm que no tiene
la correspondiente tabla dentro de InnoDB. El fichero
.frm puede ser borrado manualmente para
solucionarlo.
Si MySQL cae durante una operación ALTER
TABLE, puede aparecer una tabla temporal huérfana dentro del
espacio de tablas InnoDB. Empleando
innodb_table_monitor se verá listada una tabla cuyo
nombre es #sql-.... En MySQL 5.0, se pueden llevar
a cabo sentencias SQL sobre tablas cuyo nombre contenga el caracter
'#' si se encierra el nombre dentro de acentos graves
(ASCII 96). De esa forma, se puede eliminar esta tabla huérfana del mismo
modo que las mencionadas anteriormente. Hay que tener en cuenta que al
copiar o renombrar un fichero en el shell de Unix, se necesitará colocar
el nombre del fichero entre comillas dobles si éste contiene un caracter
'#'.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

