MySQL 8.0 リファレンスマニュアル


16.2.4.2 適切に閉じられなかったテーブルの問題

MyISAM インデックスファイル (.MYI ファイル) には、テーブルが適切に閉じられたかどうかをチェックするために使用できるカウンタがヘッダーの中にあります。 CHECK TABLE または myisamchk から次のような警告が表示された場合、このカウンタの同期が取れていないことを示しています。

clients are using or haven't closed the table properly

この警告は、必ずしもテーブルが破損されたという意味ではありませんが、少なくともテーブルを確認したほうがよいでしょう。

カウンターは次のように機能します。

  • MySQL でテーブルが最初に更新されるときに、インデックスファイルのヘッダー内にあるカウンタが増えます。

  • その後の更新ではカウンタは変更されません。

  • テーブルの最後のインスタンスが閉じられるとき (FLUSH TABLES 操作が行われたため、またはテーブルキャッシュの中に場所がないため) に、それまでにテーブルが更新されていると、カウンタの値が減少します。

  • テーブルを修復するか、チェックして問題がなかった場合は、カウンタがゼロにリセットされます。

  • テーブルを検査する可能性のあるほかのプロセスとの相互作用の問題を回避するため、カウンタがゼロである場合は、テーブルを閉じる際にカウンタの値は減りません。

つまり、カウンタが不正確になる可能性があるのは、次のような場合だけです。

  • MyISAM テーブルのコピーが、最初に LOCK TABLESFLUSH TABLES を発行しないで行われる。

  • MySQL が更新されてから閉じられるまでの間にクラッシュした。 (MySQL は常に各ステートメントの間のすべてに対して書込みを発行するため、テーブルは問題ない可能性があります。)

  • mysqld と同時に使用した myisamchk --recovermyisamchk --update-state によって、テーブルが修正された。

  • 別のサーバーによって使用されている最中に、複数の mysqld サーバーがテーブルを使用し、1 つのサーバーが REPAIR TABLE または CHECK TABLE をテーブルで実行した。 このセットアップでは、ほかのサーバーから警告を受ける可能性がありますが、CHECK TABLE の使用が安全です。 しかし、あるサーバーがデータファイルを新しいファイルに置き換えた場合、別のサーバーには通知されないため、REPAIR TABLE は避けるべきです。

    一般的に、複数のサーバー間でデータディレクトリを共有することは推奨されません。 追加情報については、セクション5.8「1 つのマシン上での複数の MySQL インスタンスの実行」を参照してください。


関連キーワード:  テーブル, ストレージ, エンジン, カウンタ, サーバー, FEDERATED, TABLE, 更新, InnoDB, MERGE