156 votes

Erreur : Le tablespace pour la table xxx existe. Veuillez supprimer le tablespace avant d'importer.

Je suis assez novice en matière de MySQL et je rencontre une erreur assez intéressante pour laquelle je ne trouve aucune aide via Google et la recherche stackoverflow.

J'utilise un serveur local de MySQL 5.6.10 sur MacOS 10.8.3 et je gère ma base de données via Navicat essentials for MySQL.

L'erreur que je rencontre est qu'après avoir exécuté et géré ma base de données sans problème pendant quelques jours/semaines, quelque chose se déclenche pour supprimer (de manière incomplète, semble-t-il) certaines des tables que j'ai créées à l'aide de requêtes dans Navicat.

Lorsque j'essaie d'exécuter des requêtes à l'aide de ces tables, Navicat m'avertit que la table en question n'existe pas. Jusqu'ici tout va bien - voici la partie la plus intéressante :

Lorsque j'essaie de CRÉER la table, par exemple nommée "temp", qui existait auparavant, j'obtiens le message d'erreur suivant :

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

Cependant, si j'essaie de supprimer la table, ou si j'essaie de supprimer le tablespace pour cette table, en utilisant la fonction

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

Je reçois les messages d'erreur suivants :

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

Cela signifie donc qu'il m'est conseillé de supprimer l'espace de table, mais lorsque j'essaie de le faire, la table n'existe pas. Est-il possible qu'il y ait une sorte de vestige de cette table à un autre endroit où la requête DISCARD n'est pas vérifiée ? Et quelqu'un a-t-il une idée de ce qui pourrait déclencher tout cela - de manière totalement aléatoire, semble-t-il ?

Comme je l'ai dit, je suis novice en la matière et je ne sais pas grand-chose. Je pense que le redémarrage de mon ordinateur portable, c'est-à-dire la réinitialisation de mon serveur MySQL local, ou peut-être les droits d'accès de l'utilisateur pourraient avoir un rapport avec ce problème, mais je ne fais que formuler des hypothèses.

8voto

Chris Points 121

C'est exactement ce que j'ai fait dans mariadb 10.2.16 sur fedora quand j'avais une table qui montrait exactement les mêmes erreurs dans le fichier journal, je suppose...

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

votre kilométrage et vos erreurs peuvent varier, mais la principale, je suppose, est que

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

avec drop table ne fonctionne pas aussi bien que 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

create table échoue également comme suit :

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

Pour résoudre ce problème, j'ai d'abord

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

puis dans le répertoire /var/lib/mysql/database_name j'ai fait ce qui suit comme Root reconnaissant l'écrasement de innodb_table.ibd qui nous pose problème

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

Puis, dans la console mysql, j'ai lancé avec succès une commande de suppression sur les deux tables.

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)

et tout est maintenant en ordre et je peux recréer la seule table...

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

EDIT : J'allais ajouter un

restorecon -Rv /var/lib/mysql/database_name 

après la copie de la base de données pour remettre tous les contextes selinux comme ils devraient l'être, même si nous les supprimons de la base de données presque immédiatement, mais dans l'alternative vous pourriez juste ajouter l'option --archive ou -a aux deux commandes cp. l'option archive raccourcit le processus :

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

à juste ce qui suit qui je pense est mieux et qui garde le selinux qui est défini pour la table déjà créée.

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

J'ai remplacé la longue liste de commandes ci-dessus par la liste plus courte suivante qui pourrait être encore raccourcie avec un *.

4voto

user3284463 Points 3801

Supprimer/déplacer tablename.ibd n'a pas fonctionné pour moi.

Comment je l'ai résolu

Comme j'allais supprimer la table corrompue et inexistante, j'ai fait une sauvegarde des autres tables en allant dans phpmyadmin->base de données->exportation->sélectionner les tables à sauvegarder->exportation (en .sql).

Après cela, j'ai sélectionné l'icône de la base de données à côté du nom de la base de données, puis je l'ai déposée. Créez une nouvelle base de données. Sélectionnez votre nouvelle base de données->importation->Sélectionnez le fichier que vous avez téléchargé plus tôt->cliquez sur importer. Maintenant j'ai mes anciennes tables de travail et j'ai supprimé la table corrompue. Maintenant, je crée simplement la table qui provoquait l'erreur.

Il est probable que j'avais une sauvegarde antérieure de la table corrompue.

3voto

Bhavin Rana Points 1448

Solution

Cependant, l'option la plus simple est la suivante : redémarrez MySQL, puis effectuez les quatre mêmes étapes comme suit :

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 cette façon, l'identifiant du tablespace dans le dictionnaire de données et dans le fichier correspondait ; l'importation du tablespace a donc réussi.

Cela peut vous donner une plus grande confiance dans le traitement de certains des "gotcha's" d'InnoDB pendant le processus de récupération ou même les transferts de fichiers.

réf.

3voto

morgan Points 23

J'ai eu la même erreur en l'exécutant sur wampserver en essayant de créer une table d'utilisateurs. J'ai trouvé un fichier users.ibd et après avoir supprimé ce fichier, j'ai relancé la commande migrate et cela a fonctionné. Le fichier sur ma machine Windows était situé dans wamp/bin/mysql/mysql5.6.12/data/myproject.

2voto

Nerko Points 37

J'ai eu ce problème plusieurs fois. Si vous avez une grande base de données et que vous voulez essayer d'éviter la sauvegarde/restauration (en ajoutant une table manquante), essayez plusieurs fois d'aller et venir :

DROP TABLE ma_table ;

ALTER TABLE my_table DISCARD TABLESPACE ;

-et-

rm my_table.ibd (orphelin sans le my_table.frm correspondant) situé dans le répertoire /var/lib/mysql/my_db/.

-et ensuite

CRÉER UNE TABLE SI ELLE N'EXISTE PAS my_table (...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X