Errore: esiste un tablespace per la tabella xxx. SCOLLARE il tablespace prima di IMPORT


134

Sono abbastanza nuovo su MySQL e ricevo un errore piuttosto interessante sul quale non riesco a trovare alcun aiuto tramite Google e la ricerca StackOverflow.

Sto eseguendo un server locale di MySQL 5.6.10 su MacOS 10.8.3 e gestisco il mio database tramite gli elementi essenziali di Navicat per MySQL.

L'errore che ottengo è che dopo aver eseguito e gestito il mio database bene per un paio di giorni / settimane qualcosa si innesca (sembra incompleto) per eliminare alcune delle tabelle che ho creato usando le query da Navicat.

Quando provo a eseguire query utilizzando queste tabelle, Navicat mi avvisa che la tabella specifica non esiste. Fin qui tutto bene - ecco che arriva la parte buona:

Quando provo a CREARE la tabella, ad esempio denominata "temp", precedentemente presente, viene visualizzato il seguente messaggio di errore:

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

Tuttavia, se provo a eliminare la tabella o provo a eliminare lo spazio tabella per questa tabella, utilizzando

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

Ricevo i seguenti messaggi di errore:

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

Ciò significa che mi viene consigliato di eliminare lo spazio tabella ma quando provo a farlo la tabella non esiste. È possibile che ci sia qualche tipo di residuo di questa tabella in un posto diverso in cui la query DISCARD non sta controllando? E qualcuno ha un'idea di cosa potrebbe scatenare tutto ciò - completamente a caso come sembra?

Come ho detto, sono nuovo sull'argomento e praticamente all'oscuro. Sospetto che il riavvio del mio laptop, ovvero il ripristino del mio server MySQL locale, o forse i diritti di autorizzazione dell'utente possano avere a che fare con esso, ma sto solo ipotizzando qui.


È possibile verificare alcune soluzioni per questo tipo di errore. codespeaker.com/laravel-framework/…
smzapp

Risposte:


123

Un po 'tardi qui, ma in genere ho riscontrato questo problema quando si verifica un errore "tablespace pieno" durante l'esecuzione in modalità "innodb_file_per_table". Senza entrare troppo nei dettagli (più qui ), il tablespace del server di database è definito dall'impostazione innodb_data_file_path e per impostazione predefinita è piuttosto piccolo. Anche se ingrandito, il 'tablespace pieno' può ancora verificarsi con query più grandi e simili (un sacco di 'cose' non-table sono archiviate lì, annulla registri, cache, ecc ...).

Comunque, ho scoperto che se guardi nella directory del sistema operativo in cui sono memorizzati i file per tabella, / var / lib / mysql di default su OSX, / usr / local / var / mysql con homebrew iirc, troverai un orfano tablename.ibd file senza il suo normale file tablename.frm. Se si sposta quel file .ibd in un percorso temporaneo sicuro (solo per sicurezza) che dovrebbe risolvere il 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/

Un avvertimento però, assicurarsi che ciò che sta causando il problema in origine, ad esempio query di lunga durata, tabella bloccata, ecc ... sia stato cancellato. Altrimenti ti ritrovi con un altro file .ibd orfano quando provi una seconda volta.


5
La mia directory di dati MySQL era su OS X Yosemite era archiviata /usr/local/mysql/datainvece di /var/lib/mysql/. Altrimenti ha risolto perfettamente il problema.
Alex Hoppen,

13
nel mio caso non ha funzionato ... ho eliminato il file idb orfano ... e quando sono andato a ricreare la tabella con lo stesso identico nome ho ricevuto un messaggio che diceva che la tabella esiste già (per la quale ho eliminato il .idb file) ... dopo l'azione di cui sopra è stato creato un nuovo file .idb orfano nella directory ... molto strano ... Non so davvero cosa assumere.
Dimitris Papageorgiou,

4
Ho lo stesso problema di Dimitris: ho dovuto creare un dump dal database, eliminare il database e ripristinarlo dal dump.
Gerfried,

1
@Gerfried Questo ha funzionato per me fintanto che mi sono fermato e avviato il processo MySQL dopo aver eliminato il file.
MER

2
@DimitrisPapageorgiou Questo ha funzionato per me fintanto che ho interrotto e avviato il processo MySQL dopo aver eliminato il file.
MER

75

Utenti Xampp e Mamp

Si è verificato lo stesso errore durante l'importazione di un database (dopo averlo svuotato) tramite MySQL. Ho scoperto che mi era tablename.ibdrimasto un file mentre tutti gli altri sono stati eliminati. L'ho eliminato manualmente da mysql/data/database_namee l'errore era sparito.


Questa risposta ha aiutato le persone che non usano XAMPP?
Technotronic,

3
pollice in alto da me! ha funzionato bene. Tuttavia, consentitemi di aggiornare leggermente il percorso della cartella per me (mi sono confuso cercando di trovarlo): / Applicazioni / XAMPP / xamppfiles / var / mysql
Fenix ​​Aoras,

l'utilizzo di questo ha sviluppato un errore 168 dal motore di archiviazione in Linux Mint, non usando Xampp né Mamp (nessuna critica, solo informando)
Steven

1
lavori! ho cancellato un file .ibd rotto e quindi la tabella può essere creata di nuovo. Ubuntu 16, mariadb
waza123,

Lo stesso vale per Docker (se la docker si arresta in modo anomalo o si riavvia l'host, potresti avere una data morta nella cartella di sincronizzazione che crea questo errore)
Sliq

23

Per utenti WAMP [Windows 7 Ultimate x64-bit]:

Sono d'accordo con ciò che ha detto DangerDave e quindi sto mettendo a disposizione una risposta per gli utenti WAMP .

Nota: prima di tutto, devi andare nella cartella .. \ WAMP \ Bin \ MySQL \ MySQL [Your MySQL Version] \ Data .

Ora vedrai le cartelle di tutti i tuoi database

  • Fare doppio clic sulla cartella del database che contiene la tabella incriminata per aprirlo
  • Non dovrebbe esserci un file [Your offending MySQL table name].frm, invece dovrebbe esserci un file[Your offending MySQL table name].ibd
  • Elimina il [Your offending MySQL table name].ibd
  • Quindi, eliminalo anche dal Cestino
  • Quindi esegui la tua query MySQL sul database e il gioco è fatto

22

Se .idbdopo averlo eliminato si ricrea nuovamente, leggere questa risposta.

Funzionava così con me. Ho avuto il .idbfile senza il suo corrispondente .frme ogni volta che elimino il .idbfile, il database lo ricrea nuovamente. e ho trovato la soluzione in una riga nella documentazione di MySQL (parte tablespace non esiste )

1- Creare un file .frm corrispondente in un'altra directory del database e copiarlo nella directory del database in cui si trova la tabella orfana.

2- Emettere DROP TABLE per la tabella originale. Ciò dovrebbe eliminare correttamente la tabella e InnoDB dovrebbe stampare un avviso sul registro errori che mancava il file .ibd.

Ho copiato un altro .frmfile di tabella e lo ho chiamato come la mia tabella mancante, quindi ho eseguito una normale query sulla tabella di rilascio e voilà, ha funzionato e la tabella è stata rilasciata normalmente!

il mio sistema è XAMPP su Windows MariaDB v 10.1.8


3
Nel caso in cui ciò non fosse ovvio per nessun altro: dopo aver creato il file .frm e aver eliminato la tabella, il file .idb deve essere eliminato.
Narretz,

6
Posso confermare, i passaggi dovrebbero essere: 1. elimina mysql / path / table_name.idb 2. aggiungi table_name.frm 3. DROP table_name
Jeremy Dennen

Questo ha funzionato per me. Grazie. Ho riscontrato questo errore durante l'eliminazione di un FK e subito dopo l'arresto di mysql. Penso che questi dati della mia tabella siano danneggiati.
Rodolfo Velasco,

ricordati di riavviare mysql dopo aver inserito il file, quindi prova a rilasciarlo
Seyed Ali Roshan

In mysql> data> mysql, c'è un file .frm di cui ho bisogno. Posso copiarlo?
Timo,

8

Nel mio caso l'unica soluzione di lavoro era:

  1. CREATE TABLE bad_tableENGINE = MyISAM ...
  2. rm bad_table.ibd
  3. TABELLA DI GOCCIA bad_table

Ha funzionato per me! [ERRORE] InnoDB: il file './dbname/tablename.ibd' esiste già sebbene la tabella corrispondente non esistesse nel dizionario dei dati InnoDB. Hai spostato i file .ibd di InnoDB senza usare i comandi SQL DISCARD TABLESPACE e IMPORT TABLESPACE o mysqld si è arrestato in modo anomalo nel mezzo di CREATE TABLE? È possibile risolvere il problema rimuovendo il file './dbname/tablename.ibd' nel 'datadir' di MySQL.
PAdrian,

1
Impossibile creare la tabella in quanto esiste tablespace.
Liam Mitchell,

non funziona per me. il file ibd continua ad apparire dopo che voglio ricreare la tabella con lo stesso motore.
Fajar Rukmo,

8

Questo è esattamente quello che ho fatto in mariadb 10.2.16 su fedora quando avevo una tabella che mostrava esattamente gli stessi errori nel file di registro suppongo ...

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

il tuo chilometraggio ed errori possono variare ma quello principale presumo sia

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

con drop table non funzionante così come 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

anche la creazione della tabella fallisce in questo modo:

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

per risolvere questo, quello che ho fatto è stato il primo

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

quindi nella directory / var / lib / mysql / database_name ho fatto quanto segue come root riconoscendo la sovrascrittura di innodb_table.ibd causandoci problemi

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

poi di nuovo nella console mysql ho emesso un comando drop riuscito su entrambe le tabelle

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)

e ora tutto è quadrato e posso ricreare un solo tavolo ...

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

EDIT: stavo per aggiungere a

restorecon -Rv /var/lib/mysql/database_name 

comando dopo la copia del database per ottenere tutti i contesti selinux come dovrebbero essere, anche se li stiamo cancellando dal database quasi immediatamente, ma in alternativa potresti semplicemente aggiungere l'opzione --archive o -a ai due cp comandi, quindi sì, in realtà l'opzione di archivio riduce questo:

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

a quanto segue che ritengo migliore e mantiene il contesto selinux impostato per la tabella già creata.

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

Ho sostituito l'elenco di comandi più lungo sopra per l'elenco più breve che potrebbe essere abbreviato ancora con un *


Questo ha funzionato bene per me su CentOS MariaDB 10.2.31. Stavo cercando una soluzione che non richiedesse il riavvio del servizio MySQL e questo è tutto. La chiave sta creando l'insieme di file puliti innodb_table2 (innodb_table2.frm e innodb_table2.ibd) e posizionandoli entrambi sui file innodb_table.
Justin il

6

Nel mio caso:

Rimuovere prima tableName.ibdnella directory del database da Mysql e seconda esecuzione:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

Grazie, nel mio caso, ho 1) arrestato il server di database (servizio mysql stop) 2) rimosso file idb 3) avviato database server (servizio mysql start) Non ho eseguito query di modifica e rilascio
lemk0

La directory del database in Windows è in C: \ ProgramData \ MySQL per impostazione predefinita
Rodin10

4

Ho avuto lo stesso errore eseguendolo su wampserver durante il tentativo di creare una tabella utenti. Ho trovato un file users.ibd e dopo aver eliminato questo file, ho eseguito nuovamente il comando migrate e ha funzionato. Il file sul mio computer Windows si trovava in wamp / bin / mysql / mysql5.6.12 / data / myproject.


4

Soluzione

Tuttavia, l'opzione più semplice è questa: riavvia MySQL, quindi esegui le stesse quattro fasi come segue:

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

In questo modo, l'id del tablespace nel dizionario dei dati e il file corrispondono; quindi l'importazione del tablespace è riuscita.

Questo può darti maggiore sicurezza nel gestire alcuni dei "gotcha" di InnoDB durante il processo di recupero o persino il trasferimento di file.

arbitro


7
Questa non è una risposta autonoma.
Nathaniel Ford,

3

Ecco i passaggi della soluzione:

  1. eseguire il backup del database (struttura con opzione di rilascio e dati)
  2. interrompere il servizio motore mysql
  3. rimuovere manualmente la directory del database dall'interno di mysql / data
  4. avviare il motore mysql
  5. crea un nuovo database con qualsiasi nome diverso dal tuo database corrotto
  6. crea una singola tabella con il nome della tabella danneggiata all'interno del nuovo database (questo è il segreto). ed è meglio creare la tabella con esattamente la stessa struttura.
  7. rinominare il database nel vecchio database danneggiato
  8. ripristina il backup e la tabella funzionerà correttamente.

2

Ho avuto questo problema più volte. Se si dispone di un DB di grandi dimensioni e si desidera provare a evitare il backup / ripristino (con l'aggiunta di una tabella mancante), provare alcune volte avanti e indietro:

DROP TABLE my_table;

ALTER TABLE my_table DISCARD TABLESPACE;

-e-

rm my_table.ibd (orfano senza corrispondente my_table.frm) situato nella directory / var / lib / mysql / my_db /

-e poi-

CREA TABELLA SE NON ESISTE my_table(...)


2

Eliminare / spostare tablename.ibd sicuramente non ha funzionato per me.

Come l'ho risolto

Dato che stavo per eliminare la tabella danneggiata e inesistente, ho preso un backup delle altre tabelle andando su phpmyadmin-> database-> esportazione-> tabelle selezionate per il backup-> esportazione (come .sql).

Dopo di che ho selezionato l'icona del database accanto al nome del database e quindi l'ho rilasciata. Creato un nuovo database. Seleziona il tuo nuovo database-> import-> Seleziona il file scaricato in precedenza-> fai clic su import. Ora ho i miei vecchi tavoli di lavoro e ho eliminato il tavolo danneggiato. Ora creo solo la tabella che stava generando l'errore.

Probabilmente avevo un backup precedente della tabella danneggiata.


2

Questo errore si verifica quando si sospendono alcune funzioni. Come eseguire la query di seguito con chiave esterna errata.

set foreign_key_checks=0

2

Aveva esattamente lo stesso problema; Vorrei aggiungere mysql@5.6(dopo aver avuto 5,5).

Le impostazioni predefinite della birra per 5.6 sono innodb_file_per_table=1mentre in 5.5 sono innodb_file_per_table=0.

Il tuo ibdata1file esistente (i dati innodb combinati) avrà ancora riferimenti alle tabelle che stai cercando di creare / eliminare. O il cambiamento innodb_file_per_tabledi nuovo a 0, o eliminare il file di dati ibdata1 ( questo perderà voi tutti i vostri dati, quindi assicuratevi di mysqldump che prima o hanno già una discarica sql ).

L'altra mysql@5.6impostazione predefinita della birra che mi ha colpito è stata la mancanza di una porta, quindi la rete era predefinita per unix socket e il client mysql ha continuato a riportare:

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

Ho aggiunto <string>--port=3306</string>l' .plistarray, ma potresti anche specificare port=3306nel tuomy.cnf

Esegui brew services stop mysql@5.6le modifiche quindibrew services start mysql@5.6


1

Cercare di eliminare il tablespace può dare altri errori. Per me, ho ricevuto il seguente errore:

DROP TABLESPACE `tablename`

Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP' 

La mia soluzione era eliminare il database. Ciò rimuoverà tutti i tablespace ad esso correlati e consentirà di creare nuovamente le tabelle.


19
Sfortunatamente è come dire "Ho una vite e l'uso di un martello restituisce questo errore, quindi la mia soluzione è stata quella di far cadere un masso su di esso". Il vero valore sarebbe capire come risolvere questa tabella senza modificare l'intero database.
Jason il

Doh! Speravo che questa potesse essere una soluzione alternativa alla mia domanda (e l'ho pubblicata come risposta), ma sono già a metà del processo di ridenominazione delle tabelle / eliminazione del database. Adesso odio InnoDB.
NobleUplift,

Ma ho rovinato il database, ricreato e ho ancora questo problema!
TRiG

@TRiG hai riavviato il server?
Aris,

1
Penso che farò una domanda separata, @Aris. Nel mio caso, è su un desktop Ubuntu. Ho riavviato non solo MySQL, ma l'intera macchina, più volte. Anche cancellato la cartella del database a mano con un rm -r. È irritante, ma nemmeno mostra di fermarsi.
TRiG

1

Se si dispone di un altro server con una buona versione della stessa tabella, è possibile effettuare una copia (table_copy), trasferire table_copy sul server problematico. Quindi eliminare la tabella dei problemi e rinominare table_copy in tabella.


1

Per me è stato d'aiuto andare nella directory DATA MYSQL in / var / lib / mysql / {nome_db} (linux) e rilasciare il file {nome_tabella} .ibd che era lo stesso del nome della cartella.


0

Elimina solo il mio vecchio DB situato nel mio localhost direttamente da Wamp, Ferma tutti i servizi, Vai a wamp / bin / mysql / mysql [versione] / dati e ho trovato il DB con problemi, lo cancello e ricomincio a cancellare tutti i servizi, crea nuovamente il tuo database e il gioco è fatto, ora puoi importare le tue tabelle,


0

Il modo in cui ho scoperto di "risolvere" questo problema è abbastanza fastidioso, ma esiste uno script che lo gestisce.

In sostanza, è necessario che i file ibdata1e ib_logfile*scompaiano (contengono tra l'altro le mappature delle chiavi esterne). L'unico modo sicuro per farlo è esportare tutti i database, interrompere mysql, rimuovere i file, avviare mysql e quindi importare i file.

Lo script che aiuta a risolvere questo problema è https://github.com/uberhacker/shrink-ibdata1 , anche se lo scopo dichiarato di questo script è diverso, non risolvere il problema.


0

L'unico modo in cui ha funzionato per me è stato:

  1. Crea una tabella simile
  2. Copia i file .frm e .idb della nuova tabella simile nel nome della tabella danneggiata.
  3. Risolvi i permessi
  4. Riavvia MariaDB
  5. Elimina la tabella corrotta

-1

se hai questo problema e non hai un'altra opzione cambia il motore in qualsiasi altro motore come 'myisam', quindi prova a creare la tabella.

dichiarazione di non responsabilità: non è la risposta valida in quanto potresti avere vincoli di chiave esterna che non saranno supportati da un altro motore di archiviazione. Ogni motore di archiviazione ha le proprie specialità per l'archiviazione e l'accesso ai dati, anche questi punti da tenere in considerazione.


-1

SCOLLARE il tablespace prima di IMPORT

Ho lo stesso problema, la soluzione è sotto

  1. Per prima cosa devi eliminare il nome del tuo database. se il tuo database non sta cancellando mi hai flusso. Per il sistema Windows la tua directory sarà C: / xampp / mysql / data / yourdabasefolder rimuovi "yourdabasefolder"

  2. Ancora una volta devi creare un nuovo database e importare il tuo vecchio file sql. Sarà lavoro

Grazie


-1

Ho dovuto localizzare la mia directory di dati MySQL:

MOSTRA VARIABILI DOVE Variable_Name COME "% dir"

Quindi forzare rimuovere quel database:

sudo rm -rf


-1

È possibile eseguire la query seguente come utente root mysql

drop tablespace `tableName`

-1

Ehi, gli sviluppatori non perdono tempo. Basta eliminare il database contenente le tabelle e importare nuovamente intere tabelle. Risparmia tempo = il tempo è denaro. Saluti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.