109

MySQL クエリから次のエラーが発生しました。

#126 - Incorrect key file for table

このテーブルのキーを宣言していませんが、インデックスはあります。何が問題なのか誰か知っていますか?

4

17 に答える 17

167

これが発生するたびに、私の経験ではディスクがいっぱいになりました。

編集

これは、RAM ディスクが構成されている場合に大きなテーブルを変更するなどの操作を行うときに、RAM ディスクがいっぱいになると発生する可能性があることにも注意してください。サイズを大きくできない場合は、ramdisk 行を一時的にコメントアウトして、そのような操作を許可することができます。

于 2011-12-08T16:48:27.453 に答える
35

まず、MySQL ではキーとインデックスが同義語であることを知っておく必要があります。CREATE TABLE Syntaxに関するドキュメントを見ると、次のように読むことができます。

KEYは通常、 の同義語ですINDEX。key 属性は、列定義で与えられたときにPRIMARY KEYas just として指定することもできます。KEYこれは、他のデータベース システムとの互換性のために実装されました。


現在、発生しているエラーの種類は、次の 2 つのことが原因である可能性があります。

  • MySQL サーバーのディスクの問題
  • 破損したキー/テーブル

最初のケースでは、クエリに制限を追加すると問題が一時的に解決する可能性があることがわかります。tmpそれで問題が解決する場合は、実行しようとしているクエリのサイズに対して小さすぎるフォルダーがある可能性があります。tmp次に、クエリを大きくするか、小さくするかを決定できます。;)

tmp十分な大きさでもいっぱいになることがあります。このような状況では、手動でクリーンアップを行う必要があります。

2 番目のケースでは、MySQL のデータに実際の問題があります。データを簡単に再挿入できる場合は、テーブルを削除/再作成して、データを再挿入することをお勧めします。できない場合は、REPAIR tableを使用してテーブルを修復してみてください。これは一般に時間がかかり、失敗する可能性が非常に高いプロセスです。


表示される完全なエラー メッセージを見てください。

テーブル 'FILEPATH.MYI' のキー ファイルが正しくありません。修復してみてください

メッセージには、修復を試みることができると記載されています。また、取得した実際の FILEPATH を見ると、さらに多くのことがわかります。

  • /tmp/#sql_ab34_23fクエリのサイズが原因で、MySQL が一時テーブルを作成する必要があることを意味します。それは /tmp に保存され、/tmp にはその一時テーブル用の十分なスペースがありません。

  • 代わりに実際のテーブルの名前が含まれている場合は、このテーブルが破損している可能性が非常に高く、修復する必要があることを意味します。


問題が /tmp のサイズにあることがわかった場合は、修正について同様の質問に対するこの回答をお読みください: MySQL, Error 126: Incorrect key file for table .

于 2013-12-09T10:13:43.183 に答える
16

これらの手順に従うことで、tmp ディレクトリを再作成し、問題を修正することができました。

すべてのファイル システムとそのディスク使用量を人間が読める形式で表示します。

df -h

ファイルが開いているプロセスを見つける/tmp

sudo lsof /tmp/**/*

次にアンマウント/tmpして/var/tmp:

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

次に、破損したパーティション ファイルを削除します。

rm -fv /usr/tmpDSK

次に、素敵な新しいものを作成します。

/scripts/securetmp

securetmp Perl スクリプトを編集することで、tmp ディレクトリのサイズを自分で手動で設定できますが、スクリプトを実行するだけで、サーバー上の tmp ディレクトリのサイズが約 450MB から 4.0GB に増加することに注意してください。

于 2012-09-06T15:18:14.540 に答える
10

エラー#126は通常、破損したテーブルを取得したときに発生します。これを解決する最善の方法は、修復を実行することです。この記事は役立つかもしれません:

http://dev.mysql.com/doc/refman/5.0/en/repair-table.html

于 2010-01-06T05:13:22.033 に答える
1

に移動し/etc/mysql/my.cnfてコメントアウトしますtmpfs

#tmpdir=/var/tmpfs

これで問題は解決しました。

別の回答で提案されているコマンドを実行しましたが、ディレクトリは小さいですが空だったので、スペースは問題ではありませんでした。

/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
于 2015-06-30T21:17:05.510 に答える
1

今、他の答えが私のためにそれを解決しました。同じクエリで列とインデックスの名前を変更すると、エラーが発生したことが判明しました。

動作していません:

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

作品 (2 ステートメント):

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

これは MariaDB 10.0.20 でした。MySQL 5.5.48 では、同じクエリでエラーは発生しませんでした。

于 2016-04-05T15:24:17.643 に答える
1
repair table myschema.mytable;
于 2014-09-12T10:19:23.027 に答える
1

この問題を次の方法で修正しました。

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

役立つかもしれません

于 2014-11-14T16:22:56.460 に答える
1

クエリで limit を使用してみてください。@Monsters Xが言ったように、ディスクがいっぱいのためです。

何千ものレコードがあったため、私もこの問題に直面し、クエリの制限によって解決しました。今はうまくいっています:)

于 2013-02-15T06:45:26.357 に答える
0
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G

次に、エラーが存在します:

 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> repair table f_scraper_banner_details;

これは私のために働いた

于 2016-07-01T07:21:15.190 に答える
0

クエリに含まれるテーブルごとに修復コマンドを実行してみてください。

MySQL 管理者を使用して、カタログに移動します -> カタログを選択します -> テーブルを選択します -> メンテナンス ボタンをクリックします -> 修復 -> FRM を使用します。

于 2012-04-09T00:13:07.357 に答える
0

ft_min_word_len (全文の最小単語長)を減らした後にテーブルに書き込むと、このメッセージが表示されました。これを解決するには、テーブルを修復してインデックスを再作成します。

于 2020-03-25T12:39:46.453 に答える