Un problème spécifique avec les tables est que le serveur
MySQL garde les données dans un dictionnaire de données
.frm
, qu'il stocke dans le dossier de base
de données, alors que InnoDB
stocke aussi
les informations dans son propre dossier de données dans
l'espace de tables. Si vous déplacez le fichier
.frm
, ou si vous utilisez DROP
DATABASE
en MySQL versions 3.23.44 et plus anciennes,
ou si le serveur crashe au milieu d'une opération dans le
dictionnaire de données, le fichier .frm
peut être déconnecté du dictionnaire de données interne
InnoDB
.
Un symptôme de ce déphasage est que les commandes
CREATE TABLE
échouent. Si cela arrive, vous
devez lire le fichier de log d'erreurs. Si le fichier de log dit
que la table existe déjà dans le dictionnaire interne
d'InnoDB
, vous avez un fichier de table
orphelin dans l'espace de table InnoDB
, qui
n'a plus de fichier .frm
correspondant. Le
message d'erreur ressemble à ceci :
InnoDB: Error: table test/parent already exists in InnoDB internal InnoDB: data dictionary. Have you deleted the .frm file InnoDB: and not used DROP TABLE? Have you used DROP DATABASE InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another InnoDB: database and moving the .frm file to the current database. InnoDB: Then MySQL thinks the table exists, and DROP TABLE will InnoDB: succeed.
Vous pouvez effacer le fichier orphelin en suivant les instructions du message d'erreur.
Un autre symptôme de déphasage st que MySQL affiche MySQL une
erreur qui dit qu'il ne peut pas ouvrir le fichier
.InnoDB
:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
Dans les logs d'erreurs, vous trouverez le message suivant :
InnoDB: Cannot find table test/child2 from the internal data dictionary InnoDB: of InnoDB though the .frm file for the table exists. Maybe you InnoDB: have deleted and recreated InnoDB data files but have forgotten InnoDB: to delete the corresponding .frm files of InnoDB tables?
Cela signifie qu'il y a un fichier .frm
orphelin sans table correspondante dans les données
InnoDB
. Vous pouvez effacer simplement le
fichier orphelin .frm
.
Si MyQSL crashe au milieu d'une opération ALTER
TABLE
, vous pouvez vous retrouver avec un fichier
temporaire de table, orphelin, dans le code
InnoDB
. Avec
innodb_table_monitor
vous pouvez voir une
table dont le nom est #sql...
, mais comme
MySQL ne vous permet pas d'accéder à une table avec un tel nom
vous ne pouvez ni l'effacer, ni la détruire. La solution est
d'utiliser un mécanisme spécial, disponible depuis MySQL
3.23.48.
Lorsque vous avez une table orpheline
#sql_id
dans un espace de table, vous
pouvez faire que InnoDB
le renomme en
rsql_id_recover_innodb_tmp_table
avec la
commande :
CREATE TABLE `rsql_id_recover_innodb_tmp_table`(...) TYPE=InnoDB;
Les guillemets obliques autour du nom de table sont nécessaires
car une table temporaire contient un tiret
‘-
’.
La définition de la table doit être similaire à celle de la
table temporaire. Si vous ne connaissez pas la définition de la
table temporire, vous pouvez utiliser une définition arbitraire
dans la commande CREATE TABLE
précédente,
et ensuite, remplacer le fichier
rsql_id.frm
par le fichier
#sql_id.frm
de la table temporaire. Notez
que pour copier ou pour renommer un fichier dans le shell, vous
devez mettre le nom du fichier entre guillemets, car le nom du
fichier contient ‘#
’. Alors, vous
pouvez exporter et effacer la table renommée.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.