各 MyISAM
インデックスファイル (.MYI
ファイル) には、テーブルが適切に閉じられたかどうかをチェックするために使用できるカウンタがヘッダーの中にあります。 CHECK TABLE
または myisamchk から次のような警告が表示された場合、このカウンタの同期が取れていないことを示しています。
clients are using or haven't closed the table properly
この警告は、必ずしもテーブルが破損されたという意味ではありませんが、少なくともテーブルを確認したほうがよいでしょう。
カウンターは次のように機能します。
MySQL でテーブルが最初に更新されるときに、インデックスファイルのヘッダー内にあるカウンタが増えます。
その後の更新ではカウンタは変更されません。
テーブルの最後のインスタンスが閉じられるとき (
FLUSH TABLES
操作が行われたため、またはテーブルキャッシュの中に場所がないため) に、それまでにテーブルが更新されていると、カウンタの値が減少します。テーブルを修復するか、チェックして問題がなかった場合は、カウンタがゼロにリセットされます。
テーブルを検査する可能性のあるほかのプロセスとの相互作用の問題を回避するため、カウンタがゼロである場合は、テーブルを閉じる際にカウンタの値は減りません。
つまり、カウンタが不正確になる可能性があるのは、次のような場合だけです。
MyISAM
テーブルのコピーが、最初にLOCK TABLES
とFLUSH TABLES
を発行しないで行われる。MySQL が更新されてから閉じられるまでの間にクラッシュした。 (MySQL は常に各ステートメントの間のすべてに対して書込みを発行するため、テーブルは問題ない可能性があります。)
mysqld と同時に使用した myisamchk --recover か myisamchk --update-state によって、テーブルが修正された。
-
別のサーバーによって使用されている最中に、複数の mysqld サーバーがテーブルを使用し、1 つのサーバーが
REPAIR TABLE
またはCHECK TABLE
をテーブルで実行した。 このセットアップでは、ほかのサーバーから警告を受ける可能性がありますが、CHECK TABLE
の使用が安全です。 しかし、あるサーバーがデータファイルを新しいファイルに置き換えた場合、別のサーバーには通知されないため、REPAIR TABLE
は避けるべきです。一般的に、複数のサーバー間でデータディレクトリを共有することは推奨されません。 追加情報については、セクション5.8「1 つのマシン上での複数の MySQL インスタンスの実行」を参照してください。