MySQLクエリから次のエラーが発生しました。
#126 - Incorrect key file for table
このテーブルのキーも宣言していませんが、インデックスはあります。誰が何が問題になるのか知っていますか?
これが起こるたびに、それは私の経験では完全なディスクでした。
編集
また、ramdiskが構成されている場合に大きなテーブルを変更するようなことをするときに、これが完全なramdiskによって引き起こされる可能性があることにも注意する価値があります。サイズを大きくできない場合は、ramdisk行を一時的にコメントアウトして、このような操作を許可できます。
まず、キーとインデックスはMySQLの同義語であることを知っておく必要があります。 CREATE TABLE Syntax に関するドキュメントを見ると、以下を読むことができます:
KEY
は、通常INDEX
の同義語です。キー属性PRIMARY KEY
は、列定義で指定された場合、ちょうど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は通常、破損したテーブルを取得したときに発生します。これを解決する最善の方法は、修復を実行することです。この記事は役に立つかもしれません:
ft_min_Word_len = 2
にmy.cnf
を設定すると、このエラーが発生しました。これにより、フルテキストインデックスの最小ワード長がデフォルトの4から2になります。
テーブルを修復すると問題が修正されました。
クエリで制限を使用してみてください。 @Monsters Xが言ったように、フルディスクが原因です。
数千のレコードがあったため、この問題に直面し、クエリの制限によって解決しました。うまく動作しています:)
/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
私はこれが古いトピックであることを知っていますが、言及された解決策のどれも私のために働きませんでした。私は働いた他の何かをしました:
必要がある:
この問題を修正しました:
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
助けになるかもしれない
repair table myschema.mytable;
今、他の答えは私のためにそれを解決しました。同じクエリで列とインデックスの名前を変更すると、エラーが発生したことがわかりました。
動作しない:
-- 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で同じクエリを使用してもエラーはありませんでした。
私の問題は、不適切なクエリに起因していました。 FROMでテーブルを参照しましたが、SELECTでは参照されませんでした。
例:
SELECT t.*,s.ticket_status as `ticket_status`
FROM tickets_new t, ticket_status s, users u
, users u
が問題の原因でした。これを削除することで問題は解決しました。
参考のために、これはCodeIgniter開発環境で行われました。
クエリに関係するテーブルのそれぞれに対して修復コマンドを実行してみてください。
MySQL管理者を使用して、カタログ->カタログの選択->テーブルの選択->メンテナンスボタン->修復-> FRMの使用を選択します。
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;
これは私のために働いた