web-dev-qa-db-fra.com

Comment corriger une erreur MySQL "Fichier de clé incorrecte" lorsque vous ne pouvez pas réparer la table?

J'essaie d'exécuter une requête assez volumineuse qui est censée s'exécuter tous les soirs pour remplir une table. Je reçois une erreur disant Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it mais le moteur de stockage que j'utilise (quelle que soit la valeur par défaut, je suppose?) ne prend pas en charge la réparation des tables.

comment résoudre ce problème afin de pouvoir exécuter la requête?

36
Wayne Molina

Le moteur de stockage (MyISAM) prend en charge la table de réparation. Vous devriez pouvoir le réparer.

Si la réparation échoue, c'est un signe que la table est très corrompue, vous n'avez pas d'autre choix que de la restaurer à partir des sauvegardes.

Si vous avez d'autres systèmes (par exemple, non-production avec les mêmes versions logicielles et le même schéma) avec une table identique, vous pourrez peut-être le corriger avec un peu de piratage (copie du frm et des fichiers MYI, suivie d'une réparation).

En substance, l'astuce consiste à éviter de se casser des tables en premier lieu. Cela signifie toujours éteindre votre base de données proprement, ne jamais la faire planter et ne jamais avoir de problèmes de matériel ou d'alimentation. En pratique, cela n'est pas très probable, donc si la durabilité est importante, vous voudrez peut-être envisager un moteur de stockage plus sûr.

2
MarkR

Vous devez changer l'emplacement du dossier temporaire de MySQL qui est '/ tmp' dans la plupart des cas en un emplacement avec un plus grand espace disque. Changez-le dans le fichier de configuration de MySQL.

Fondamentalement, votre serveur manque d'espace disque où se trouve/tmp.

48
marknt15

Vous devrez exécuter cette commande à partir de l'invite MySQL:

REPAIR TABLE tbl_name USE_FRM;

De documentation MySQL sur la commande Repair :

L'option USE_FRM est disponible si le fichier d'index . MYI est manquant ou si son en-tête est corrompu . Cette option indique à MySQL de ne pas faire confiance aux informations contenues dans l'en-tête du fichier .MYI et de les recréer à l'aide des informations du fichier .frm. Ce type de réparation ne peut pas être effectué avec myisamchk .

32
Drew

Votre requête génère un jeu de résultats si volumineux qu'il doit créer une table temporaire pour contenir certains des résultats ou un produit intermédiaire utilisé pour générer le résultat.

La table temporaire est générée dans/var/tmp. Cette table temporaire semble avoir été corrompue. Peut-être que le périphérique sur lequel la table temporaire était construite manquait d'espace. Cependant, cela entraînerait normalement une erreur de "manque d'espace". Peut-être que quelque chose d'autre en cours d'exécution sur votre machine a encombré la table temporaire.

Essayez de retravailler votre requête pour utiliser moins d'espace, ou essayez de reconfigurer votre base de données afin qu'une partition plus grande ou plus sûre soit utilisée pour les tables temporaires.

Manuel MySQL - B.5.4.4. Où MySQL stocke les fichiers temporaires

8
Martin

Le simple "REPAIR the table" de PHPMYADMIN a résolu ce problème pour moi.

  1. aller à phpmyadmin
  2. table problématique ouverte
  3. allez dans l'onglet Opérations (dans ma version de PMA)
  4. en bas vous trouverez le lien "Tableau de réparation"
1
Mladen Janjetovic

TABLE DE RÉPARATION tbl_name USE_FRM;

La commande ne s'exécute que lorsque le type MySQL 'Storage Engine' doit être 'MyISAM'

J'espère que cela t'aides

1
BhavyaSoft

Dans mon cas, il y avait un problème d'espace disque. J'ai supprimé certains fichiers de guerre indésirables de mon serveur et cela a fonctionné par la suite.

1
Ninad Pingale

ce problème est dû à la faible disponibilité de l'espace de stockage d'un lecteur particulier (c:\ou d:\etc.,), libérez de la mémoire puis cela fonctionnera.

Merci Saikumar.P

1
sai kumar

Appliquez le jeu de caractères et le classement appropriés à la base de données, à la table et aux colonnes/champs.

Je crée une structure de base de données et de table en utilisant des requêtes SQL d'un serveur à un autre. il crée la structure de la base de données comme suit:

  1. base de données avec jeu de caractères de "utf8", classement de "utf8_general_ci"
  2. tables avec charset de "utf8" et collation de "utf8_bin".
  3. les colonnes/champs de la table ont le jeu de caractères "utf8" et le classement "utf8_bin".

Je change le classement du tableau et de la colonne en utf8_general_ci, et il résout l'erreur.