web-dev-qa-db-fra.com

La table n'existe pas dans le moteur

Je reçois une erreur étrange dans ma base de données mysql:

SELECT * FROM mytable

retour:

ERROR 1932 (42S02): Table 'mydb.mytable' doesn't exist in engine

Je peux confirmer que les tables existent bien sur le système de fichiers local et show tables; retourne en effet les tables qui m'intéressent.

show tables;

+-----------------+
| Tables_in_mydb  |
+-----------------+
| presets         |
| mytable         |
+-----------------+

Et la sélection:

select * from mytable;

Table 'mydb.mytable' doesn't exist in engine. 

L'erreur n'a aucun sens et j'ai travaillé avec ces tables il y a quelques jours sans aucun problème. Je n'ai pas déplacé les tables. Que devrais-je faire?

Avant que l'erreur ci-dessus n'apparaisse, je recevais une erreur:

Accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: OUI), mais j'ai réussi à mettre à jour le mot de passe. Je n'ai aucune idée de ce qui a déclenché cette erreur car je n'ai pas joué avec des mots de passe.

Cependant, lorsque j'ai essayé de corriger cette erreur, j'ai défini des autorisations sur /Applications/XAMPP/xamppfiles/var/mysql pour lire/écrire à tout le monde.

J'ai un accès physique aux fichiers .frm et .ibd de la base de données. Je crois que j'utilise le moteur de stockage InnoDB.

MISE À JOUR:

le statut de show table donne une sortie vraiment bizarre:

+-----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+------------------------------------------------------+
| Name            | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment                                              |
+-----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+------------------------------------------------------+
| preset          | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | NULL                | NULL        | NULL       | NULL              |     NULL | NULL           | Table 'mydb.preset' doesn't exist in engine          |
| mytable         | NULL   |    NULL | NULL       | NULL |           NULL |        NULL |            NULL |         NULL |      NULL |           NULL | NULL                | NULL        | NULL       | NULL              |     NULL | NULL           | Table 'mydb.mytable' doesn't exist in engine         |

MISE À JOUR 2ls -lh /Applications/XAMPP/xamppfiles/var/mysql/ Retour

-rwxrwxr--   1 _mysql  706   135K Jan  4  2017 My-MBP.err
-rwxrwxr--   1 _mysql  706   897K Jan 27 00:46 My-MacBook-Pro.local.err
drwxrwxr-x  33 _mysql  706   1.1K Feb 20  2017 abraham
drwxrwxr-x   7 _mysql  706   238B May 27  2016 accounts
-rwxrwxr--   1 _mysql  706    16K Jan 27 00:46 aria_log.00000001
-rwxrwxr--   1 _mysql  706    52B Jan 27 00:46 aria_log_control
drwxrwxr-x  23 _mysql  706   782B Jun 11  2017 ch7
drwxrwxr-x  31 _mysql  706   1.0K Jun 19  2017 coronel_2
drwxrwxr-x   5 _mysql  706   170B May 29  2017 emails
-rwxrwxr--   1 _mysql  706   5.0M Jan 27 00:46 ib_logfile0
-rwxrwxr--   1 _mysql  706   5.0M Nov 24  2015 ib_logfile1
-rwxrwxr--   1 _mysql  706    74M Jan 27 00:46 ibdata1
drwxrwxr-x   5 _mysql  706   170B Aug 28 17:44 jsonTest
-rwxrwxr--   1 _mysql  706     0B Nov 24  2015 multi-master.info
drwxrwxrwx   9 _mysql  706   306B Jan 26 11:40 mydb
drwxrwxr-x  89 _mysql  706   3.0K Jan 15 11:29 mysql
drwxrwxr-x  13 _mysql  706   442B May 30  2017 payments_ipndb
drwxrwxr-x   3 _mysql  706   102B Jan 15 11:29 performance_schema
drwxrwxr-x  41 _mysql  706   1.4K Jan 15 11:29 phpmyadmin
drwxrwxr-x   2 _mysql  706    68B Jan 15 11:28 test
drwxrwxr-x   5 _mysql  706   170B Jun 11  2017 tracking
drwxrwxr-x   9 _mysql  706   306B May 17  2017 tutorial
drwxrwxr-x   9 _mysql  706   306B Feb 21  2017 users

et ls -lh /Applications/XAMPP/xamppfiles/var/mysql/mydb/ Retour

-rw-rw-rw-  1 _mysql  706    65B Sep  4 17:57 db.opt
-rw-rw-rw-  1 _mysql  706   1.8K Sep  8 18:20 preset.frm
-rw-rw-rw-  1 _mysql  706    96K Sep  9 20:53 preset.ibd
-rw-rw-rw-  1 _mysql  706   1.0K Jan 11 16:15 mytable.frm
-rw-rw-rw-  1 _mysql  706   128K Jan 11 21:02 mytable.ibd

Le fichier .err contient ces messages:

[Warning] InnoDB: Cannot open table mydb/mytable from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.

Même avec ce lien, je ne sais toujours pas quoi faire.

MISE À JOUR:

Je peux confirmer que l'erreur provient de la réinstallation de XAMPP. J'ai créé une nouvelle table et je pourrais l'utiliser normalement. Ensuite, j'ai réinstallé le xampp, et la table nouvellement créée n'est plus accessible, renvoyant la même erreur que toutes les autres tables: Table doesn't exist in engine.

J'obtiens également la même erreur dans les journaux d'erreurs: [Warning] InnoDB: Cannot open table mydb/newlycreatedtable from the internal data dictionary of InnoDB though the .frm file for the table existe. Je ne sais toujours pas comment le résoudre.

6
sanjihan

Avertissement: Veuillez lire l'intégralité de la réponse jusqu'à la fin avant d'effectuer toute modification. Veuillez tout sauvegarder avant de modifier les autorisations et/ou les propriétaires. Vous modifiez les autorisations à vos risques et périls

Cause racine possible

Modification des autorisations sur le .../var/mysql le répertoire n'est pas la meilleure idée.

Cependant, lorsque j'ai essayé de corriger cette erreur, j'ai défini des autorisations sur /Applications/XAMPP/xamppfiles/var/mysql pour lire/écrire à tout le monde.


Ce que MySQL préfère

MySQL préfère les autorisations répertoire suivantes:

0700 (-RWX------)

MySQL préfère les autorisations file suivantes:

0660 (-RW-RW----)

Par défaut, MySQL crée des répertoires de base de données avec une valeur d'autorisation d'accès de 0700.

...et...

Les valeurs par défaut UMASK et UMASK_DIR sont respectivement 0660 et 0700.

Référence:B.5.3.1 Problèmes avec les autorisations de fichiers


Fixer les autorisations

Pour modifier les autorisations de répertoire et de fichier, vous devez définir deux commandes comme celle-ci:

Autorisations de répertoire

bash> find /Applications/XAMPP/xamppfiles/var/mysql -type d -exec chmod 0700 {} \;

Dans le répertoire /Applications/XAMPP/xamppfiles/var/mysql rechercher tous les répertoires et modifier les autorisations de répertoire en -rwx------

Autorisations de fichier

bash> find /Applications/XAMPP/xamppfiles/var/mysql -type f -exec chmod 0660 {} \;

Cela se traduit par: Dans le répertoire /Applications/XAMPP/xamppfiles/var/mysql rechercher tous les fichiers et modifier les autorisations de répertoire en -rw-rw---

Référence:Comment puis-je définir chmod pour un dossier et tous ses sous-dossiers et fichiers dans Linux Ubuntu Terminal? [Clsoed]


Propriétaire?

Vous devriez avoir tout réinitialisé comme MySQL le préfère, sauf si vous avez modifié le propriétaire du .../var/mysql sous-répertoires et fichiers, qui devraient normalement appartenir à l'utilisateur mysql linux et également au groupe mysql.

Dans le cas où les fichiers et répertoires n'appartiennent plus à mysql mysql vous devrez peut-être réinitialiser le propriétaire et le groupe à l'aide de:

bash> chown -R mysql mysql /Applications/XAMPP/xamppfiles/var/mysql

Fichier et répertoire individuels

Vous voudrez peut-être envisager d'examiner les autorisations de ce fichier.


Observations finales

En regardant votre liste de répertoires, j'ai remarqué que l'utilisateur est défini sur _mysql (avec soulignement) et le groupe est défini sur 706. Cela peut être dû au fait que le groupe linux mysql a été supprimé et que l'utilisateur _mysql modifié.

Le groupe mysql s'affiche-t-il si vous exécutez la commande suivante:

bash> cat /etc/group

Sortie possible:

mysql:x:117:

L'utilisateur mysql existe-t-il lorsque vous tapez la commande suivante:

bash> cat /etc/passwd

Sortie possible:

mysql:x:109:117:MySQL Server,,,:/home/mysql:/bin/bash

Notez que l'utilisateur mysql (109) appartient au groupe mysql (117), qui correspond à l'ID du cat /etc/group commande.

Veuillez noter:
L'exécution des commandes CHMOD et CHOWN ne réinitialise correctement les autorisations que si l'utilisateur et le groupe existent. Si l'utilisateur et le groupe existent, vous pourrez peut-être réinitialiser les autorisations et les propriétaires aux valeurs correctes.


Dernier recours

Si tout le reste échoue, vous pouvez envisager de réinstaller l'intégralité de votre environnement MySQL.


Dernier recours 2

Après avoir lu les derniers commentaires et mises à jour de la question, il existe une autre solution possible

La réinstallation de la pile XAMPP ne supprime apparemment pas tous les fichiers * .frm précédents contenant vos tables précédemment créées.

Toutefois, la réinstallation de la pile XAMPPP ne vous permettra pas d'accéder aux objets précédemment accessibles. En effet, les fichiers/tables ne sont plus référencés dans les catalogues système. C'est pourquoi vous recevez un message d'erreur lorsque vous essayez de sélectionner dans vos tables.

Vous pouvez obtenir une restauration partielle des définitions de données et/ou de tables avec MySQL Utilities 1.5 qui contient l'outil suivant:

5.10 mysqlfrm - Lecteur de fichiers pour les fichiers .frm.

Les outils sont documentés comme suit:

...
Un mode de diagnostic est disponible en utilisant le --diagnostic option. Cela fait basculer l'utilitaire pour lire les fichiers .frm octet par octet afin de récupérer autant d'informations que possible. Le mode de diagnostic présente des limitations supplémentaires en ce qu'il ne peut pas déchiffrer le jeu de caractères ou les valeurs de classement sans utiliser une installation de serveur existante spécifiée avec le --server ou --basedir option. Cela peut également affecter la taille des colonnes si le tableau utilise des caractères multi-octets. Utilisez ce mode lorsque le mode par défaut ne peut pas lire le fichier ou si aucun serveur MySQL n'est installé sur l'hôte.
...

Cela pourrait être votre dernier recours pour récupérer les informations de votre *.frm fichiers dans votre instance MySQL cassée.

1
John aka hot2use

Y a-t-il d'autres fins dans le journal mysql?. vérifiez que la table existe dans le schéma mysql:

sélectionnez table_name dans information_schema.tables où table_name = 'mytable';

essayez également de modifier la table:

alter table mytable engine = innodb;

0
andres

Voyons comment vous avez créé mytable. Je suggère que cela fonctionne:

SELECT * FROM `mytable  `;

Veuillez ne pas avoir d'espaces dans les noms de table. Et évitez la ponctuation qui pourrait causer des problèmes. (Le soulignement est sûr.)

0
Rick James