2010-03-11 23 views
28

J'essaie d'exécuter une requête assez volumineuse qui est censée s'exécuter tous les soirs pour remplir une table. J'obtiens une erreur en disant Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it mais le moteur de stockage que j'utilise (quel que soit le défaut, je suppose?) Ne supporte pas la réparation des tables. Comment puis-je résoudre ce problème afin que je puisse exécuter la requête?Comment réparer une erreur MySQL "Fichier clé incorrect" lorsque vous ne pouvez pas réparer la table?

+0

tmp dossier a une limite généralement 2 Go, essayez df -h pour le voir –

Répondre

1

Le moteur de stockage (MyISAM) ne table de réparation de support. Vous devriez être capable de 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 réparer avec un hackery (copie des fichiers MYM, suivie d'une réparation).

Essentiellement, l'astuce consiste à éviter d'avoir des tables cassées en premier lieu. Cela signifie toujours fermer votre db proprement, ne jamais l'avoir crash et ne jamais avoir de problèmes de matériel ou d'alimentation. Dans la pratique, ce n'est pas très probable, donc si la durabilité est importante, vous pouvez envisager un moteur de stockage plus sécurisé.

8

Votre requête génère un ensemble de résultats si volumineux qu'il doit générer 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 l'appareil sur lequel la table temporaire était construite manquait d'espace. Cependant, cela entraînerait normalement une erreur "hors espace". Peut-être que quelque chose d'autre fonctionnant sur votre machine a heurté 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.

MySQL Manual - B.5.4.4. Where MySQL Stores Temporary Files

40

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

Fondamentalement, votre serveur manque d'espace disque sur lequel se trouve/tmp.

+0

Cela a corrigé mon erreur, merci pour l'indice! – Mazrick

+0

J'ai eu ce problème après avoir changé l'emplacement du dossier de données mysql, parce que le fs était hors de l'espace .. donc juste 'sudo rm -rf/var/lib/mysql/ibdata1' l'a fait pour moi. Merci!!! – mimoralea

+0

tmpdir =/mnt/mysql_tmp L'espace de 1,2 T continuait-il d'afficher une erreur? Pourquoi ? [racine @ ADM-PROD-PERCONA-SL-RP-03 ~] # df -h Taille du système de fichiers Utilisé Utilisation en% Monté sur /dev/xvda1 7.8G 1.6G 6.1G 21%/ devtmpfs 61G 80K 61G 1%/dev tmpfs 61G 0 61G 0%/dev/shm /dev/md0 3.0T 1.9T 1.2T 62%/mnt –

27

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

REPAIR TABLE tbl_name USE_FRM; 

De MySQL's documentation on the Repair command:

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

+1

Merci, fixé ma table. Mais en réalité, il devrait être «REPAIR TABLE tbl_name USE_FRM» –

+1

Cela a également travaillé pour moi –

+2

Cela a fonctionné pour moi aussi - un épargnant de vie pour un système de production !! –

0

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

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

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

je changer le classement de la table et de la colonne à utf8_general_ci, et il résout l'erreur.

0

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é après cela.

0

REPAIR TABLE nom_table USE_FRM;

commande uniquement exécuter lorsque le type MySQL 'Storage Engine' devrait être 'MyISAM'

Hope this helps

+0

Cela ne semble pas ajouter quelque chose de nouveau à [une réponse existante et mise à jour] (https://stackoverflow.com/a/7081976/4453460). – lfurini

0

simple "réparer la table" de phpMyAdmin a résolu ce problème pour moi.

  1. aller à phpmyadmin
  2. table ouverte problématique
  3. allez à l'onglet Opérations (dans ma version de PMA)
  4. au fond, vous trouverez "Réparer la table" lien