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.