Ich habe den folgenden Fehler von einer MySQL-Abfrage erhalten.
#126 - Incorrect key file for table
Ich habe noch nicht einmal einen Schlüssel für diese Tabelle deklariert, aber ich habe Indizes. Weiß jemand, was das Problem sein könnte?
mysql
mysql-error-126
Brian
quelle
quelle
REPAIR TABLE
und dies immer noch erhalten und außerdem Speicherplatz vorhanden ist, sollten/tmp
Sie versuchen, den Server einfach neu zu starten.Antworten:
Jedes Mal, wenn dies passiert ist, war es meiner Erfahrung nach eine vollständige Festplatte.
BEARBEITEN
Es ist auch erwähnenswert, dass dies durch eine vollständige Ramdisk verursacht werden kann, wenn Sie beispielsweise eine große Tabelle ändern, wenn Sie eine Ramdisk konfiguriert haben. Sie können die Ramdisk-Zeile vorübergehend auskommentieren, um solche Vorgänge zuzulassen, wenn Sie sie nicht vergrößern können.
quelle
/tmp
befindet sich ein kleines tmpfs-Dateisystem, und mysql hat nicht genügend Speicherplatz, um dort eine temporäre Tabelle zu schreiben. Ich musste dietmpdir
Konfigurationsvariable wie auf mysql.comZunächst sollten Sie wissen, dass Schlüssel und Indizes Synonyme in MySQL sind. Wenn Sie sich die Dokumentation zur CREATE TABLE-Syntax ansehen , können Sie Folgendes lesen:
Die Art des Fehlers, den Sie erhalten, kann auf zwei Dinge zurückzuführen sein:
Im ersten Fall werden Sie feststellen, dass das Problem durch Hinzufügen eines Limits zu Ihrer Abfrage vorübergehend behoben werden kann. Wenn dies für Sie erledigt ist, haben Sie wahrscheinlich einen
tmp
Ordner, der für die Größe der Abfragen, die Sie ausführen möchten, zu klein ist. Sie können dann entscheiden odertmp
größer machen oder Ihre Anfragen kleiner machen! ;)Manchmal
tmp
ist es groß genug, aber es wird immer noch voll. In diesen Situationen müssen Sie einige manuelle Bereinigungen durchführen.Im zweiten Fall gibt es tatsächliche Probleme mit den Daten von MySQL. Wenn Sie die Daten einfach wieder einfügen können, würde ich empfehlen, die Tabelle einfach zu löschen / neu zu erstellen und die Daten erneut einzufügen. Wenn Sie dies nicht können, können Sie versuchen, die Tabelle mit der REPAIR-Tabelle zu reparieren . Es ist ein allgemein langwieriger Prozess, der sehr wohl scheitern kann.
Sehen Sie sich die vollständige Fehlermeldung an, die Sie erhalten:
In der Nachricht wird erwähnt, dass Sie versuchen können, es zu reparieren. Wenn Sie sich den tatsächlichen FILEPATH ansehen, den Sie erhalten, können Sie mehr herausfinden:
Wenn es so etwas wie ist
/tmp/#sql_ab34_23f
, bedeutet dies, dass MySQL aufgrund der Abfragegröße eine temporäre Tabelle erstellen muss. Es speichert es in / tmp und dass in Ihrem / tmp nicht genügend Speicherplatz für diese temporäre Tabelle vorhanden ist.Wenn es stattdessen den Namen einer tatsächlichen Tabelle enthält, bedeutet dies, dass diese Tabelle sehr wahrscheinlich beschädigt ist und Sie sie reparieren sollten.
Wenn Sie feststellen, dass Ihr Problem die Größe von / tmp hat, lesen Sie einfach diese Antwort auf eine ähnliche Frage für das Update: MySQL, Fehler 126: Falsche Schlüsseldatei für Tabelle .
quelle
Durch Befolgen dieser Anweisungen konnte ich mein tmp-Verzeichnis neu erstellen und das Problem beheben:
Zeigen Sie alle Dateisysteme und ihre Festplattennutzung in lesbarer Form an:
Suchen Sie die Prozesse, in denen Dateien geöffnet sind
/tmp
Dann umount
/tmp
und/var/tmp
:Entfernen Sie dann die beschädigte Partitionsdatei:
Dann erstelle ein schönes neues:
Beachten Sie, dass Sie durch Bearbeiten des Securetmp Perl-Skripts die Größe des tmp-Verzeichnisses manuell festlegen können. Durch einfaches Ausführen des Skripts wurde jedoch die Größe des tmp-Verzeichnisses auf unserem Server von ca. 450 MB auf 4,0 GB erhöht.
quelle
Fehler Nr. 126 tritt normalerweise auf, wenn Sie eine beschädigte Tabelle haben. Der beste Weg, dies zu lösen, ist eine Reparatur. Dieser Artikel könnte helfen:
http://dev.mysql.com/doc/refman/5.0/en/repair-table.html
quelle
Ich habe diesen Fehler , wenn ich gesetzt
ft_min_word_len = 2
inmy.cnf
, was die minimalen Wortlänge in einem Volltextindex zu 2, von dem Standard von 4 senkt.Das Reparieren der Tabelle hat das Problem behoben.
quelle
Versuchen Sie, limit in Ihrer Abfrage zu verwenden. Es liegt an der vollen Festplatte, wie von @Monsters X gesagt.
Ich habe mich auch diesem Problem gestellt und es durch eine begrenzte Anzahl von Abfragen gelöst, weil die Tausenden von Datensätzen dort waren. Jetzt funktioniert es gut :)
quelle
Ich weiß, dass dies ein altes Thema ist, aber keine der genannten Lösungen hat bei mir funktioniert. Ich habe noch etwas getan, das funktioniert hat:
Du brauchst:
quelle
quelle
Ich habe dieses Problem behoben mit:
Mai hilft
quelle
table
ENGINE = MyISAM;Gehe zu
/etc/my.cnf
und kommentiere austmpfs
Dies behebt das Problem.
Ich habe den in einer anderen Antwort vorgeschlagenen Befehl ausgeführt, und obwohl das Verzeichnis klein ist, war es leer, sodass der Speicherplatz nicht das Problem war.
quelle
Versuchen Sie, einen Reparaturbefehl für jede der an der Abfrage beteiligten Tabellen auszuführen.
Verwenden Sie den MySQL-Administrator, gehen Sie zu Katalog -> Katalog auswählen -> Tabelle auswählen -> Klicken Sie auf die Schaltfläche Wartung -> Reparieren -> FRM verwenden.
quelle
Jetzt von den anderen Antworten löste es für mich. Es stellt sich heraus, dass das Umbenennen einer Spalte und eines Index in derselben Abfrage den Fehler verursacht hat.
Funktioniert nicht:
Werke (2 Aussagen):
Dies war auf MariaDB 10.0.20. Es gab keine Fehler mit derselben Abfrage unter MySQL 5.5.48.
quelle
Dann liegt ein Fehler vor:
mysql> Reparaturtabelle f_scraper_banner_details;
Das hat bei mir funktioniert
quelle
Mein Problem kam von einer schlechten Anfrage. Ich habe in FROM auf eine Tabelle verwiesen, auf die in SELECT nicht verwiesen wurde.
Beispiel:
, users u
ist das, was das Problem für mich verursacht hat. Das Entfernen löste das Problem.Als Referenz war dies in einer CodeIgniter-Entwicklungsumgebung.
quelle
Ich habe diese Meldung beim Schreiben in eine Tabelle erhalten, nachdem ich ft_min_word_len (Volltext min Wortlänge) reduziert habe . Um dies zu lösen, erstellen Sie den Index neu, indem Sie die Tabelle reparieren.
quelle
mysqlcheck -r -f -uroot -p --use_frm Datenbankname
wird normalerweise den Trick machen
quelle