このページは機械翻訳したものです。
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE は、1 つまたは複数のテーブルをエラーがないかどうかチェックします。 CHECK TABLE はまた、ビューをチェックして、そのビュー定義で参照されているテーブルが存在しなくなっているなどの問題がないかどうかを調べることもできます。
テーブルをチェックするには、それに対する何らかの権限が必要です。
CHECK TABLE は、InnoDB、MyISAM、ARCHIVE、および 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 は、次のテーブルに示すカラムを含む結果セットを返します。
| カラム | 値 |
|---|---|
Table |
テーブル名 |
Op |
常に check
|
Msg_type |
status、error、info、note、または warning
|
Msg_text |
情報メッセージ |
このステートメントによって、チェックされたテーブルごとに多くの情報行が生成される場合があります。 最後の行には status の Msg_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 より前の形式 (
TIME、DATETIMEおよび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 から実行されます)。 ほとんどの場合、FAST は CHANGED より優先されます。 (優先されない唯一の場合は、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で破損したページが検出された場合、サーバーはエラー伝播を防ぐために終了します (Bug #10132)。 セカンダリインデックスで破損が発生しても、テーブルデータが読み取り可能な場合は、CHECK TABLEを実行するとサーバーが終了する可能性があります。CHECK TABLEでクラスタインデックスに破損したDB_TRX_IDまたはDB_ROLL_PTRフィールドが検出されると、InnoDBが無効な undo ログレコードにアクセスし、MVCC 関連のサーバーが終了する可能性があります。CHECK TABLEでは、InnoDBのテーブルまたはインデックスでエラーが発生した場合、エラーがレポートされ、通常はインデックスがマークされ、場合によってはテーブルに破損のマークが付けられ、インデックスまたはテーブルをさらに使用できなくなります。 このようなエラーには、セカンダリインデックス内のエントリの数が正しくないか、リンクが正しくないなどがあります。CHECK TABLEは、セカンダリインデックスで不正な数のエントリを検出した場合、エラーを報告しますが、サーバーの終了やファイルへのアクセスの防止は行いません。CHECK TABLEはインデックスページの構造を調査してから、各キーエントリを調査します。 キーポインタをクラスタ化されたレコードに対して検証したり、BLOBポインタのパスに従ったりはしません。InnoDBテーブルが独自の.ibdfile に格納されている場合、.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を実行します。InnoDBSPATIALインデックスの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出力でOKまたはTable is already up to dateが返されない場合は、通常、テーブルの修復を実行する必要があります。 セクション7.6「MyISAM テーブルの保守とクラッシュリカバリ」を参照してください。QUICK、MEDIUMまたはEXTENDEDのいずれのCHECK TABLEオプションも指定されていない場合、動的書式MyISAMテーブルのデフォルトのチェックタイプはMEDIUMです。 これにより、そのテーブルに対して myisamchk --medium-checktbl_nameを実行したのと同じ結果が得られます。 また、CHANGEDまたはFASTが指定されていないかぎり、静的フォーマットのMyISAMテーブルに対するデフォルトのチェックタイプもMEDIUMです。 指定されている場合、デフォルトはQUICKです。CHANGEDおよびFASTの場合、行はめったに破損しないため、行スキャンはスキップされます。