Soy bastante nuevo en MySQL y estoy recibiendo un error bastante interesante sobre el que no puedo encontrar ninguna ayuda a través de google y la búsqueda de stackoverflow.
Estoy ejecutando un servidor local de MySQL 5.6.10 en MacOS 10.8.3 y manejo mi base de datos a través de Navicat essentials for MySQL.
El error que obtengo es que después de ejecutar y gestionar mi base de datos sin problemas durante un par de días/semanas algo se dispara para (parece que de forma incompleta) eliminar algunas de las tablas que he creado utilizando consultas desde dentro de Navicat.
Cuando intento ejecutar consultas utilizando estas tablas, Navicat me avisa de que la tabla en cuestión no existe. Hasta aquí todo bien - ahora viene la parte buena:
Cuando intento CREAR la tabla, por ejemplo, llamada "temp", que antes estaba allí, me aparece el siguiente mensaje de error:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
Sin embargo, si intento soltar la tabla, o intento descartar el tablespace para esta tabla, usando
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
Obtengo los siguientes mensajes de error:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
Esto significa que se me aconseja descartar el espacio de la tabla pero cuando intento hacerlo la tabla no existe. ¿Es posible que haya algún tipo de remanente de esta tabla en un lugar diferente donde la consulta DISCARD no está comprobando? ¿Y alguien tiene una idea de lo que podría desencadenar todo esto - completamente al azar como parece?
Como he dicho, soy nuevo en el tema y bastante despistado. Sospecho que reiniciar mi portátil, es decir, reiniciar mi servidor MySQL local, o tal vez los derechos de permiso de usuario podría tener que ver con él, pero sólo estoy haciendo una hipótesis aquí.
Un poco tarde aquí, pero por lo general he visto que este problema se produce cuando se obtiene un 'tablespace full' error cuando se ejecuta en un 'innodb_file_per_table' modo. Sin entrar en demasiados detalles (más aquí), el tablespace del servidor de la base de datos está definido por la configuración de innodb_data_file_path y por defecto es bastante pequeño. Incluso si se hace más grande, el 'tablespace full' todavía puede ocurrir con consultas más grandes y tal (muchas 'cosas' que no son de la tabla se almacenan allí, registros de deshacer, cachés, etc...).
De todos modos, he encontrado que si se mira en el directorio del sistema operativo donde se almacenan los archivos por tabla, /var/lib/mysql por defecto en OSX, /usr/local/var/mysql con homebrew, creo que encontrará un archivo huérfano tablename.ibd sin su compañero normal tablename.frm. Si mueves ese archivo .ibd a una ubicación temporal segura (sólo para estar seguro) eso debería solucionar el problema.
$ ls /var/lib/mysql
table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb
$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/
Una advertencia, sin embargo, asegúrese de que lo que sea que está causando el problema originalmente, por ejemplo, consulta de larga duración, tabla bloqueada, etc ... se ha borrado. De lo contrario, acabará con otro archivo .ibd huérfano cuando lo intente por segunda vez.
***La solución es la misma que la de los demás, pero no es la misma que la de los demás.
Sin embargo, la opción más fácil es esta: reiniciar MySQL, y luego hacer los mismos cuatro pasos como se indica a continuación:
1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table
De esta manera, el id del tablespace en el diccionario de datos y el archivo coinciden; por lo tanto, la importación del tablespace tuvo éxito.
Esto puede darle una mayor confianza en el tratamiento de algunos de los InnoDB "gotcha's" durante el proceso de recuperación o incluso las transferencias de archivos.
Intentar dejar el tablespace puede dar otros errores. En mi caso, obtuve el siguiente error:
DROP TABLESPACE `tablename`
Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP'
Mi solución fue soltar la base de datos. Esto eliminará cualquier tablespace relacionado con ella y permitirá crear las tablas de nuevo.