Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

13.7.3.2 CHECK TABLE ステートメント

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option: {
    FOR UPGRADE
  | QUICK
  | FAST
  | MEDIUM
  | EXTENDED
  | CHANGED
}

CHECK TABLE は、1 つまたは複数のテーブルをエラーがないかどうかチェックします。 CHECK TABLE はまた、ビューをチェックして、そのビュー定義で参照されているテーブルが存在しなくなっているなどの問題がないかどうかを調べることもできます。

テーブルをチェックするには、それに対する何らかの権限が必要です。

CHECK TABLE は、InnoDBMyISAMARCHIVE、および CSV テーブルに対して機能します。

InnoDB テーブルで CHECK TABLE を実行する前に、InnoDB テーブルに対する CHECK TABLE の使用上のノート を参照してください。

CHECK TABLE はパーティションテーブルでサポートされており、ALTER TABLE ... CHECK PARTITION を使用して 1 つ以上のパーティションをチェックできます。詳細は、セクション13.1.9「ALTER TABLE ステートメント」 および セクション24.3.4「パーティションの保守」 を参照してください。

CHECK TABLE は、インデックス付けされていない仮想生成カラムを無視します。

CHECK TABLE の出力

CHECK TABLE は、次のテーブルに示すカラムを含む結果セットを返します。

カラム
Table テーブル名
Op 常に check
Msg_type statuserrorinfonote、または warning
Msg_text 情報メッセージ

このステートメントによって、チェックされたテーブルごとに多くの情報行が生成される場合があります。 最後の行には statusMsg_type 値が含まれ、Msg_text は通常 OK になります。 Table is already up to date は、そのテーブルのストレージエンジンがテーブルのチェックは必要ないと判断したことを示します。

バージョン互換性のチェック

FOR UPGRADE オプションは、指定されたテーブルが現在のバージョンの MySQL と互換性があるかどうかをチェックします。 FOR UPGRADE を指定すると、サーバーは各テーブルをチェックして、テーブルの作成後にそのテーブルのいずれかのデータ型またはインデックスで互換性のない変更が発生しているかどうかを判定します。 発生していない場合は、チェックが成功します。 それ以外で、非互換性の可能性がある場合、サーバーはそのテーブルに対して完全なチェックを実行します (これには、ある程度時間がかかることがあります)。

データ型のストレージフォーマットが変更されたか、またはそのソート順序が変更されたために非互換性が発生する可能性があります。 弊社の目的はそれらの変更を避けることですが、各リリースの間の非適合性よりもさらに深刻な問題を修正するために必要である場合もあります。

FOR UPGRADE は、次の非互換性を検出します:

  • InnoDB および MyISAM テーブルの TEXT カラム内の最後の領域のインデックス順序が MySQL 4.1 と 5.0 の間で変更されました。

  • 新しい DECIMAL データ型のストレージ方法が MySQL 5.0.3 と 5.0.5 の間で変更されました。

  • 文字セットまたは照合順序に対して、テーブルインデックスの再構築が必要な変更が加えられる場合があります。 このような変更の詳細は、セクション2.11.4「MySQL 8.0 での変更」 を参照してください。 テーブルの再構築の詳細は、セクション2.11.13「テーブルまたはインデックスの再作成または修復」 を参照してください。

  • MySQL 8.0 では、古いバージョンの MySQL で許可されている 2 桁の YEAR(2) データ型はサポートされていません。 YEAR(2) カラムを含むテーブルの場合、CHECK TABLE では、2 桁の YEAR(2) カラムを 4 桁の YEAR カラムに変換する REPAIR TABLE をお薦めします。

  • トリガー作成時間が保持されます。

  • 5.6.4 より前の形式 (TIMEDATETIME および TIMESTAMP カラムで小数秒精度をサポートしていない) の古い時間的カラムが含まれており、avoid_temporal_upgrade システム変数が無効になっている場合、テーブルは再構築が必要であると報告されます。 これは、MySQL のアップグレード手順で古い時間的カラムを含むテーブルを検出してアップグレードするのに役立ちます。 avoid_temporal_upgrade が有効な場合、FOR UPGRADE はテーブルに存在する古い時間的カラムを無視するため、アップグレード手順はそれらをアップグレードしません。

    このような時間的カラムを含み、再構築が必要なテーブルをチェックするには、CHECK TABLE ... FOR UPGRADE を実行する前に avoid_temporal_upgrade を無効にします。

  • 非ネイティブパーティション化は MySQL 8.0 で削除されるため、非ネイティブパーティション化を使用するテーブルに対して警告が発行されます。 第24章「パーティション化を参照してください。

データ一貫性のチェック

次のテーブルに、指定できるその他のチェックオプションを示します。 これらのオプションはストレージエンジンに渡されますが、これらのオプションは使用することも無視することもできます。

意味
QUICK 正しくないリンクをチェックするための行のスキャンを行いません。 InnoDB および MyISAM テーブルとビューに適用されます。
FAST 正しく閉じられていないテーブルのみを検査します。 InnoDB では無視されます。MyISAM のテーブルおよびビューにのみ適用されます。
CHANGED 最後のチェック以降に変更されたか、または正しく閉じられていないテーブルのみをチェックします。 InnoDB では無視されます。MyISAM のテーブルおよびビューにのみ適用されます。
MEDIUM 削除されたリンクが有効であることを検証するために行をスキャンします。 また、行のキーチェックサムも計算し、キーの計算されたチェックサムを使用してこれを検証します。 InnoDB では無視されます。MyISAM のテーブルおよびビューにのみ適用されます。
EXTENDED 行ごとにすべてのキーの完全なキールックアップを実行します。 これにより、テーブルの 100% の整合性が保証されますが、長い時間がかかります。 InnoDB では無視されます。MyISAM のテーブルおよびビューにのみ適用されます。

チェックオプションは、次の例のように組み合わせることができます。この例では、テーブルが正しく閉じられたかどうかを判定するために、そのテーブルに対してすばやいチェックを実行します。

CHECK TABLE test_table FAST QUICK;
注記

CHECK TABLE で、「破損」または「正しく閉じられていません」としてマークされているテーブルに問題が検出されない場合、CHECK TABLE によってマークが削除されることがあります。

テーブルが破損している場合、データ部分ではなくインデックスに問題がある可能性があります。 前のチェックタイプはすべて、インデックスを徹底的にチェックするため、ほとんどのエラーが見つかるはずです。

正常であると想定しているテーブルをチェックするには、チェックオプションまたは QUICK オプションを使用しません。 後者は、急いでおり、かつ QUICK でデータファイル内のエラーが見つからないという非常に小さなリスクを負える場合に使用するようにしてください。 (ほとんどの場合、通常の使用状況では、MySQL でデータファイル内のどのようなエラーも見つかります。 見つかった場合、そのテーブルは破損しているとしてマークされ、修復されるまで使用できなくなります。)

FAST および CHANGED は主に、テーブルを定期的にチェックするためにスクリプトから使用されます (たとえば、cron から実行されます)。 ほとんどの場合、FASTCHANGED より優先されます。 (優先されない唯一の場合は、MyISAM コード内にバグが見つかったのではないかと疑われるときです。)

EXTENDED は、通常のチェックを実行した後にのみ使用されますが、MySQL が行を更新しようとするか、キーで行を検索しようとすると、引き続きテーブルからエラーが発生します。 通常のチェックが成功した場合、これはめったに発生しません。

CHECK TABLE ... EXTENDED を使用すると、クエリーオプティマイザによって生成される実行計画に影響する可能性があります。

CHECK TABLE によってレポートされる次のいくつかの問題は、自動的には修正できません。

  • Found row where the auto_increment column has the value 0

    これは、AUTO_INCREMENT インデックスカラムに値 0 が含まれている行がテーブル内に存在することを示します。 (AUTO_INCREMENT カラムが 0 である行は、UPDATE ステートメントを使用してそのカラムを明示的に 0 に設定することによって作成できます。)

    これは、それ自体エラーではありませんが、そのテーブルをダンプしてリストアするか、またはそのテーブルに対して ALTER TABLE を実行しようとした場合に問題が発生する可能性があります。 この場合、AUTO_INCREMENT カラムはその AUTO_INCREMENT カラムのルールに従って値を変更するため、重複キーエラーなどの問題が発生する可能性があります。

    警告を取り除くには、UPDATE ステートメントを実行してカラムを 0 以外の値に設定します。

InnoDB テーブルに対する CHECK TABLE の使用上のノート

次の注意事項は、InnoDB テーブルに適用されます。

  • CHECK TABLE で破損したページが検出された場合、サーバーはエラー伝播を防ぐために終了します (Bug #10132)。 セカンダリインデックスで破損が発生しても、テーブルデータが読み取り可能な場合は、CHECK TABLE を実行するとサーバーが終了する可能性があります。

  • CHECK TABLE でクラスタインデックスに破損した DB_TRX_ID または DB_ROLL_PTR フィールドが検出されると、InnoDB が無効な undo ログレコードにアクセスし、MVCC 関連のサーバーが終了する可能性があります。

  • CHECK TABLE では、InnoDB のテーブルまたはインデックスでエラーが発生した場合、エラーがレポートされ、通常はインデックスがマークされ、場合によってはテーブルに破損のマークが付けられ、インデックスまたはテーブルをさらに使用できなくなります。 このようなエラーには、セカンダリインデックス内のエントリの数が正しくないか、リンクが正しくないなどがあります。

  • CHECK TABLE は、セカンダリインデックスで不正な数のエントリを検出した場合、エラーを報告しますが、サーバーの終了やファイルへのアクセスの防止は行いません。

  • CHECK TABLE はインデックスページの構造を調査してから、各キーエントリを調査します。 キーポインタをクラスタ化されたレコードに対して検証したり、BLOB ポインタのパスに従ったりはしません。

  • InnoDB テーブルが独自の .ibd file に格納されている場合、.ibd ファイルの最初の 3 つの pages には、テーブルまたはインデックスデータではなくヘッダー情報が含まれます。 CHECK TABLE ステートメントでは、ヘッダーデータにのみ影響する非一貫性は検出されません。 InnoDB .ibd ファイルの内容全体を検証するには、innochecksum コマンドを使用します。

  • 大規模な InnoDB テーブルで CHECK TABLE を実行する場合、CHECK TABLE の実行中に他のスレッドがブロックされることがあります。 タイムアウトを回避するために、CHECK TABLE 操作の場合は、セマフォー待機のしきい値 (600 秒) が 2 時間 (7200 秒) 延長されます。 InnoDB は、240 秒以上のセマフォ待機を検出すると、エラーログへの InnoDB モニター出力の出力を開始します。 ロックリクエストがセマフォ待機しきい値を超えると、InnoDB はプロセスを中断します。 セマフォ待機タイムアウトの可能性を完全に回避するには、CHECK TABLE のかわりに CHECK TABLE QUICK を実行します。

  • InnoDB SPATIAL インデックスの CHECK TABLE 機能には、R ツリーの妥当性チェックと、R ツリーの行数がクラスタインデックスと一致することを確認するチェックが含まれます。

  • CHECK TABLE では、InnoDB でサポートされている仮想生成カラムのセカンダリインデックスがサポートされます。

  • MySQL 8.0.14 では、InnoDB はクラスタ化されたパラレルインデックス読取りをサポートしているため、CHECK TABLE のパフォーマンスを向上させることができます。 InnoDB は、CHECK TABLE 操作中にクラスタ化されたインデックスを 2 回読み取ります。 2 番目の読取りはパラレルで実行できます。 パラレルクラスタインデックス読取りを実行するには、innodb_parallel_read_threads セッション変数を 1 より大きい値に設定する必要があります。 デフォルト値は 4 です。 パラレルクラスタインデックス読取りの実行に使用されるスレッドの実際の数は、innodb_parallel_read_threads 設定またはスキャンするインデックスサブツリーの数 (いずれか小さい方) によって決まります。

MyISAM テーブルに対する CHECK TABLE の使用上のノート

MyISAM テーブルには、次のノートが適用されます:

  • CHECK TABLE は、MyISAM テーブルの主要な統計を更新します。

  • CHECK TABLE 出力で OK または Table is already up to date が返されない場合は、通常、テーブルの修復を実行する必要があります。 セクション7.6「MyISAM テーブルの保守とクラッシュリカバリ」を参照してください。

  • QUICKMEDIUM または EXTENDED のいずれの CHECK TABLE オプションも指定されていない場合、動的書式 MyISAM テーブルのデフォルトのチェックタイプは MEDIUM です。 これにより、そのテーブルに対して myisamchk --medium-check tbl_name を実行したのと同じ結果が得られます。 また、CHANGED または FAST が指定されていないかぎり、静的フォーマットの MyISAM テーブルに対するデフォルトのチェックタイプも MEDIUM です。 指定されている場合、デフォルトは QUICK です。 CHANGED および FAST の場合、行はめったに破損しないため、行スキャンはスキップされます。