MySQL:#126-テーブルの不正なキーファイル


108

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

#126 - Incorrect key file for table

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


3
私はこれもビューで取得します
Elzo Valugi 2012年

4
tmpフォルダーには通常2GBの制限があります。それを表示するにはdf -hを試してください
Elzo Valugi 2012年

aを実行しても問題が解決されず、REPAIR TABLEさらに空き容量がある場合は/tmp、サーバーを再起動するだけで十分です。
icc97 2016年

回答:


160

これが起こるたびに、それは私の経験では完全なディスクでした。

編集

ramdiskが構成されている場合に大きなテーブルを変更するなどの操作を行うと、ramdiskがいっぱいになることが原因であることにも注意してください。ramdiskの行を一時的にコメント化して、サイズを大きくできない場合にそのような操作を許可できます。


4
また、約2Gbの空き容量があり、このエラーが発生します。しかし、私のデータベースは約1.7 GBで、データベースには約150万行のテーブルがあります。クリーンアップ後、空き領域が3.5〜4Gbになると、エラーが消えます。
セルゲイ

2
私のシステム(Fedora 18)に/tmpは小さなtmpfsファイルシステムがあり、mysqlはそこに一時テーブルを書き込んでスペースを使い果たしました。mysql.comにtmpdir記載されているように設定変数を設定する必要がありました
jcbwlkr

1
これが原因である可能性がありますが、これは私にとってディスクがいっぱいになったことが原因ではありません。このエラーは、10GBに割り当てられたAmazon RDSインスタンスで発生します。メモリ不足も原因である可能性があります。
Cerin

2
my.cnfでtmpdir = / mysql_tmpまたは何かを設定でき、ルートファイルシステムにある必要があります(それがどれほど大きいか)
Kevin Parker

ディスクスペースがあるにもかかわらず、同じエラーが発生しました[root @ ADM-PROD-PERCONA-SL-RP-03 percona]#df -h使用されているファイルシステムのサイズAvail Use%/ mount / dev / xvda1 7.8G 1.6G 6.1G 21% / 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

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

KEY通常はの同義語ですINDEX。キー属性PRIMARY KEYKEY、列定義で指定するときと同じように指定することもできます。これは、他のデータベースシステムとの互換性のために実装されました。


現在、発生しているエラーの種類は、次の2つの原因が考えられます。

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

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

時々、tmp十分な大きさでもまだいっぱいになる場合、これらの状況では手動でクリーンアップする必要があります。

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


あなたが得る完全なエラーメッセージを見てください:

テーブル 'FILEPATH.MYI'のキーファイルが正しくありません。修理しよう

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

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

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


問題が/ tmpのサイズにあることが判明した場合は、修正に関する同様の質問に対するこの回答を読んでください:MySQL、エラー126:テーブルのキーファイルが正しくありません


16

これらの指示に従うと、tmpディレクトリを再作成して問題を修正できました。

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

df -h

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

sudo lsof /tmp/**/*

次にumount /tmp/var/tmp

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

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

rm -fv /usr/tmpDSK

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

/scripts/securetmp

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


9

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

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


すべてのキーを削除して最適化しました。クエリが遅すぎる場合、このエラーが発生しますか?
ブライアン

よくわかりませんが、私の理解では、このエラーの原因はクエリではありません。もう修理してみましたか?
junmats 2010年

3

で設定ft_min_word_len = 2したときにこのエラーが発生しましたmy.cnf。これにより、フルテキストインデックスの最小語長がデフォルトの4から2に下がります。

テーブルを修復すると問題が修正されました。


これが最初に設定を変更したときにのみ発生するのか、それとも最小の語長が短すぎるために発生する可能性があるのか​​知っていますか?
Y0lk 2015年

1

クエリで制限を使用してみてください。@Monsters Xが言っているように、ディスク全体が原因です。

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


1

私はこれが古いトピックであることを知っていますが、言及された解決策のどれも私にとってうまくいきませんでした。私はうまくいった他のことをしました:

必要がある:

  1. MySQLサービスを停止します。
  2. mysql \ dataを開きます
  3. ib_logfile0とib_logfile1の両方を削除します。
  4. サービスを再起動します


1

私はこの問題を修正しました:

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

助けるかもしれない


1つのステップを使用するだけで同様の問題を解決できました。現在のテーブルエンジンを使用してテーブルを再構築できます。つまり、myisamを使用している場合は、ALTER IGNORE TABLE table ENGINE = MyISAM;を使用します。
SeanDowney 2014

1

に移動し/etc/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

0

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

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


0

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

機能していない:

-- 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では、同じクエリでエラーは発生しませんでした。


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>テーブルの修復f_scraper_banner_details;

これは私のために働いた


0

私の問題は悪いクエリから来ました。FROMでテーブルを参照しましたが、SELECTでは参照されませんでした。

例:

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

, users u私に問題を引き起こしていたものです。それを削除すると問題が解決しました。

参考までに、これはCodeIgniter開発環境でした。


0

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.