このセクションでは、MyISAM
テーブル(.MYI
および
.MYD
の拡張子)に対して
myisamchk
を使用する方法について説明します。ISAM
テーブル(.ISM
および
.ISD
の拡張子)に対しては、isamchk
を使用してください。
MySQL バージョン 3.23.14 以降、REPAIR
TABLE
コマンドで MyISAM
テーブルを修復できるようになっています。
See 項4.5.5. 「REPAIR TABLE
構文」。
テーブル破損の症状としては、クエリが予期せず中断したり、以下のようなエラーが発生します。
tbl_name.frm
is locked against change
Can't find file tbl_name.MYI
(Errcode: ###)
Unexpected end of file
Record file is crashed
Got error ### from table handler
perror ###
を実行すると、エラーの詳細情報を取得できる。以下は、テーブルに問題があることを示す一般的なエラーである。
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format
127 = Record-file is crashed
132 = Old database file
134 = Record was already deleted (or record file crashed)
135 = No more room in record file
136 = No more room in index file
141 = Duplicate unique key or constraint on write or update
144 = Table is crashed and last repair failed
145 = Table was marked as crashed and should be repaired
注意: エラー 135(no more room in record file)は、単純な修復で直せるエラーではない。この場合、以下のコマンドを実行することが必要。
mysql> ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
この手法は、エラー 136(no more room in index file)に対しても使用できる。
他の場合についてはテーブルを修復する必要があります。通常は、myisamchk
でほとんどのエラーを検出して修復できます。
修復プロセスは、以下説明するように 4
段階で構成されます。開始する前に、データベースディレクトリに移動(cd
)してテーブルファイルのアクセス権を確認してください。mysqld
を実行する Unix
ユーザに読み取り権限があることを確認します(この確認を行うユーザにもこれらのファイルへのアクセス権が必要)。ファイルを修正する必要がある場合は、書き込み権限も必要です。
MySQL バージョン 3.23.16
以降を使用している場合は、CHECK
コマンドと REPAIR
コマンドを使用して MyISAM
テーブルのチェックおよび修復を実行できます(できるだけ、これらのコマンドを使用してください)。
See 項4.5.4. 「CHECK TABLE
構文」。 See
項4.5.5. 「REPAIR TABLE
構文」。
テーブル保守に関するセクションで、isamchk
および myisamchk
のオプションを説明しています。 See
項4.5.6. 「myisamchk
を使用したテーブルの保守とクラッシュのリカバリ」。
これらのコマンドで失敗した場合、または
isamchk
および
myisamchk
の拡張機能を使用する場合につき、以下の説明を参考にして修復作業を行ってください。
コマンドラインを使用してテーブルを修復する場合、まず、mysqld
サーバをシャットダウンする必要があります。注意:
mysqladmin shutdown
をリモートサーバから実行した場合、mysqladmin
が戻ってもしばらくの間、mysqld
サーバはシャットダウンしません。すべてのクエリが停止してすべてのキーがディスクにフラッシュされた時点でシャットダウンします。
段階 1: テーブルのチェック
myisamchk *.MYI
または時間に余裕があれば myisamchk -e
*.MYI
を実行します。-s
(サイレント)オプションを使用すると、不要な情報は出力されません。
mysqld
サーバが終了している場合、--update
オプションを使用して myisamchk
がテーブルに 'checked'
のマークを付けるようにします。
myisamchk
がエラーを返したテーブルだけ、修復する必要があります。そのようなテーブルについては、段階
2 へ進みます。
チェック時に複雑なエラー(out of
memory
エラーなど)が発生した場合、あるいは
myisamchk
がクラッシュした場合は段階 3 に進みます。
段階 2: 簡単で安全な修復
注意: 修復を速く行うには、-O
sort_buffer=# -O key_buffer=#
(#
は利用可能メモリの約 4 分の 1)をすべての
isamchk/myisamchk
コマンドに追加します。
最初に myisamchk -r -q
tbl_name
(-r -q
は
``クイックリカバリモード''
の意)を実行します。これにより、データファイルを変更せずにインデックスファイルの修復だけが行われます。データファイルにあるべきものがすべてあり、削除リンクがデータファイル内の正しい場所を指していれば、テーブルは正常に修復されます。成功したら、次のテーブルの修復を開始します。失敗した場合は以下の手順を実行します。
まず、データファイルのバックアップを作成する。
myisamchk -r
tbl_name
(-r
は
``リカバリモード''
の意)を使用する。これにより、不正なレコードと削除されたレコードがデータファイルから削除され、インデックスファイルが再構築される。
前のステップが失敗した場合、myisamchk
--safe-recover tbl_name
を使用する。
セーフリカバリモードにより、古いリカバリ形式が使用され、通常のリカバリモードでは処理できない修復が行われる。ただし、時間がかかる。
修復時に複雑なエラー(out of
memory
エラーなど)が発生した場合、あるいは
myisamchk
がクラッシュした場合は段階 3 に進みます。
段階 3:困難な修復
インデックスファイルの最初の 16K ブロックが破損または不正な情報を含む場合、あるいはインデックスファイルがない場合だけ、この段階に進みます。この段階では、新しいインデックスファイルを作成する必要があります。以下を実行してください。
データファイルを安全な場所に移動する。
テーブル記述ファイルを使用して、新しい(空白の)データとインデックスファイルを作成する。
shell>mysql db_name
mysql>SET AUTOCOMMIT=1;
mysql>TRUNCATE TABLE table_name;
mysql>quit
使用している SQL バージョンに
TRUNCATE TABLE
がない場合は、代わりに DELETE FROM
table_name
を使用する。
古いデータファイルを、新しく作成したデータファイルにコピーする (単に古いファイルを新しいファイルに移動するのではなく、万一に備えて元の場所にも残しておく)。
段階 2 に戻ります。これで、myisamchk -r
-q
が機能するはずです(無限ループにならないはずです)。
MySQL
4.0.2
より、この手順全体を自動で実行する
REPAIR ... USE_FRM
も使用できるようになりました。
段階 4: 非常に困難な修復
記述ファイルもクラッシュしている場合にのみこの段階に進みます。ただし、テーブル作成後に記述ファイルが変更されることはないので、通常は発生しない状況です。
バックアップから記述ファイルをリストアし、段階
3
に戻る。インデックスファイルをリストアして段階
2
に戻ることもできる。後者の場合、myisamchk
-r
を実行する。
バックアップがない場合でも、テーブルがどのように作成されたか正確にわかっていれば、別のデータベースにテーブルのコピーを作成する。テーブルのコピーを作成したデータベースから、新しいデータファイルを削除し、記述ファイルとインデックスファイルを、クラッシュしたデータベースに移動する。これで新しい記述ファイルとインデックスファイルができ、データファイルは前のものがそのまま残る。段階 2 に戻り、インデックスファイルを再構築する。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.