Error: el espacio de tabla para la tabla xxx existe. DESECHE el espacio de tabla antes de IMPORTAR


134

Soy bastante nuevo en MySQL y recibo un error bastante interesante en 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 administro mi base de datos a través de Navicat essentials para MySQL.

El error que obtengo es que después de ejecutar y administrar mi base de datos muy bien durante un par de días / semanas, algo se dispara para (parece que está incompleto) eliminar algunas de las tablas que creé usando consultas desde Navicat.

Cuando intento ejecutar consultas con estas tablas, Navicat me advierte que la tabla en particular no existe. Hasta ahora todo bien, aquí viene la parte buena:

Cuando intento CREAR la tabla, por ejemplo, llamada "temp", que estaba allí anteriormente, recibo el siguiente mensaje de error:

Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.

Sin embargo, si trato de descartar la tabla, o trato de descartar el espacio de tabla para esta tabla, usando

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

Recibo los siguientes mensajes de error:

Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist

Eso significa que se me aconseja que descarte 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 DESECHAR no esté verificando? ¿Y alguien tiene una idea de lo que podría desencadenar todo eso, completamente al azar como parece?

Como dije, soy nuevo en el tema y no tengo ni idea. Sospecho que reiniciar mi computadora portátil, es decir, restablecer mi servidor MySQL local, o tal vez los derechos de permiso del usuario podrían tener que ver con eso, pero solo estoy planteando una hipótesis aquí.


Puede verificar algunas soluciones para este tipo de error. codespeaker.com/laravel-framework/…
smzapp

Respuestas:


123

Un poco tarde aquí, pero en general he visto que este problema ocurre cuando aparece un error de "espacio de tabla lleno" cuando se ejecuta en modo "innodb_file_per_table". Sin entrar en demasiados detalles (más aquí ), el espacio de tabla del servidor de bases de datos está definido por la configuración innodb_data_file_path y, por defecto, es bastante pequeño. Incluso si se hace más grande, el 'espacio de tabla lleno' aún puede ocurrir con consultas más grandes y similares (muchas 'cosas' que no están en la tabla se almacenan allí, deshacer registros, cachés, etc.).

De todos modos, descubrí que si buscas en el directorio del sistema operativo donde están almacenados los archivos por tabla, / var / lib / mysql por defecto en OSX, / usr / local / var / mysql con homebrew iirc, encontrarás un archivo huérfano tablename.ibd sin su archivo complementario tablename.frm normal. Si mueve ese archivo .ibd a una ubicación temporal segura (solo 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/

Sin embargo, una advertencia, asegúrese de que lo que está causando el problema originalmente, por ejemplo, consulta de larga ejecución, tabla bloqueada, etc., se haya borrado. De lo contrario, terminará con otro archivo .ibd huérfano cuando lo intente por segunda vez.


55
Mi directorio MySQL-Data estaba en OS X Yosemite estaba almacenado en /usr/local/mysql/datalugar de /var/lib/mysql/. De lo contrario, resolvió perfectamente el problema.
Alex Hoppen

13
en mi caso no funcionó ... eliminé el archivo idb huérfano ... y cuando fui a recrear la tabla con el mismo nombre, recibí un mensaje que decía que la tabla ya existe (para lo cual eliminé el .idb archivo) ... después de la acción anterior, se creó un nuevo archivo .idb huérfano en el directorio ... muy extraño ... Realmente no sé qué asumir.
Dimitris Papageorgiou

44
Tengo el mismo problema que Dimitris: tuve que crear un volcado de la base de datos, descartar la base de datos y restaurarla desde el volcado.
Gerfried

1
@Gerfried Esto funcionó para mí siempre que detuve e inicie el proceso MySQL después de eliminar el archivo.
MER

2
@DimitrisPapageorgiou Esto funcionó para mí siempre que detuve e inicie el proceso de MySQL después de eliminar el archivo.
MER

75

Usuarios de Xampp y Mamp

Tuve el mismo error al importar una base de datos (después de vaciarla) a través de MySQL. Descubrí que me quedaba un tablename.ibdarchivo mientras se eliminaban todos los demás. Lo eliminé manualmente mysql/data/database_namey el error desapareció.


¿Esta respuesta ayudó a las personas que no usan XAMPP?
Technotronic

3
pulgares arriba de mi parte! funcionado bien. Sin embargo, permítame actualizar un poco la ruta de la carpeta (me confundí al intentar encontrarla): / Aplicaciones / XAMPP / xamppfiles / var / mysql
Fenix ​​Aoras

Al usar esto, se desarrolló un error 168 del motor de almacenamiento en Linux mint, sin usar Xampp ni Mamp (sin críticas, solo informando)
Steven

1
¡trabajos! Eliminé un archivo .ibd roto y luego la tabla se puede volver a crear. Ubuntu 16, mariadb
waza123

Lo mismo ocurre con Docker (si Docker se bloquea o se reinicia el host, es posible que tenga una fecha límite dentro de su carpeta de sincronización que crea este error)
Sliq

23

Para usuarios de WAMP [Windows 7 Ultimate x64-bit]:

Estoy de acuerdo con lo que dijo DangerDave y por eso estoy haciendo una respuesta disponible para los usuarios de WAMP .

Nota: En primer lugar, debe ir a la carpeta .. \ WAMP \ Bin \ MySQL \ MySQL [Your MySQL Version] \ Data .

Ahora verá carpetas de todas sus bases de datos.

  • Haga doble clic en la carpeta de la base de datos que tiene la tabla ofensiva para abrirla.
  • No debería haber un archivo [Your offending MySQL table name].frm, en su lugar debería haber un archivo[Your offending MySQL table name].ibd
  • Borrar el [Your offending MySQL table name].ibd
  • Luego, elimínelo de la Papelera de reciclaje también
  • Luego ejecute su consulta MySQL en la base de datos y listo

22

Si .idbvuelve a crear el archivo después de eliminarlo, lea esta respuesta.

Así es como funcionó conmigo. Tenía el .idbarchivo sin su correspondiente .frmy cada vez que borro el .idbarchivo, la base de datos lo vuelve a crear. y encontré la solución en una línea en la documentación de MySQL (el espacio de tabla no existe )

1- Cree un archivo .frm coincidente en algún otro directorio de la base de datos y cópielo en el directorio de la base de datos donde se encuentra la tabla huérfana.

2- Emitir DROP TABLE para la tabla original. Eso debería descartar con éxito la tabla e InnoDB debería imprimir una advertencia en el registro de errores de que faltaba el archivo .ibd.

Copié otro .frmarchivo de tabla y lo nombré como mi tabla faltante, luego hice una consulta de caída de tabla normal y listo, funcionó y la tabla se soltó normalmente.

mi sistema es XAMPP en Windows MariaDB v 10.1.8


3
En caso de que esto no fuera obvio para nadie más: cuando haya creado el archivo .frm y suelte la tabla, el archivo .idb debe eliminarse.
Narretz

66
Puede confirmar, los pasos deben ser: 1. eliminar mysql / path / table_name.idb 2. agregar table_name.frm 3. DROP table_name
Jeremy Dennen

Esto funcionó para mí. Gracias. Recibí este error al eliminar un FK e inmediatamente después, detuve mysql. Creo que esta es la tabla de datos corruptos.
Rodolfo Velasco

recuerde reiniciar mysql después de poner el archivo e intente soltarlo
Seyed Ali Roshan

En mysql> data> mysql, hay un archivo .frm que necesito. ¿Puedo copiar este?
Timo

8

En mi caso, la única solución de trabajo fue:

  1. CREAR bad_tableMOTOR DE MESA = MyISAM ...
  2. rm bad_table.ibd
  3. MESA PLEGABLE bad_table

¡Trabajó para mi! [ERROR] InnoDB: el archivo './dbname/tablename.ibd' ya existe aunque la tabla correspondiente no existía en el diccionario de datos de InnoDB. ¿Ha movido archivos .ibd de InnoDB sin usar los comandos SQL DISCARD TABLESPACE e IMPORT TABLESPACE, o mysqld se bloqueó en medio de CREATE TABLE? Puede resolver el problema eliminando el archivo './dbname/tablename.ibd' debajo del 'datadir' de MySQL.
Padrian

1
No se puede crear la tabla porque existe Tablespace.
Liam Mitchell

no es trabajo para mi El archivo ibd sigue apareciendo después de que quiero volver a crear la tabla con el mismo motor.
Fajar Rukmo

8

Esto es exactamente lo que hice en mariadb 10.2.16 en fedora cuando tenía una tabla que mostraba exactamente los mismos errores en el archivo de registro, supongo ...

2018-07-11  9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11  9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918

su kilometraje y errores pueden variar, pero supongo que el principal es

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

con drop table no funciona tan bien como alter table ...

MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'

MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist

crear tabla también falla así:

MariaDB [database_name]> create table  innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT

para arreglar esto, lo que hice fue primero

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

luego en el directorio / var / lib / mysql / database_name hice lo siguiente como root reconociendo la sobrescritura de innodb_table.ibd causándonos problemas

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

luego de vuelta en la consola mysql emití un comando de caída exitoso en ambas tablas

MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: database_name

Query OK, 0 rows affected (0.08 sec)

MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)

y todo ahora es todo cuadrado y puedo recrear una sola mesa ...

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)

EDITAR: iba a agregar un

restorecon -Rv /var/lib/mysql/database_name 

después de copiar la base de datos para obtener todos los contextos de selinux de la forma en que deberían ser, aunque los eliminemos de la base de datos casi de inmediato, pero como alternativa puede agregar la opción --archive o -a a los dos cp comandos, entonces sí, en realidad la opción de archivo acorta esto:

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb

solo a lo siguiente, que creo que es mejor y mantiene el contexto de selinux que está configurado para la tabla ya hecha.

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

He reemplazado la lista de comandos más larga anterior por la lista más corta que podría acortarse aún con un *


Esto funcionó bien para mí en CentOS MariaDB 10.2.31. Estaba buscando una solución que no requiriera reiniciar el servicio MySQL y esta fue. La clave es crear el conjunto de archivos innodb_table2 limpios (innodb_table2.frm e innodb_table2.ibd) y colocarlos a ambos sobre los archivos innodb_table.
Justin

6

En mi caso:

Primero elimine tableName.ibden su directorio de base de datos de Mysql y la segunda ejecución:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

Gracias, en mi caso, he 1) detenido el servidor de base de datos (service mysql stop) 2) eliminado el archivo idb 3) iniciado el servidor de base de datos (service mysql start) No
ejecuté

El directorio de su base de datos en Windows está en C: \ ProgramData \ MySQL por defecto
Rodin10

4

Obtuve el mismo error al ejecutarlo en wampserver al intentar crear una tabla de usuarios. Encontré un archivo users.ibd y después de eliminar este archivo, ejecuté nuevamente el comando migrate y funcionó. El archivo en mi máquina Windows estaba ubicado en wamp / bin / mysql / mysql5.6.12 / data / myproject.


4

Solución

Sin embargo, la opción más fácil es esta: reinicie MySQL, luego realice los mismos cuatro pasos de la siguiente manera:

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, la id del espacio de tabla en el diccionario de datos y el archivo coinciden; importando así el espacio de tabla tuvo éxito.

Esto puede darle una mayor confianza al tratar con algunos de los "problemas" de InnoDB durante el proceso de recuperación o incluso las transferencias de archivos.

árbitro


77
Esta no es una respuesta independiente.
Nathaniel Ford

3

Aquí están los pasos de la solución:

  1. copia de seguridad de su base de datos (estructura con opción de caída y datos)
  2. detener el servicio del motor mysql
  3. eliminar manualmente el directorio de la base de datos desde mysql / data
  4. iniciar motor mysql
  5. crear una nueva base de datos con cualquier nombre diferente de su base de datos corrupta
  6. cree una sola tabla con el nombre de la tabla corrupta dentro de la nueva base de datos (este es el secreto). y es mejor crear la tabla con exactamente la misma estructura.
  7. cambiar el nombre de la base de datos a la antigua base de datos corrupta
  8. restaure su copia de seguridad y su mesa funcionará bien.

2

Tuve este problema varias veces. Si tiene una base de datos grande y desea intentar evitar la copia de seguridad / restauración (con la tabla faltante agregada), intente varias veces de un lado a otro:

DROP TABLE my_table;

ALTER TABLE my_table DESCARGAR TABLESPACE;

-y-

rm my_table.ibd (huérfano sin el correspondiente my_table.frm) ubicado en el directorio / var / lib / mysql / my_db /

-y entonces-

CREAR TABLA SI NO EXISTE my_table(...)


2

Eliminar / Mover tablename.ibd seguro no funcionó para mí.

Como lo solucione

Como iba a eliminar la tabla corrupta y no existente, hice una copia de seguridad de las otras tablas yendo a phpmyadmin-> database-> export-> tablas seleccionadas para hacer una copia de seguridad-> exportar (como .sql).

Después de eso, seleccioné el icono de la base de datos junto al nombre de la base de datos y luego lo solté. Creó una nueva base de datos. Seleccione su nueva base de datos-> importar-> Seleccione el archivo que descargó anteriormente-> haga clic en importar. Ahora tengo mis viejas tablas de trabajo y he eliminado la tabla dañada. Ahora acabo de crear la tabla que arrojó el error.

Probablemente tuve una copia de seguridad anterior de la tabla corrupta.


2

Este error ocurre cuando suspende algunas funciones. Como ejecutar la consulta a continuación con una clave foránea incorrecta.

set foreign_key_checks=0

2

Tenía exactamente el mismo problema; Prepararía agregado mysql@5.6(después de tener 5.5 previamente).

Los valores predeterminados para 5.6 son innodb_file_per_table=1mientras que en 5.5 son innodb_file_per_table=0.

Su ibdata1archivo existente (los datos innodb combinados) todavía tendrá referencias a las tablas que está intentando crear / soltar. innodb_file_per_tableVuelva a cambiar a 0 o elimine el archivo de datos ibdata1 ( esto perderá todos sus datos, así que asegúrese de mysqldump primero o ya tiene un volcado .sql ).

El otro mysql@5.6defecto predeterminado que me mordió fue la falta de un puerto, por lo que la red estaba predeterminada en los sockets de Unix, y el cliente mysql seguía informando:

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

Agregué <string>--port=3306</string>a la .plistmatriz, pero también podría especificar port=3306en sumy.cnf

Ejecuta brew services stop mysql@5.6haz tus cambios entoncesbrew services start mysql@5.6


1

Intentar soltar el espacio de tabla puede darle otros errores. Para mí, recibí 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 eliminar la base de datos. Esto eliminará cualquier espacio de tabla relacionado con él y le permitirá crear las tablas nuevamente.


19
Desafortunadamente, es como decir 'Tengo un tornillo, y usar un martillo devuelve este error, así que mi solución fue dejar caer una roca sobre él'. El valor real sería descubrir cómo arreglar esta tabla sin destruir toda la base de datos.
Jason

Doh! Esperaba que esta fuera una solución alternativa a mi pregunta (y la publiqué como respuesta), pero ya estoy a la mitad del proceso de renombrar tablas / descartar la base de datos. Odio a InnoDB ahora.
NobleUplift

¡Pero destruí la base de datos, la recreé y todavía tengo este problema!
TRiG

@TRiG ¿reiniciaste el servidor?
Aris

1
Creo que haré una pregunta por separado, @Aris. En mi caso, está en un escritorio de Ubuntu. He reiniciado no solo MySQL, sino toda la máquina, varias veces. También eliminó la carpeta de la base de datos a mano con un rm -r. Es irritante, pero tampoco espectacular.
TRiG

1

Si tiene otro servidor con una buena versión de la misma tabla, puede hacer una copia (table_copy), transfiera table_copy al servidor problemático. Luego elimine la tabla del problema y cambie el nombre de table_copy a table.


1

Para mí, me ayudó simplemente ir al directorio MYSQL DATA en / var / lib / mysql / {db_name} (linux) y soltar el archivo {table_name} .ibd que era el mismo que el nombre de la carpeta.


0

Solo borro mi antiguo DB ubicado en mi host local directamente de wamp, Detiene todos los servicios, Vaya a wamp / bin / mysql / mysql [versión] / data y encontré el DB con problemas, lo borro y vuelvo a iniciar todos los servicios, cree nuevamente su base de datos y listo, ahora puede importar sus tablas,


0

La forma en que encontré para "resolver" este problema es bastante molesto, pero hay un script que lo maneja.

Esencialmente, necesita que los archivos ibdata1y ib_logfile*desaparezcan (contienen las asignaciones de claves externas, entre otras cosas). La única forma segura de hacerlo es exportar todas sus bases de datos, detener mysql, eliminar los archivos, iniciar mysql y luego importar los archivos.

La secuencia de comandos que ayuda a resolver este problema es https://github.com/uberhacker/shrink-ibdata1 , a pesar de que el propósito declarado de este guión es diferente, se hace resolver el problema.


0

La única forma en que funcionó para mí fue:

  1. Crea una tabla similar
  2. Copie los archivos .frm y .idb de la nueva tabla similar al nombre de la tabla corrupta.
  3. Arreglar permisos
  4. Reiniciar MariaDB
  5. Suelta la mesa corrupta

-1

Si tiene este problema y no tiene otra opción, cambie el motor a otro motor como 'myisam', luego intente crear la tabla.

descargo de responsabilidad: no es la respuesta válida, ya que puede tener restricciones de clave externa que no serán compatibles con otro motor de almacenamiento. Cada motor de almacenamiento tiene su propia especialidad para almacenar y acceder a datos, estos puntos también deben tenerse en cuenta.


-1

DESECHE el espacio de tabla antes de IMPORTAR

Tengo la misma solución de problema a continuación

  1. Primero tienes que soltar el nombre de tu base de datos. si su base de datos no se está borrando, me tiene flujo. Para el sistema Windows, su directorio será C: / xampp / mysql / data / yourdabasefolder remove "yourdabasefolder"

  2. Nuevamente, debe crear una nueva base de datos e importar su antiguo archivo sql. Sera trabajo

Gracias


-1

Tuve que localizar mi directorio de datos MySQL:

MOSTRAR VARIABLES DONDE Variable_Name COMO "% dir"

Luego forzar a eliminar esa base de datos:

sudo rm -rf


-1

Puede ejecutar la siguiente consulta como usuario root de mysql

drop tablespace `tableName`

-1

Hola, los desarrolladores no pierden el tiempo. Simplemente elimine la base de datos que contiene tablas e importe tablas enteras nuevamente. Ahorre tiempo = el tiempo es dinero. Salud.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.