6 Stimmen

Falsche Schlüsseldatei bei MySQL

Ich habe ein Problem mit einer InnoDB (Tabelle war ursprünglich MyISAM, aber konvertiert es zu InndoB vor einiger Zeit) Tabelle; Ich versuche, diese Abfrage ausführen:

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;

Ich erhalte diesen Fehler:

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

Ich kann die betroffenen Tabellen nicht reparieren, aber ich habe beide Tabellen mit einem CHECK überprüft und sie scheinen in Ordnung zu sein. Ich habe auch eine OPTIMIZE auf beide Tabellen & ALSO wieder aufgebaut die Tabellen, indem Sie die unten.

INSERT INTO new_table SELECT * FROM old_table;

Ich habe dann die neue Tabelle in die alte Tabelle name..... umbenannt, aber ich habe das Problem immer noch.

Um herauszufinden, welche Tabelle das Problem verursacht hat, habe ich den Code in der Abfrage entfernt, der auf die Tabelle "rss_feeds" verweist (....), so dass die Abfrage jetzt wie folgt aussieht

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

Das hat funktioniert.

Das Problem hat also mit der Tabelle rss_feeds zu tun.

Also dachte ich mir, ich würde die Tabelle zurück nach MyISAM konvertieren und eine Reparatur durchführen und dann zurück nach InnoDB konvertieren..... das funktionierte vorübergehend, es war wieder normal.... dann brach es wieder..... reparierte es wieder, brach wieder.... jetzt scheint die Reparatur überhaupt nicht zu funktionieren.

Nun, ich weiß, ich weiß...... Ich habe bereits bei Google nach diesem Problem gesucht...... Ich habe festgestellt, dass das Problem in den allermeisten Fällen darin besteht, dass nicht genug Platz im MySQL-Temp-Verzeichnis vorhanden ist...., aber ich habe den Host bereits dazu gebracht, das Temp-Verzeichnis in ein Verzeichnis mit viel mehr Platz zu ändern, und das Problem besteht immer noch.

Ich denke, der HOST ist schuld und es ist immer noch ein Problem mit dem temporären Verzeichnis; warum? Denn nachdem ich es wieder zum Laufen gebracht habe, habe ich wieder angefangen, Daten zur Tabelle rss_posts hinzuzufügen und dadurch wurde der JOIN größer und MySQL ging wieder der Platz aus.... was denken Sie?

5voto

Thomas Jones-Low Punkte 6881

Was hier vor sich geht, ist, dass MySQL das ORDER BY ausführt, indem es eine temporäre Tabelle aus der Verknüpfung der beiden Tabellen erstellt. Die temporäre Tabelle ist zu groß, um in den Speicher zu passen, also erstellt MySQL eine temporäre Datei.

Es gibt ein paar Dinge, die verhindern, dass dies richtig funktioniert. Roher Festplattenspeicher ist eine davon. ulimit ist eine andere. Wenn dies gehostet wird, haben sie möglicherweise eine Quote auf Ihre Festplattennutzung (zusätzlich zu ulimit).

Ich würde vorschlagen, eine einschränkende Klausel zu Ihrer Abfrage hinzuzufügen. Derzeit laden Sie die gesamten rss_posts und rss_feeds in die temporäre Tabelle für die Sortierung. Wenn Sie nur die letzten 10 wollen, sind das viel mehr Daten, als Sie wirklich brauchen.

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;

2voto

Mchl Punkte 60035

Es sieht so aus, als ob das Festplattenkontingent für temporäre Tabellen zu klein ist.

BTW: Es gibt keine Notwendigkeit, REPAIR auf InnoDB-Tabellen auszuführen, da die gesamte Wartung von der Storage Engine selbst durchgeführt wird. Sie haben auch keine Schlüsseldatei, die beschädigt werden könnte.

1voto

Jim Clouse Punkte 8234

Beachten Sie, dass die .MYI-Datei, mit der das Problem auftritt, für eine temporäre Tabelle ist. Wenn Sie Abfragen mit Joins ausführen, muss MySql temporären Speicherplatz verwenden, um die Daten intern zusammenzuführen. Höchstwahrscheinlich geht Ihnen der Platz in Ihrem tmp-Verzeichnis aus.

Versuchen Sie, den tmpdir zugewiesenen Speicherplatz zu vergrößern oder bearbeiten Sie die Datei my.cnf so, dass tmpdir auf einen Ort mit genügend Speicherplatz verweist (vergessen Sie nicht, der Datei Berechtigungen zu geben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X