Tables InnoDB
<<<
Solutions pour le dictionnaire de données InnoDB Tables InnoDB
>>>

16.18 Résolution de problèmes avec InnoDB
16 Tables InnoDB
 Manuel de Référence MySQL 4.1 : Version Française

->Solutions pour le dictionnaire de données InnoDB

16.18.1 Solutions pour le dictionnaire de données InnoDB

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.

<< Solutions pour le dictionnaire de données InnoDB >>
Tables InnoDB Résolution de problèmes avec InnoDB Tables InnoDB