このページは機械翻訳したものです。
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
テーブルが独自の.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
出力で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
の場合、行はめったに破損しないため、行スキャンはスキップされます。