各 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
は避ける必要がある。
通常、複数サーバー間でデータディレクトリを共有するのはよくない事です。追加情報に関しては 項4.12. 「同じマシン上での複数 MySQL サーバの実行」を参照してください。