2010-10-11 11 views
6

J'ai un problème avec un InnoDB (la table était initialement MyISAM, mais il a été converti en InndoB il y a quelque temps); Je suis en train d'exécuter cette requête:Fichier de clé incorrect avec MySQL

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
    INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE 
    feeds.blog_language=1 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

Je reçois cette erreur:

Query : SELECT posts.id,posts.post_title FROM rss_posts AS posts INNER JOIN vw_rss_feeds AS feeds ON posts.blog_id=feeds.id WHER... 
Error Code : 126 
Incorrect key file for table '/tmp/#sql_7375_0.MYI'; try to repair it 

Je ne peux pas exécuter une réparation sur les tables concernées; Cependant, j'ai couru un CHECK sur les deux tables & ils semblent bien. Je l'ai aussi fait un OPTIMIZE sur les deux tables & AUSSI rebâtit les tableaux ci-dessous en faisant le ..

INSERT INTO new_table SELECT * FROM old_table; 

Je puis rebaptisés la nouvelle table à l'ancien nom de table ..... mais je suis toujours avoir ce problème .

Pour essayer & figure ce tableau était à l'origine, je supprimé le code dans la requête faisant référence à la « rss_feeds » tableau .... maintenant la requête ressemble à ceci ..

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

Cela a fonctionné. Donc, le problème est quelque chose avec la table rss_feeds.

Alors je pensais que je voudrais convertir le tableau en MyISAM & exécuter une réparation & puis reconvertir InnoDB ..... cela a fonctionné temporairement, il était de retour à la normale .... il a cassé à nouveau .. ... réparé encore, cassé encore .... maintenant la réparation ne semble pas fonctionner du tout.

Maintenant, je sais, je sais ...... J'ai déjà cherché ce problème sur Google ...... J'ai remarqué que la MAJORITÉ du temps le problème est là nous pas assez d'espace dans le MySQL répertoire temporaire .... mais j'ai déjà l'hôte pour changer le répertoire temp à quelque chose avec beaucoup plus d'espace & le problème persiste.

Je pense que l'HÔTE est à blâmer & il est toujours un problème avec le répertoire temp; Pourquoi? Parce que, après que je l'ai fait fonctionner à nouveau, j'ai commencé à ajouter des données à la table rss_posts à nouveau & d'où le JOIN serait plus grand & MySQL serait à nouveau manquer d'espace .... que pensez-vous?

Répondre

5

Qu'est-ce qui se passe ici MySQL est en train de faire le ORDER BY en construisant une table temporaire à partir de la jointure des deux tables. La table temporaire est trop grande pour tenir dans la mémoire afin que MySQL crée un fichier temporaire.

Il y a quelques petites choses qui empêcheraient cela de fonctionner correctement. L'espace disque brut est un. ulimit en est une autre. Si cela est hébergé, ils peuvent avoir un quota sur votre utilisation du disque (en plus de ulimit).

Je suggère d'ajouter une clause limitative à votre requête. Actuellement, vous chargez l'ensemble des rss_posts et rss_feeds dans la table temporaire pour le tri. Si vous voulez seulement les 10 plus récents, c'est beaucoup plus de données que vous n'en avez vraiment besoin.

SELECT posts.id, posts.post_title 
FROM rss_posts AS posts INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE feeds.blog_language=1 
AND posts.post_data_db > (now - interval 30 day); 
ORDER BY posts.post_date_db DESC LIMIT 10; 
+1

Merci - il y a certainement assez d'espace disque disponible; essentiellement l'hôte a dit ceci .. « La partition '/ var/tmp' utilise le même espace que '/', et ses informations d'utilisation est actuellement comme suit: /dev/sda3 442 g 130G 289g 32%/ Donc, vous ne devriez pas voir de problèmes avec l'espace. " Bien que je me demande si peut-être le/var/tmp/dir est restreint lui-même? Si c'est même possible. Donc, cette requête que vous avez là-bas - qui reçoit essentiellement les 10 derniers messages des 30 derniers jours? – Brett

+0

Correct. Vous pouvez paramétrer le "30" pour le rendre un peu plus large. Mais quel que soit l'espace disque disponible si vous êtes constamment en train de trier l'ensemble des deux tables pour 10 lignes, vous allez rencontrer des problèmes de mise à l'échelle et de performances. –

+0

Oui ... vous faites un bon point. Merci beaucoup! – Brett

2

Il semble que le quota de disque que vous avez pour les tables temporaires soit trop petit.

BTW: Il n'est pas nécessaire d'exécuter REPAIR sur les tables InnoDB, car toute la maintenance est effectuée par le moteur de stockage lui-même. Ils n'ont pas non plus de fichier clé à corrompre.

+0

Super - merci pour cette information utile! :) – Brett

1

Notez que le fichier .MYI son ayant un problème est une table temporaire. Lorsque vous exécutez des requêtes impliquant des jointures, MySQL doit utiliser l'espace temporaire pour fusionner les données en interne. Vous êtes probablement à court d'espace dans votre répertoire tmp. Essayez d'augmenter la quantité d'espace allouée à tmpdir ou éditez le fichier my.cnf pour que tmpdir pointe vers un endroit avec assez d'espace (n'oubliez pas de lui donner des permissions).