MySQL クエリから次のエラーが発生しました。
#126 - Incorrect key file for table
このテーブルのキーを宣言していませんが、インデックスはあります。何が問題なのか誰か知っていますか?
MySQL クエリから次のエラーが発生しました。
#126 - Incorrect key file for table
このテーブルのキーを宣言していませんが、インデックスはあります。何が問題なのか誰か知っていますか?
これが発生するたびに、私の経験ではディスクがいっぱいになりました。
編集
これは、RAM ディスクが構成されている場合に大きなテーブルを変更するなどの操作を行うときに、RAM ディスクがいっぱいになると発生する可能性があることにも注意してください。サイズを大きくできない場合は、ramdisk 行を一時的にコメントアウトして、そのような操作を許可することができます。
まず、MySQL ではキーとインデックスが同義語であることを知っておく必要があります。CREATE TABLE Syntaxに関するドキュメントを見ると、次のように読むことができます。
KEY
は通常、 の同義語ですINDEX
。key 属性は、列定義で与えられたときにPRIMARY KEY
as just として指定することもできます。KEY
これは、他のデータベース システムとの互換性のために実装されました。
現在、発生しているエラーの種類は、次の 2 つのことが原因である可能性があります。
最初のケースでは、クエリに制限を追加すると問題が一時的に解決する可能性があることがわかります。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 .
これらの手順に従うことで、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 に増加することに注意してください。
エラー#126は通常、破損したテーブルを取得したときに発生します。これを解決する最善の方法は、修復を実行することです。この記事は役立つかもしれません:
に移動し/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
今、他の答えが私のためにそれを解決しました。同じクエリで列とインデックスの名前を変更すると、エラーが発生したことが判明しました。
動作していません:
-- 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 では、同じクエリでエラーは発生しませんでした。
repair table myschema.mytable;
この問題を次の方法で修正しました。
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
役立つかもしれません
クエリで limit を使用してみてください。@Monsters Xが言ったように、ディスクがいっぱいのためです。
何千ものレコードがあったため、私もこの問題に直面し、クエリの制限によって解決しました。今はうまくいっています:)
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;
これは私のために働いた
クエリに含まれるテーブルごとに修復コマンドを実行してみてください。
MySQL 管理者を使用して、カタログに移動します -> カタログを選択します -> テーブルを選択します -> メンテナンス ボタンをクリックします -> 修復 -> FRM を使用します。
ft_min_word_len (全文の最小単語長)を減らした後にテーブルに書き込むと、このメッセージが表示されました。これを解決するには、テーブルを修復してインデックスを再作成します。