MySQL: # 126 - Falsche Schlüsseldatei für Tabelle

108

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?

Brian
quelle
3
Ich bekomme das auch mit Ansichten
Elzo Valugi
4
Der tmp-Ordner hat normalerweise ein Limit von 2 GB. Versuchen Sie es mit df -h
Elzo Valugi,
Wenn Sie dies getan haben REPAIR TABLEund dies immer noch erhalten und außerdem Speicherplatz vorhanden ist, sollten /tmpSie versuchen, den Server einfach neu zu starten.
icc97

Antworten:

160

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.

Monster X.
quelle
4
Außerdem habe ich ungefähr 2 GB freien Speicherplatz und erhalte diesen Fehler. Aber meine Datenbank über 1,7 GB und Datenbank hat eine Tabelle mit ~ 1,5 Millionen Zeilen. Nach der Bereinigung verschwindet der Fehler, wenn der Speicherplatz etwa 3,5 bis 4 GB beträgt.
Sergey
2
Auf meinem System (Fedora 18) /tmpbefindet sich ein kleines tmpfs-Dateisystem, und mysql hat nicht genügend Speicherplatz, um dort eine temporäre Tabelle zu schreiben. Ich musste die tmpdirKonfigurationsvariable wie auf mysql.com
jcbwlkr
1
Obwohl dies eine Ursache sein kann, war dies für mich nie auf die volle Festplatte zurückzuführen. Ich erhalte diesen Fehler auf einer Amazon RDS-Instanz, die für 10 GB zugewiesen ist und nur 1% voll ist. Ein geringer Speicher kann auch ein Grund sein.
Cerin
2
Sie können tmpdir = / mysql_tmp oder etwas in der my.cnf setzen und es sollte sich im Root-Dateisystem befinden (wie groß das auch sein mag)
Kevin Parker
Ich habe auch den gleichen Fehler erhalten, obwohl ich Speicherplatz habe [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h Größe des verwendeten Dateisystems / devtmpfs 61G 80K 61G 1% / dev tmpfs 61G 0 61G 0% / dev / shm / dev / md0 3.0T 1.8T 1.2T 61% / mnt
Ashish Karpe
35

Zunä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:

KEYist normalerweise ein Synonym für INDEX. Das Schlüsselattribut PRIMARY KEYkann auch so angegeben werden, wie KEYes in einer Spaltendefinition angegeben ist. Dies wurde aus Gründen der Kompatibilität mit anderen Datenbanksystemen implementiert.


Die Art des Fehlers, den Sie erhalten, kann auf zwei Dinge zurückzuführen sein:

  • Festplattenprobleme auf dem MySQL-Server
  • Beschädigte Schlüssel / Tabellen

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 tmpOrdner, der für die Größe der Abfragen, die Sie ausführen möchten, zu klein ist. Sie können dann entscheiden oder tmpgrößer machen oder Ihre Anfragen kleiner machen! ;)

Manchmal tmpist 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:

Falsche Schlüsseldatei für Tabelle 'FILEPATH.MYI'; versuche es zu reparieren

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 .

snooze92
quelle
16

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:

df -h

Suchen Sie die Prozesse, in denen Dateien geöffnet sind /tmp

sudo lsof /tmp/**/*

Dann umount /tmpund /var/tmp:

umount -l /tmp
umount -l /var/tmp

Entfernen Sie dann die beschädigte Partitionsdatei:

rm -fv /usr/tmpDSK

Dann erstelle ein schönes neues:

/scripts/securetmp

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.

user387049
quelle
9

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

Junmats
quelle
Ich habe alle meine Schlüssel gelöscht und optimiert. Kann ich diesen Fehler erhalten, wenn meine Abfrage zu langsam ist?
Brian
Ich bin nicht sicher, aber nach meinem Verständnis wird dieser Fehler nicht durch eine Abfrage verursacht. Haben Sie schon versucht zu reparieren?
Junmats
3

Ich habe diesen Fehler , wenn ich gesetzt ft_min_word_len = 2inmy.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.

jcampbell1
quelle
Wissen Sie, ob dies nur passiert, wenn Sie die Einstellung zum ersten Mal ändern, oder ob dies passieren kann, weil die minimale Wortlänge zu klein ist?
Y0lk
1

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 :)

Bajrang
quelle
1

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:

  1. Beenden Sie den MySQL-Dienst:
  2. Öffnen Sie mysql \ data
  3. Entfernen Sie sowohl ib_logfile0 als auch ib_logfile1.
  4. Starten Sie den Dienst neu
Hyder B.
quelle
1
repair table myschema.mytable;
Drohung
quelle
1

Ich habe dieses Problem behoben mit:

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Mai hilft

Sean
quelle
Ich konnte ein ähnliches Problem mit nur einem Schritt lösen. Sie können Ihre Tabelle mit Ihrer aktuellen Tabellen-Engine neu erstellen. Dh wenn Sie myisam verwenden, verwenden Sie: ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney
1

Gehe zu /etc/my.cnfund kommentiere austmpfs

#tmpdir=/var/tmpfs

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.

/var/tmp$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs
/var/tmpfs$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs
Biege
quelle
0

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.

MigDus
quelle
0

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:

-- rename column and rename index
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Werke (2 Aussagen):

-- rename column
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- rename index
ALTER TABLE `client_types`
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Dies war auf MariaDB 10.0.20. Es gab keine Fehler mit derselben Abfrage unter MySQL 5.5.48.

Bernie
quelle
0
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G

Dann liegt ein Fehler vor:

 Error 'Table './openx/f_scraper_banner_details' is marked as crashed and should be repaired' on query. Default database: 'openx'. Query: 'INSERT INTO f_scraper_banner_details(job_details_id, ad_id, client_id, zone_id, affiliateid, comments, pct_to_report, publisher_currency, sanity_check_enabled, status, error_code, report_date) VALUES (10274859, 321264, 0, 31926, 0, '', -1, 'USD', 1, 'FAILURE', 'INACTIVE_BANNER', '2016-06-28 04:00:00')'

mysql> Reparaturtabelle f_scraper_banner_details;

Das hat bei mir funktioniert

Ashish Karpe
quelle
0

Mein Problem kam von einer schlechten Anfrage. Ich habe in FROM auf eine Tabelle verwiesen, auf die in SELECT nicht verwiesen wurde.

Beispiel:

   SELECT t.*,s.ticket_status as `ticket_status`
   FROM tickets_new t, ticket_status s, users u

, users uist das, was das Problem für mich verursacht hat. Das Entfernen löste das Problem.

Als Referenz war dies in einer CodeIgniter-Entwicklungsumgebung.

Lee Cocklin
quelle
0

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.

Nico Schefer
quelle
0

mysqlcheck -r -f -uroot -p --use_frm Datenbankname

wird normalerweise den Trick machen

Andy
quelle