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.
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
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.
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
Pour modifier les autorisations de répertoire et de fichier, vous devez définir deux commandes comme celle-ci:
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------
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---
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
Vous voudrez peut-être envisager d'examiner les autorisations de ce fichier.
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.
Si tout le reste échoue, vous pouvez envisager de réinstaller l'intégralité de votre environnement MySQL.
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.
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;
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.)