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.

149voto

DangerDave Points 171

C'est un peu tard, mais généralement, j'ai vu ce problème se produire lorsque vous obtenez une erreur 'tablespace full' lors de l'exécution en mode 'innodb_file_per_table'. Sans entrer dans les détails (plus ici ), le tablespace du serveur de base de données est défini par le paramètre innodb_data_file_path et par défaut est plutôt petit. Même s'il est plus grand, le "tablespace plein" peut toujours se produire avec des requêtes plus importantes et autres (beaucoup de "choses" non-tables sont stockées là-dedans, les journaux d'annulation, les caches, etc...).

Quoi qu'il en soit, j'ai découvert que si vous regardez dans le répertoire du système d'exploitation où les fichiers par table sont stockés, /var/lib/mysql par défaut sur OSX, /usr/local/var/mysql avec homebrew, vous trouverez un fichier tablename.ibd orphelin sans son compagnon normal tablename.frm. Si vous déplacez ce fichier .ibd vers un emplacement temporaire sûr (juste pour être sûr), cela devrait résoudre le problème.

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.idb
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb

$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/

Une mise en garde cependant, assurez-vous que la cause du problème à l'origine, par exemple une requête longue, une table verrouillée, etc... a été effacée. Sinon, vous vous retrouvez avec un autre fichier .ibd orphelin lorsque vous essayez une deuxième fois.

89voto

Technotronic Points 148

Utilisateurs de Xampp et Mamp

J'ai eu la même erreur en important une base de données (après l'avoir vidée) via MySQL. J'ai découvert que j'avais un tablename.ibd est resté tandis que tous les autres ont été supprimés. Je l'ai supprimé manuellement de mysql/data/database_name et l'erreur a disparu.

32voto

Accountant م Points 1603

Si vous obtenez le .idb recréé après l'avoir supprimé, alors lisez cette réponse.

C'est comme ça que ça a marché pour moi. J'avais le .idb sans le fichier correspondant .frm et chaque fois que je supprime le .idb la base de données le recrée à nouveau. et j'ai trouvé la solution en une ligne dans MySQL documentation ( Le Tablespace n'existe pas partie)

1- Créez un fichier .frm correspondant dans un autre répertoire de la base de données et copiez-le dans le répertoire de la base de données où se trouve la table orpheline.

2- Émettre DROP TABLE pour la table originale. Cela devrait permettre de supprimer la table et InnoDB devrait afficher un avertissement dans le journal des erreurs indiquant que le fichier .ibd était manquant.

J'ai copié une autre table .frm et le nommer comme ma table manquante, puis faire une requête normale de suppression de table et voilà, ça a marché et la table est supprimée normalement !

mon système est XAMPP sur Windows MariaDB v 10.1.8

24voto

Harshul Vijay Points 352

Pour les utilisateurs de WAMP [Windows 7 Ultimate x64-bit] :

Je suis d'accord avec ce que DangerDave a dit et je mets donc à disposition une réponse pour Utilisateurs de WAMP .

Note : Tout d'abord, vous devez aller à votre .. \WAMP\Bin\MySQL\MySQL [Votre version de MySQL] \Data dossier.

Maintenant, vous verrez les dossiers de toutes vos bases de données.

  • Double-cliquez sur le dossier de la base de données qui contient la table incriminée pour l'ouvrir.
  • Il ne devrait pas y avoir de fichier [Your offending MySQL table name].frm à la place, il devrait y avoir un fichier [Your offending MySQL table name].ibd
  • Supprimer le [Your offending MySQL table name].ibd
  • Ensuite, supprimez-le également de la corbeille.
  • Ensuite, exécutez votre requête MySQL sur la base de données et vous avez terminé.

10voto

webyseo Points 113

Dans mon cas :

Retirer d'abord tableName.ibd dans le répertoire de votre base de données de Mysql et la deuxième exécution :

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

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