このセクションでは、MyISAM
テーブルへの myisamchk
の使用方法について説明します。(拡張子:
.MYI
、.MYD
)
MyISAM
テーブルのチェックと修復には、CHECK
TABLE
や REPAIR TABLE
などのステートメントを使用します
(推奨)。詳細は、項12.5.2.3. 「CHECK TABLE
構文」
を参照してください。
テーブル破損の症状としては、クエリが予期せず中断したり、次のようなエラーが発生します。
is locked against change
tbl_name
.frm
Can't find file
(Errcode: tbl_name
.MYInnn
)
Unexpected end of file
Record file is crashed
Got error nnn
from table
handler
perror nnn
を実行すると、エラーの詳細情報を取得できます。nnn
はエラー番号です。次の例は、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)とエラー 136 (no more room in index file)
は、簡単に直せるエラーではありません。この場合、ALTER
TABLE
を使用して MAX_ROWS
または AVG_ROW_LENGTH
テーブル
オプションを値を修正してください。
ALTER TABLEtbl_name
MAX_ROWS=xxx
AVG_ROW_LENGTH=yyy
;
現行のテーブル
オプション値がわからない場合は、SHOW
CREATE TABLE
を使用します。
この 2 つ以外のエラーが出る場合は、テーブルを修復します。 myisamchk で検出するときに、発生するエラーの原因を正します。
修復プロセスには、4 つの段階があります。Unix では、mysqld を実行する Unix ユーザに読み取り権限があることを確認します(この確認を行うユーザにもこれらのファイルへのアクセス権が必要)。ファイルを修正する必要がある場合は、書き込み権限も必要です。
このセクションでは、項4.9.4.2. 「MyISAM
テーブルのエラー チェック方法」
で説明しているテーブル
チェックで失敗した場合、または
myisamchk
の拡張機能を使用する場合の修復作業について説明しています。
myisamchk で行うテーブル保守のオプションに関しては、項7.4. 「myisamchk — MyISAM テーブル メンテナンス ユーティリティ」 を参照してください。
コマンドラインからテーブルを修復する場合は、まず、mysqld サーバを停止します。ノート: リモート サーバで mysqladmin shutdown を実行するときは、mysqladmin を返しても、すべてのステートメント処理の停止、続いてすべてのインデックスの変更をディスクにフラッシュするまでの間、 mysqld が活動を続けます。
段階 1:テーブルのチェック
myisamchk
*.MYI、または時間に余裕があれば
myisamchk -e *.MYI
を実行します。-s
(silent)
オプションを使用すると、不要な情報出力を抑制します。
mysqld
サーバが停止している場合は、--update-state
オプションを使用して myisamchk
にテーブルで 「checked」
マークを付けるよう指定します。
myisamchk がエラーを返すテーブルだけを修復する場合は、段階 2 へ進みます。
チェック時に複雑なエラー(out of
memory
エラーなど)が発生した場合、あるいは
myisamchk
がクラッシュした場合、段階 3 へ進みます。
段階 2: 簡単で安全な修復
まず、myisamchk -r -q
tbl_name
を試行する。(-r -q
は
「クイック リカバリ モード」
で実行するという意味。) これで、データ
ファイルには触れずにインデックス
ファイルの修復だけを行います。データ
ファイルに必要なデータがすべて揃っていて、削除リンクがデータ
ファイル内の正しい位置を指していれば、テーブルは正常に修復できます。この後は、次のテーブルの修復を開始します。失敗した場合は以下の手順を実行します。
データフ ァイルのバックアップを作成する。
myisamchk -r
tbl_name
を使用する。(-r
は
「リカバリ モード」
で実行するという意味。)
これは、不正なレコードとデータ
ファイルから削除したレコードを取り除いて、インデックス
ファイルを再構築する。
前のステップが失敗した場合、myisamchk --safe-recover . を使用する。セーフ リカバリ モードでは、対応できるケースが少ない、古いリカバリ形式を使用している。このケースは、通常のリカバリ モードでは行わない方法で、処理には時間がかかる。
ノート:
修復オペを高速化するには、myisamchk
を実行するときの sort_buffer_size
および key_buffer_size
の変数の値を、利用可能システム メモリの 25
パーセント (1/4) で設定します。
修復時に複雑なエラー(out of
memory
エラーなど)が発生した場合、あるいは
myisamchk
がクラッシュした場合、段階 3 へ進みます。
段階 3: 困難な修復
インデックス ファイルの最初の 16KB ブロックが破損している、またはそこに不正な情報がある場合、あるいは、インデックス ファイルがない場合に、この段階に進みます。この場合、新しいインデックス ファイルを作成する必要があります。以下を実行してください。
データ ファイルを安全な場所に移動する。
テーブル記述ファイルを使用して、新しい(空白の)データとインデックスファイルを作成する。
shell>mysql
mysql>db_name
SET AUTOCOMMIT=1;
mysql>TRUNCATE TABLE
mysql>tbl_name
;quit
古いデータファイルを、新しく作成したデータファイルにコピーする。単に古いファイルを新しいファイルに移動するのではなく、万一に備えて元の場所にも残しておくこと。
そして、段階 2 に戻ります。これで、myisamchk -r -q が機能するはずです(無限ループにならないはずです)。
REPAIR TABLE
の SQL
ステートメントを使用して、この手順を自動的に行うこともできます。tbl_name
USE_FRMREPAIR
TABLE
を使用すると、サーバがすべての作業を行うため、ユーティリティとサーバの間に不要なやり取りが起こる可能性はありません。項12.5.2.6. 「REPAIR TABLE
構文」
を参照してください。
段階 4: 非常に困難な修復
.frm
という記述ファイルもクラッシュしている場合に、この手順に従います。ただし、テーブル作成後に記述ファイルが変更になることはないため、通常は発生しない状況です。
バックアップから記述ファイルをリストアし、段階 3 に戻る。インデックス ファイルをリストアして段階 2 に戻ることも可能。後者の場合、myisamchk -r で起動する。
バックアップがない場合でも、そのテーブルがどのように作成したかが正確にわかるときは、テーブルのコピーを別のデータベースに作成する。新しいデータ
ファイルを削除してから、.frm
記述ファイルと .MYI
インデックス
ファイルを、その別のデータベースからクラッシュしたデータベースへ移動する。これで新しい記述ファイルとインデックス
ファイルができ、.MYD
データ
ファイルは前のものがそのまま残る。段階
2 に戻り、インデックス
ファイルを再構築する。