MySQL> Table n'existe pas. Mais c'est le cas (ou cela devrait)

261

J'ai changé le datadir d'une installation MySQL et toutes les bases se sont déplacées correctement sauf une. Je peux me connecter et USEla base de données. SHOW TABLESme renvoie également toutes les tables correctement, et les fichiers de chaque table existent sur le répertoire de données MySQL.

Cependant, lorsque j'essaie de SELECTtrouver quelque chose dans la table, j'obtiens un message d'erreur indiquant que la table n'existe pas. Pourtant, cela n'a pas de sens puisque j'ai pu montrer le même tableau à travers la SHOW TABLESdéclaration.

Je suppose que cela SHOW TABLESrépertorie l'existence du fichier mais ne vérifie pas si un fichier est corrompu ou non. Par conséquent, je peux lister ces fichiers mais ne pas y accéder.

Néanmoins, ce n'est qu'une supposition. Je n'avais jamais vu ça avant. Maintenant, je ne peux pas redémarrer la base de données pour les tests, mais toutes les autres applications qui l'utilisent fonctionnent correctement. Mais c'est juste une supposition, je n'ai jamais vu ça auparavant.

Est-ce que quelqu'un sait pourquoi cela se produit?

Exemple:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist
John Smith
la source
avez-vous restauré la base de données à partir d'une sauvegarde? ou vous venez de copier les fichiers db? avez-vous un accès root au serveur mysql?
alinoz
viens de copier les fichiers! oui j'ai un accès root à tout
johnsmith
pouvez-vous essayer: mysql_fix_privilege_tables
alinoz
4
sont ces tables innodb?
Paul Dixon
1
Oui, toutes les tables sont InnoDB. C'est dommage de ne pas l'avoir dit!
johnsmith

Réponses:

263

Juste au cas où quelqu'un se soucierait encore:

J'ai eu le même problème après avoir copié un répertoire de base de données directement à l'aide de la commande

cp -r /path/to/my/database /var/lib/mysql/new_database

Si vous faites cela avec une base de données qui utilise des InnoDBtables, vous obtiendrez cette folle erreur «la table n'existe pas» mentionnée ci-dessus.

Le problème est que vous avez besoin des ib*fichiers à la racine du datadir MySQL (par exemple ibdata1, ib_logfile0et ib_logfile1).

Quand j'ai copié ceux-ci, cela a fonctionné pour moi.

Mike Dacre
la source
27
Sauvé ma vie! Pour toute autre personne, assurez-vous simplement de ne pas écraser les fichiers ib * existants si vous essayez de copier vers une nouvelle installation. Sauvegardez votre répertoire mysql / existant, remplacez-le par l'ancien que vous souhaitez récupérer, mysqldump tout, puis restaurez le nouveau mysql /. Ensuite, vous pouvez importer correctement les mysqldumps.
Matthew
1
Sur Mac pour répliquer ma base de données localement, en plus de copier le fichier ibdata (situé à côté du répertoire de la base de données), je devais accéder au répertoire du nom de chown _mysql:wheella base de données, ibdata et tous les fichiers du répertoire (utiliser chown -R ...). De même, les autorisations étaient incorrectes dans le répertoire et chmod -R 660 databasenameétaient donc nécessaires pour que les tables s'affichent dans la base de données.
Dylan Valade
4
Merci Mike. Juste pour clarifier, vous devrez redémarrer le service mysql pour que cela fonctionne. Au moins, je l'ai fait, et Dieu merci, cela a fonctionné. Beaucoup de données y sont enregistrées!
Nick Martin
15
NOTE: N'oubliez pas d'utiliser chown!!! Donc, tous après avoir cputilisé cette commande ->chown mysql:mysql /var/lib/mysql/ -R
K-Gun
1
REMARQUE 2: N'oubliez pas d'appliquer la permission appropriée. Dans mon cas sudo chmod -R 600 /var/lib/mysql
augusto
45

Pour moi sur Mac OS (installation MySQL DMG), un simple redémarrage du serveur MySQL a résolu le problème. Je suppose que l'hibernation l'a causé.

Martin
la source
Merci également d'avoir corrigé le même problème pour moi. La mienne s'est produite après l'arrêt de ma machine en raison d'une coupure de courant soudaine. Après le premier redémarrage de la machine / démarrage de MySQL, j'ai eu l'erreur. Ensuite, j'ai lu cette réponse. J'ai arrêté / démarré MySQL via les Préférences Système et il a été corrigé.
Jeff Evans
2
sudo /usr/local/mysql/support-files/mysql.server restart
laffuste
Également. J'ai rencontré cela après la mise à niveau vers macOS Sierra 10.12.6. Pas certain qu'il y ait un lien de causalité, mais le moment semble suspect.
Dave Mulligan
Merci, a travaillé dans une certaine mesure; j'ai redémarré le service mysql (5.6, windows), puis check table TABLE_ONE;j'ai exécuté quelques erreurs "partition p2 a renvoyé une erreur", "idx_blah_1 est marqué comme corrompu" et "idx_blah_2 est marqué comme corrompu". Maintenant je recommence à courir optimize table TABLE_ONE;et j'obtiens l'erreur "Table 'database.TABLE_ONE' n'existe pas"
Omar
Exécution de MySLQ sur Mojave. Le redémarrage via le panneau des préférences système n'a pas fonctionné. J'ai dû redémarrer via la ligne de commande.
Cortex
30

J'obtiens ce problème lorsque le cas du nom de table que j'utilise est désactivé. Donc la table s'appelle 'db' mais j'ai utilisé 'DB' dans l'instruction select. Assurez-vous que le boîtier est le même.

dkinzer
la source
13
+1 Les noms de champ ne sont pas sensibles à la casse, mais les noms de table le sont. Erreur courante et très ennuyeuse.
GolezTrol
27

Cette erreur peut également se produire lors de la définition lower_case_table_namesde 1, puis lors de l'accès aux tables créées avec la valeur par défaut de cette variable. Dans ce cas, vous pouvez revenir à la valeur précédente et vous pourrez lire le tableau.

Golimar
la source
4
Cela m'a mordu. J'ai rétabli la valeur, redémarré la base de données, exporté les tables, remis la valeur à 1, redémarré la base de données, réimporté les tables et tout a fonctionné à nouveau.
wmarbut
17
  1. arrêtez mysqld
  2. sauvegarde du dossier mysql: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. copier le dossier de la base de données de l'ancienne machine vers /var/lib/mysql
  4. remplacer ib * (ib_logfile *, ibdata) de l'ancienne base de données
  5. démarrer mysqld
  6. vidage de la base de données
  7. mysqldump >dbase.mysql
  8. arrêter le service mysql
  9. retirer /var/lib/mysql
  10. renommer /var/lib/mysql-backupen/var/lib/mysql
  11. démarrer mysqld
  12. créer la base de données
  13. mysqldump < dbase.mysql
user1772382
la source
Dans mon cas, je devais aussi faire: 10.5 supprimer le répertoire <db_name> sous / var / lib / mysql /
Tony the Tech
ça ne fonctionne pas. :( la table 'tablename.wp_posts' n'existe pas
Jahirul Islam Mamun
14

Veuillez exécuter la requête:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

Malheureusement, MySQL autorise l'utilisation de caractères unicode et non imprimables dans le nom de la table. Si vous avez créé vos tableaux en copiant créer du code à partir d'un document / site Web, il y a une chance qu'il ait un espace de largeur nulle quelque part.

dev-null-dweller
la source
poste très utile, merci! mais toutes les tables sont en ASCII avec une longueur de nom correcte
johnsmith
12

Je viens de passer trois jours sur ce cauchemar. Idéalement, vous devriez avoir une sauvegarde que vous pouvez restaurer, puis déposez simplement la table endommagée. Ces sortes d'erreurs peuvent causer votre ibdata1 grandir énorme (100Go + taille pour les tables modestes)

Si vous n'avez pas de sauvegarde récente, comme si vous vous appuyiez sur mySqlDump, vos sauvegardes se sont probablement interrompues silencieusement à un moment donné dans le passé. Vous devrez exporter les bases de données, ce que vous ne pouvez bien sûr pas faire, car vous obtiendrez des erreurs de verrouillage lors de l'exécution de mySqlDump.

Donc, comme solution de contournement, accédez à /var/log/mysql/database_name/et supprimez le nom_table. *

Ensuite, essayez immédiatement de vider la table; cela devrait maintenant fonctionner. Maintenant, restaurez la base de données dans une nouvelle base de données et reconstruisez la ou les tables manquantes. Vider ensuite la base de données cassée.

Dans notre cas, nous recevions également constamment des mysql has gone awaymessages à intervalles aléatoires sur toutes les bases de données; une fois la base de données endommagée supprimée, tout est revenu à la normale.

Andy
la source
Merci Andy, j'ai eu une idée du problème auquel je fais face. J'ai déplacé l'ibdata1 de somehwere dans le lecteur C vers le lecteur D afin d'économiser de l'espace sur le lecteur C. Heureusement, j'ai eu l'ibdata1 (ainsi que les fichiers ib_logfile1 et ib_logfile0) dans mon lecteur D après avoir lu vos commentaires. Maintenant, je vais regarder d'où j'ai déplacé ces fichiers et les restaurer là-bas. J'espère que mes tableaux reviendront.
AKS
Comment "essayez-vous immédiatement de vider la table"? J'ai le même problème, pas de sauvegardes, donc je cherche au moins le moyen d'obtenir la structure de la table, mais si vous supprimez les fichiers du répertoire, tout est simplement parti?
mmvsbg
Ça y est! Merci,
jstuardo
11

Je ne connais pas la raison mais dans mon cas, j'ai résolu de désactiver et d'activer la vérification des clés étrangères

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
Bruno Caponi
la source
4
Merci frere! Dans mon cas, j'ai dû désactiver foreign_key_checks et exécuter une requête de sélection sur la table disparue, puis la table est redevenue normale. Je pense qu'il y a des violations de clé étrangère dans les lignes de données parce que j'avais un programme interrompu avant que ce problème ne se produise.
Egist Li
Je n'ai pas encore pu savoir pourquoi exactement, mais cela a également résolu mon problème
Miroslav Glamuzina
11

J'ai eu le même problème et j'ai cherché pendant 2-3 jours, mais la solution pour moi était vraiment stupide.

Redémarrez le mysql

$ sudo service mysql restart

Maintenant, les tables deviennent accessibles.

Siraj Alam
la source
1
Totalement travaillé pour moi, bien que ma commande soit légèrement différente: $ sudo /usr/local/mysql/support-files/mysql.server restart
KirstieBallance
Cela devrait être en haut de la liste des choses à essayer, je suppose. Vaut le coup et dans mon cas, cela a fonctionné.
Coroos
7

D'accord, cela va sembler assez absurde, mais faites-moi plaisir.
Pour moi, le problème a été résolu lorsque j'ai changé ma déclaration en ceci:

SELECT * FROM `table`

J'ai fait deux changements
1.) J'ai fait le nom du tableau en minuscules - je sais !!
2.) Utilisé le symbole de citation spécifique = ` : c'est la clé au-dessus de votre TAB

La solution semble absurde, mais elle a fonctionné et c'est samedi soir et je travaille depuis 9 heures du matin - Alors je vais la prendre :)

Bonne chance.

PlanetUnknown
la source
1
Just FYI - La table est MyISAM et non INNO
PlanetUnknown
1
Aussi le `est appelé un backtick
Gary
7

J'ai eu ce problème après la mise à niveau de WAMP mais sans sauvegarde de base de données.

Cela a fonctionné pour moi:

  1. Arrêtez le nouveau WAMP

  2. Copiez les répertoires de base de données dont vous avez besoin et le fichier ibdata1 de l'ancienne installation WAMP

  3. Supprimer ib_logfile0etib_logfile1

  4. Démarrer WAMP

Vous devriez maintenant pouvoir effectuer des sauvegardes de vos bases de données. Cependant, après le redémarrage de votre serveur, vous aurez toujours des problèmes. Alors, réinstallez WAMP et importez vos bases de données.

ykay dit Réintégrer Monica
la source
Je souhaite que les gens indiquent où résident les fichiers auxquels ils se réfèrent ...
MagentoAaron
Vous êtes arrivé de l'image docker mysql n'ayant pas de tables lisibles. Peut confirmer que l'arrêt de l'image, la suppression de ces fichiers et le redémarrage ont à nouveau donné accès.
Anthony Harley
7

Essayez d'exécuter la requête SQL pour éliminer l'espace disque logique avant de copier le fichier idb:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Copier le fichier idb

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Redémarrez MySql

l0pan
la source
Vous m'avez sauvé :)
l00k
@ I0pan J'ai essayé les mêmes étapes que celles mentionnées. Mais après ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; il montre que la table n'existe pas. Mais ça le fait :(
Syed Asad Abbas Zaidi
5

Après avoir dû réinstaller MySQL, j'ai eu ce même problème, il semble que lors de l'installation, certains fichiers de configuration qui stockent des données sur les fichiers journaux InnoDB, ces fichiers ib_logfile * (ce sont des fichiers journaux à droite?), Sont écrasés. Pour résoudre ce problème, je viens de supprimer les fichiers ib_logfile *.

JCM
la source
5

Ce qui a fonctionné pour moi, c'était simplement de laisser tomber la table, même si elle n'existait pas. Ensuite, j'ai recréé la table et repeuplé à partir d'un vidage SQL effectué précédemment.

Il doit y avoir une métabase de noms de table, et elle existait probablement encore là-bas jusqu'à ce que je la laisse tomber.

Zoobra McFly
la source
J'avais créé une procédure, réalisé que cela devait être une vue. J'ai donc renommé la procédure avec quelques zzz à la fin afin de pouvoir l'avoir comme référence et créé une vue du même nom. Impossible d'obtenir un SELECT pour le voir, a obtenu cette erreur. <br> Copié le code dans un fichier texte, supprimé à la fois la vue et la procédure. Recréé la vue et tout allait bien. <br> Alors oui - sept ans plus tard - il y a toujours une sorte d'action de nom fantôme / caché en cours dans certains cas marginaux.
Roger Krueger
5

Eu un problème similaire avec une table fantôme. Heureusement, il y avait un vidage SQL avant l'échec.

Dans mon cas, j'ai dû:

  1. Arrêtez mySQL
  2. Déplacer des fichiers ib * /var/mysqlhors d'une sauvegarde
  3. Supprimer /var/mysql/{dbname}
  4. Redémarrez mySQL
  5. Recréer une base de données vide
  6. Restaurer le fichier de vidage

REMARQUE: nécessite un fichier de vidage.

Oli Stockman
la source
Je suppose que vous voulez dire /var/lib/mysqlau lieu de/var/mysql
knocte
La suppression des répertoires de la base de données et la restauration à partir de la sauvegarde ont été la seule chose qui m'a aidé.
Jano
3
  1. Faites mysqldump dans la base de données:

    mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
  2. Restaurer la base de données

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql

Maintenant, toutes les tables de la base de données ont été complètement restaurées. Essayer..

SELECT * FROM dbname.tablename;
Zaw Htoon
la source
2

J'ai installé MariaDB sur un nouvel ordinateur, arrêté le service de données Mysql renommé dossier de données en données - j'ai résolu mon problème en copiant seulement Mysql \ data \ table_folders et ibdata1 du dossier de données HD MySql écrasé vers le nouveau dossier de données mysql installé.

J'ai ignoré ib_logfile0 et ib_logfile1 (sinon le serveur n'a pas démarré le service)

Démarrage du service mysql.

Le serveur est alors en cours d'exécution.

Tony
la source
2

Il semble que le problème soit lié (au moins au mien et à quelques autres) à des fichiers journaux innodb invalides (corrompus?). D'une manière générale, il suffit de les recréer.

Voici des solutions, dont la plupart nécessitent un redémarrage de mysql.

  • Recréez vos fichiers journaux ( supprimez et redémarrez mysql )
  • Redimensionnez vos fichiers journaux (MySql 5.6+ régénérera le fichier pour vous)
  • Si vous effectuez un certain type de migration de données, assurez-vous que vous avez correctement migré le bon fichier et lui avez accordé des autorisations comme d'autres l'ont déjà indiqué
  • Vérifiez les autorisations de vos données et fichiers journaux, que mysql est propriétaire des deux
  • Si tout le reste échoue, vous devrez probablement recréer la base de données
SeanDowney
la source
2

Voici un autre scénario (mise à niveau de version) :

J'ai réinstallé mon OS (Mac OS El Captain) et installé une nouvelle version de mysql (en utilisant homebrew). La version installée (5.7) était plus récente que la précédente. Ensuite, j'ai copié les tables, y compris les fichiers ib *, et redémarré le serveur. Je pouvais voir les tables dans le plan de travail mysql mais quand j'ai essayé de sélectionner quoi que ce soit, j'ai eu "La table n'existe pas".

Solution:

  1. arrêter le serveur mysql par exemple mysql.server stopoubrew services stop mysql
  2. démarrez le serveur en utilisant mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/(changez le chemin si nécessaire)
  3. exécuter mysql_upgrade -u root -p password(dans une autre fenêtre de terminal)
  4. arrêtez le serveur en cours d'exécution mysqladmin -u root -p password shutdown
  5. redémarrez le serveur en mode normal mysql.server startoubrew services start mysql

Les documents pertinents sont ici .

Roman Kutlak
la source
J'ai beaucoup essayé, mais c'est la seule chose qui m'a beaucoup aidé après avoir déménagé sur un nouveau serveur avec toutes mes bases de données. Merci! (Ubuntu 16.04)
Falk
2

Dans mon cas, j'avais défini un déclencheur sur la table, puis j'essayais d'insérer la ligne dans la table. semble que le déclencheur était en quelque sorte erroné, et que l'insertion donnait une erreur, la table n'existe pas.

Yogesh Kumar Gupta
la source
1
Ça marche pour moi! Vérifié chaque déclencheur et trouvé un déclencheur doit être amélioré et cela a fonctionné!
Paresh
1

Il est possible que vous ayez un caractère caché dans le nom de votre table. Ceux-ci n'apparaissent pas lorsque vous faites un show tables. Pouvez-vous faire un "SHOW CREATE TABLE TABLE_ONE" et l'onglet compléter le "TABLE_ONE" et voir s'il met des caractères cachés. De plus, avez-vous essayé de supprimer et de refaire les tables. Juste pour vous assurer que les privilèges ne vont pas mal et qu'il n'y a pas de caractères cachés.

Hoopdady
la source
l'onglet en cours n'aide pas et je ne peux pas afficher la création de table car la table "n'existe pas". de l'enfer
johnsmith
1

Même problème exact après l'importation de la sauvegarde TimeMachine. Ma solution était d'arrêter le serveur MySQL et de corriger les autorisations de lecture-écriture sur les fichiers ib *.

user3415481
la source
1

Je pense qu'une autre réponse mérite d'être évoquée ici (parce que je suis venu ici avec le même problème et cela s'est avéré être la réponse pour moi):

Vérifiez que le nom de la table dans votre requête est orthographié exactement de la même manière que dans la base de données.

C'est une chose évidente pour les débutants, mais des choses comme "utilisateur" vs "utilisateurs" peuvent faire trébucher les gens et j'ai pensé que ce serait une réponse utile à avoir dans la liste ici. :)

vazor
la source
1

Dans mon cas, lorsque j'importais le fichier sql exporté, j'obtenais une erreur comme la table n'existe pas pour la requête de création de table.

J'ai réalisé qu'il y avait un trait de soulignement dans le nom de ma base de données et mysql mettait un caractère d'échappement juste avant cela.

J'ai donc supprimé ce soulignement dans le nom de la base de données, tout a fonctionné.

J'espère que ça aide quelqu'un d'autre aussi.

Onur Kucukkece
la source
1

Ma table avait été renommée en quelque sorte ' Customers'avec un espace de tête

Cela signifiait

a) les requêtes ont éclaté

b) le tableau n'apparaissait pas comme prévu dans l'ordre alphabétique de mes tableaux, ce qui dans ma panique signifiait que je ne pouvais pas le voir!

RENAME TABLE ` Customer` TO `Customer`;
zzapper
la source
1

Dans mon cas, c'était un SQLCA.DBParmparamètre.

j'ai utilisé

SQLCA.DBParm = "Databse = "sle_database.text""

mais ça doit être

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

Explication:

Vous allez combiner trois chaînes:

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

N'utilisez pas d'espaces dans les quatermarks. Merci à mon collègue Jan.

Marek
la source
1

Allez à: à l' xampp\mysql\data\dbname
intérieur de dbname ont tablename.frm et tablename.ibd fichier.
supprimez-le et redémarrez mysql et réessayez.

Abu Sufian
la source
1

Copiez uniquement le ibdata1fichier de votre ancien répertoire de données. Ne copiez pas ib_logfile1ou ib_logfile0fichiers. Cela empêchera MySQL de démarrer.

Plabon Dutta
la source
1

Entré croiser le même problème aujourd'hui. Il s'agit d'un problème mysql "Identifier Case Sensitivity".

Veuillez vérifier le fichier de données correspondant. Il est très probable que le nom de fichier soit en minuscules sur le système de fichiers, mais le nom de table répertorié dans la commande "show tables" est en majuscules. Si la variable système " lower_case_table_names" est 0, la requête renverra "la table n'existe pas" car les comparaisons de noms sont sensibles à la casse lorsque " lower_case_table_names" est 0.

Hudson Liang
la source
1

J'ai eu le même problème sous Windows. En plus de copier les fichiers ib * et le répertoire mysql sous le répertoire de données thd, j'ai également dû faire correspondre le fichier my.ini.

Le fichier my.ini de mon installation précédente n'avait pas la ligne suivante:

innodb-page-size=65536

Mais ma nouvelle installation l'a fait. Peut-être parce que je n'avais pas cette option dans l'ancien programme d'installation. J'ai supprimé cela et redémarré le service et les tables ont fonctionné comme prévu. En bref, assurez-vous que le nouveau fichier my.ini est une réplique de l'ancien, à la seule exception étant le datadir, le plugin-dir et le port #, selon votre nouvelle installation.

Rajesh Thennan
la source