Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


7.6.3 MyISAM テーブルの修復方法

このセクションの説明では、MyISAM テーブル (拡張子 .MYI および .MYD) に対し myisamchk を使用する方法について説明します。

さらに、CHECK TABLE および REPAIR TABLE ステートメントを使用して、MyISAM テーブルをチェックして修復することもできます。セクション13.7.2.2「CHECK TABLE 構文」およびセクション13.7.2.5「REPAIR TABLE 構文」を参照してください。

破損したテーブルの兆候として、予期せずに中止するクエリーや次のような観察可能なエラーが含まれます。

  • tbl_name.frm が変更に対してロックされます

  • ファイル tbl_name.MYI が見つかりません (エラーコード: nnn)。

  • 予期しないファイルの終わり

  • レコードファイルがクラッシュしました

  • テーブルハンドラからエラー nnn を取得します

エラーの詳細を取得するには、perror nnn を実行します。ここで、nnn はエラー番号です。次の例は、perror を使用して、テーブルの問題を示すもっとも一般的なエラー番号の意味を見つける方法を示しています。

shell> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired

エラー 135 (レコードファイルに空きがない) およびエラー 136 (インデックスファイルに空きがない) は、単純な修復で修正できるエラーではありません。この場合、ALTER TABLE を使用して、MAX_ROWS および AVG_ROW_LENGTH テーブルオプションの値を増やす必要があります。

ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;

現在のテーブルオプション値が不明な場合は、SHOW CREATE TABLE を使用します。

その他のエラーの場合は、テーブルを修復する必要があります。myisamchk は通常発生するほとんどの問題を検出し、修正できます。

修復プロセスには、ここに示す最大 4 つのステージがあります。始める前に、場所をデータベースディレクトリに変更し、テーブルファイルの権限をチェックしてください。Unix では、mysqld を実行するユーザーによって (およびチェックするファイルにアクセスする必要があるため、チェックするユーザーにも)、それらが読み取り可能であることを確認します。ファイルを変更する必要があることが分かったら、それらに書き込みできる必要もあります。

このセクションでは、テーブルチェックが失敗した (セクション7.6.2「MyISAM テーブルのエラーのチェック方法」 で説明しているものなど) 場合、または myisamchk が提供する拡張機能を使用する場合について説明します。

テーブル保守に使用される myisamchk オプションについては、セクション4.6.3「myisamchk — MyISAM テーブルメンテナンスユーティリティー」で説明しています。myisamchk には、パフォーマンスを向上できるメモリー割り当てを制御するために設定できる変数もあります。セクション4.6.3.6「myisamchk メモリー使用量」を参照してください。

コマンド行からテーブルを修復する場合は、まず mysqld サーバーを停止する必要があります。リモートサーバーで mysqladmin shutdown を実行すると、mysqladmin が戻ったあとに、すべてのステートメント処理が停止し、すべてのインデックス変更がディスクにフラッシュされるまで、しばらくの間 mysqld サーバーがまだ使用できることに注意してください。

ステージ 1: テーブルのチェック

myisamchk *.MYI または時間があれば myisamchk -e *.MYI を実行します。-s (サイレント) オプションを使用すると、不要な情報を抑制します。

mysqld サーバーが停止している場合は、--update-state オプションを使用して、myisamchk にテーブルをチェック済みとマークするように指示してください。

myisamchk がエラーを報告しているテーブルだけを修復する必要があります。そのようなテーブルの場合、ステージ 2 に進みます。

チェック時に、予期しないエラー (out of memory エラーなど) を受け取った場合、または myisamchk がクラッシュした場合、ステージ 3 へ進みます。

ステージ 2: 簡単で安全な修復

まず myisamchk -r -q tbl_name を試します (-r -qクイックリカバリモードを意味します)。これは、データファイルにアクセスせずに、インデックスファイルを修復しようとします。データファイルに、必要なすべてのものが含まれ、削除リンクがデータファイル内の正しい場所を指している場合、これは機能するはずであり、テーブルが修正されます。次のテーブルの修復を開始します。そうでない場合は、次の手順を使用します。

  1. 続行する前に、データファイルのバックアップを作成します。

  2. myisamchk -r tbl_name を使用します (-rリカバリモードを意味します)。これによって、正しくない行と削除された行がデータファイルから削除され、インデックスファイルが再構築されます。

  3. 先述のステップが失敗した場合、myisamchk --safe-recover tbl_name を使用します。安全なリカバリモードでは、通常のリカバリモードで扱われないわずかなケースを処理する古いリカバリ方法を使用します (ただし遅くなります)。

注記

修復操作を大幅に高速化する場合、sort_buffer_size および key_buffer_size 変数の値をそれぞれ、myisamchk の実行時に使用可能なメモリーの約 25% に設定してください。

修復時に、予期しないエラー (out of memory エラーなど) を受け取った場合、または myisamchk がクラッシュした場合、ステージ 3 へ進みます。

ステージ 3: 困難な修復

このステージに到達するのは、インデックスファイル内の最初の 16K バイトのブロックが破損しているか、誤った情報が含まれている場合、またはインデックスファイルが失われている場合に限られるはずです。この場合、新しいインデックスファイルを作成する必要があります。次のように実行します。

  1. データファイルを安全な場所に移動します。

  2. テーブル記述ファイルを使用して、新しい (空の) データファイルとインデックスファイルを作成します。

    shell> mysql db_name
    mysql> SET autocommit=1;
    mysql> TRUNCATE TABLE tbl_name;
    mysql> quit
  3. 古いデータファイルを新しく作成したデータファイルにコピーします。(古いファイルを新しいファイルに単に移動しないでください。何か異常があった場合に備えて、コピーを保持する必要があります。)

重要

レプリケーションを使用している場合、それにはファイルシステム操作が含まれ、これらは MySQL によって記録されないため、上記の手順を実行する前に、それを停止してください。

ステージ 2 に戻ります。myisamchk -r -q が機能するはずです。(これは無限ループにならないはずです。)

手順全体を自動的に実行する REPAIR TABLE tbl_name USE_FRM SQL ステートメントを使用することもできます。REPAIR TABLE を使用すると、サーバーがすべての作業を実行するため、ユーティリティーとサーバー間の不要なやり取りの可能性もなくなります。セクション13.7.2.5「REPAIR TABLE 構文」を参照してください。

ステージ 4: きわめて困難な修復

.frm 記述ファイルもクラッシュしている場合のみ、このステージに到達するはずです。記述ファイルはテーブルが作成されたあとに変更されないため、これが発生することはないはずです。

  1. バックアップから記述ファイルをリストアし、ステージ 3 に戻ります。インデックスファイルをリストアし、ステージ 2 に戻ることもできます。後者の場合、myisamchk -r で起動してください。

  2. バックアップがないが、テーブルの作成方法が正確にわかっている場合は、別のデータベースにテーブルのコピーを作成します。新しいデータファイルを削除して、ほかのデータベースから .frm 記述ファイルと .MYI インデックスファイルを、クラッシュしたデータベースへ移動します。これにより、新しい記述ファイルとインデックスファイルが得られますが、.MYD データファイルはそのまま残ります。ステージ 2 に戻り、インデックスファイルの再構築を試みます。


User Comments
  Posted by Adrian Singer on January 15, 2010
  Posted by Rick Umali on February 10, 2011
I landed on this webpage because of Error 145 ("Table was marked as crashed and should be repaired"). I was able to 'fix' it by just using "REPAIR TABLE" (12.4.2.6). According to that doc, REPAIR TABLE is the equivalent of "myisamchk --recover (-r)".
  Posted by addision philip on August 8, 2011
In some circumstances, REPAIR Table & myisamchk – repair with r option are not able to fix corruption in tables. In that situation you can get help from any third party mysql repair utility that meets your requirement and budget.
Some top mysql repair software are:
Stellar Phoenix Database Recovery for MySQL
Recovery for MySQL
Note: First try free download demo version of any software before buy.
  Posted by Libin Babu on December 6, 2011
Hey. Check this link. It will explain how to solve #145 mysql error with necessary screenshots.
http://libinvbabu.blogspot.com/2011/12/where-is-my-blog-145-mysql-error.html
  Posted by John Park on September 12, 2012
MySQL automatically tries & checks to repair MyISAM tables if they are marked as 'Record-file is crashed',‘crashed’ 'No more room in index file' or ‘not closed properly’. MyISAM table damage and MySQL generates a lot of errors such as ‘Warning: Multiple instances of MySQL’, ‘Warning: Checking table….'‘Warning: Repairing table…’and needs to be repaired. For more info http://exchangeserver.tumblr.com/post/27540224026/repairs-mysql-server-database
  Posted by Jens Rantil on April 17, 2015
I also wanted to say I came here because I was getting "ERROR 145 (HY000): Table './mysql/proc' is marked as crashed and should be repaired" when executing a query with a subselect.

`SELECT * FROM mysql.proc` still worked for me, so I assume it was writing stuff to it that was an issue. I issues `USE mysql;REPAIR TABLE proc;`. The execution took 0.01 sec and my issue went away. I was happy this could be resolved without offline intervention.
Sign Up Login You must be logged in to post a comment.