MySQLクエリから次のエラーが発生しました。
#126 - Incorrect key file for table
このテーブルのキーは宣言していませんが、インデックスは持っています。誰が何が問題になるのか知っていますか?
REPAIR TABLE
さらに空き容量がある場合は/tmp
、サーバーを再起動するだけで十分です。
MySQLクエリから次のエラーが発生しました。
#126 - Incorrect key file for table
このテーブルのキーは宣言していませんが、インデックスは持っています。誰が何が問題になるのか知っていますか?
REPAIR TABLE
さらに空き容量がある場合は/tmp
、サーバーを再起動するだけで十分です。
回答:
これが起こるたびに、それは私の経験では完全なディスクでした。
編集
ramdiskが構成されている場合に大きなテーブルを変更するなどの操作を行うと、ramdiskがいっぱいになることが原因であることにも注意してください。ramdiskの行を一時的にコメント化して、サイズを大きくできない場合にそのような操作を許可できます。
/tmp
は小さなtmpfsファイルシステムがあり、mysqlはそこに一時テーブルを書き込んでスペースを使い果たしました。mysql.comにtmpdir
記載されているように設定変数を設定する必要がありました
最初に、キーとインデックスはMySQLの同義語であることを知っておく必要があります。CREATE TABLE構文に関するドキュメントを見ると、次の情報を読むことができます。
KEY
通常はの同義語ですINDEX
。キー属性PRIMARY KEY
はKEY
、列定義で指定するときと同じように指定することもできます。これは、他のデータベースシステムとの互換性のために実装されました。
現在、発生しているエラーの種類は、次の2つの原因が考えられます。
最初のケースでは、クエリに制限を追加すると、問題が一時的に解決する場合があります。それでうまくいく場合tmp
は、実行しようとしているクエリのサイズに対して小さすぎるフォルダーがある可能性があります。次に、決定するかtmp
、または大きくするか、クエリを小さくすることができます!;)
時々、tmp
十分な大きさでもまだいっぱいになる場合、これらの状況では手動でクリーンアップする必要があります。
2番目のケースでは、MySQLのデータに実際の問題があります。データを簡単に再挿入できる場合は、テーブルを削除または再作成して、データを再挿入することをお勧めします。できない場合は、REPAIRテーブルを使用して、テーブルを所定の位置に修復してみてください。これは一般に長いプロセスであり、非常に失敗する可能性があります。
あなたが得る完全なエラーメッセージを見てください:
テーブル 'FILEPATH.MYI'のキーファイルが正しくありません。修理しよう
メッセージには、修復を試みることができると記載されています。また、実際に取得したFILEPATHを見ると、さらに詳しい情報がわかります。
このような/tmp/#sql_ab34_23f
場合、MySQLはクエリサイズのために一時テーブルを作成する必要があることを意味します。それは/ tmpに保存され、/ tmpにはその一時テーブル用の十分なスペースがありません。
代わりに実際のテーブルの名前が含まれている場合は、このテーブルが破損している可能性が高いため、修復する必要があります。
問題が/ tmpのサイズにあることが判明した場合は、修正に関する同様の質問に対するこの回答を読んでください:MySQL、エラー126:テーブルのキーファイルが正しくありません。
これらの指示に従うと、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に増加しました。
エラー#126は通常、破損したテーブルを取得したときに発生します。これを解決する最良の方法は、修復を実行することです。この記事は役立つかもしれません:
で設定ft_min_word_len = 2
したときにこのエラーが発生しましたmy.cnf
。これにより、フルテキストインデックスの最小語長がデフォルトの4から2に下がります。
テーブルを修復すると問題が修正されました。
私はこの問題を修正しました:
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
助けるかもしれない
table
ENGINE = MyISAM;を使用します。
に移動し/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
今、他の答えのうち、私のためにそれを解決しました。同じクエリで列とインデックスの名前を変更するとエラーが発生することがわかりました。
機能していない:
-- 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では、同じクエリでエラーは発生しませんでした。
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;
これは私のために働いた