CHECK TABLEtbl_name
[,tbl_name
] ... [option
] ...option
= {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
CHECK TABLE
はテーブルのエラーを確認します。CHECK
TABLE
は
MyISAM
、InnoDB
、そして
ARCHIVE
テーブルにのみ機能します。また、MySQL 5.1.9
からは、CHECK
TABLE
は CSV
テーブルに対しても有効になりました。The CSV
Storage Engine
を参照してください。MyISAM
テーブルに対しては、キー統計もまた更新されます。
CHECK TABLE
は、すでに存在していないビュー定義内で参照されるテーブルなどのような、ビューの問題も確認できます。
MySQL 5.1.27
からは、CHECK
TABLE
はパーティション化されたテーブルに対してもサポートされています。また、MySQL
5.1.27 からは、ALTER TABLE ...
CHECK PARTITION
を使用して 1
つ以上のパーティションを確認することもできます。詳細については、項8.1.7. 「ALTER TABLE
構文」
および Maintenance of Partitions
を参照してください。
CHECK TABLE
は、次のカラムを含む結果セットを返します。
カラム | 値 |
テーブル |
テーブル名 |
Op |
いつも check
|
Msg_type |
status 、error 、info 、または
warning の 1 つ |
Msg_text |
メッセージ |
ステートメントは各確認済テーブルにたくさんの情報行を作成する可能性があることに注意してください。最後の行は
status
の
Msg_type
値を持ち、Msg_text
は通常 OK
になります。もし OK
か Table is already up to
date
が得られなければ、通常はテーブルの修復を起動する必要があります。詳しくはMyISAM
Table Maintenance and Crash Recoveryを参照してください。Table
is already up to date
は、そのテーブルのストレージエンジンが、そのテーブルを確認する必要はないと指示しているという意味です。
FOR UPGRADE
オプションは、名づけられたテーブルが現在の
MySQL
バージョンと互換性があるか確認します。このオプションは
MySQL 5.1.7 で追加されました。サーバーは
FOR UPGRADE
を利用し、作成された時以降、各テーブルに対してデータ型やインデックスに互換性のない変更があったかどうかを確認します。もし無ければ、その確認は成功です。反対に、もし非適応性があれば、サーバーはテーブルに対して総確認を行います。(少々時間がかかります)。もし総確認が成功すれば、サーバーはテーブルの
.frm
ファイルに現在の MySQL
バージョン番号をマークします。.frm
ファイルをマークすることで、同じバージョンのサーバーによるそのテーブルの今後の確認が早くなることが保証されます。
データ型の格納フォーマットが変更されたか、そのソート順が変更されたために、非適合性が発生する可能性があります。私たちの目的はそれらの変更を避けることですが、時として各リリースの間に、非適合性よりもさらに深刻である問題を修正することの方が大切なこともあります。
現在は、FOR UPGRADE
でこれらの非適合性が見つかっています。
MySQL 4.1 と 5.0
の間で、InnoDB
と MyISAM
テーブルのための
TEXT
カラム内の最後の空白のインデックス順が変更されました。
新しい
DECIMAL
データ型の格納方法は MySQL 5.0.3 と 5.0.5
の間に変更されました。
MySQL 5.1.25
の時点では、テーブルが、現在実行中のバージョンとは異なるバージョンの
MySQL
サーバーによって作成されている場合、FOR
UPGRADE
によって、テーブルに互換性のないバージョンの
.frm
ファイルが含まれていることが示されます。この場合、CHECK
TABLE
によって返される結果セットには、Msg_type
値が error
で、Msg_text
値が
Table upgrade required.Please do
"REPAIR TABLE `
である行が含まれています。
tbl_name
`" to
fix it!
テーブルインデックスの再構築が必要なキャラクタセットまたは照合に変更が加えられる場合があります。これらの変更や、これらの変更が
FOR UPGRADE
によって検出される時期の詳細については、項2.12.3. 「テーブルインデックスを再作成する必要があるかどうかの確認」
を参照してください。
それ以外のチェックポイントは次のテーブルに表されています。これらのオプションは、ストレージエンジンに渡されます。ただし、そこで使用される場合と使用されない場合があります。MyISAM
では使用されますが、InnoDB
テーブルおよびビューに対しては無視されます。
型 | 意味 |
QUICK |
不正リンクの確認のために行をスキャンしないでください。 |
FAST |
正しく閉じられていないテーブルのみを確認する。 |
CHANGED |
最後の確認以降変更されたか、または正常に閉じられていないテーブルだけを確認してください。 |
MEDIUM |
削除されたリンクが有効であることを検証するために行をスキャンしてください。これは行のキーチェックサムも計算し、それをキーのために計算されたチェックサムを利用して検証します。 |
EXTENDED |
各行のすべてのキーに対して総キー参照を行ってください。これはテーブルが 100%整合性があることを保証しますが、時間がかかる作業です。 |
もし
QUICK
、MEDIUM
、または
EXTENDED
のどのオプションも指定されなければ、動的フォーマットである
MyISAM
テーブルのデフォルトの確認タイプは
MEDIUM
になります。これは、テーブル上で
myisamchk --medium-check
tbl_name
を実行するのと同じ結果になります。CHANGED
か FAST
が指定されないかぎり、静的フォーマットの
MyISAM
テーブルのデフォルトの確認タイプは、MEDIUM
です。その場合、デフォルトは
QUICK
です。行はめったに破壊されないので、CHANGED
と FAST
の行スキャンは省かれます。
テーブルが正しく閉じられているかどうかの確認のために簡単な確認を行っている次の例のように、確認オプションを組み合わせることも可能です。
CHECK TABLE test_table FAST QUICK;
場合によっては、CHECK
TABLE
によってテーブルが変更されます。これは、テーブルが
「corrupted」 や 「not closed
properly」
と印されているにも関わらず、CHECK
TABLE
がそのテーブル内に何の問題も発見できないときに起こります。この場合、CHECK
TABLE
はテーブルに OK
の印をつけます。
もしテーブルが破損すると、その問題はデータ部分ではなく、ほとんどインデックス内にあるでしょう。これまでに紹介されたすべての確認タイプはインデックスをくまなく確認するので、ほとんどのエラーを見つけることができるはずです。
もし OK
であると思われるテーブルを確認したければ、確認オプションは利用しない、または利用するのであれば
QUICK
オプションを利用しなければいけません。急いでいるため、QUICK
がデータファイル中に何のエラーも発見しないかもしれないという小さいリスクを負うことができる場合には、後者を利用してください。(ほとんどの場合、通常の利用条件下であれば、MySQL
はデータファイル中に何らかのエラーを発見するはずです。その場合、そのテーブルは
「corrupted」
と印が付けられ、修復されるまでは利用できなくなります)。
FAST
と
CHANGED
は、テーブルを頻繁に確認したい場合に、スクリプト
(たとえば、cron
から実行されるように)
から利用されるようになっています。ほとんどの場合、FAST
は CHANGED
より好まれます。MyISAM
コード内にバグを見つけた可能性がある場合のみ、この方法は好ましくありません)。
通常確認を起動したあとで、MySQL
が行を更新したりキーで行を見つけたりするときに、テーブルから変なエラーが発生する場合のみ
EXTENDED
が利用されます。これは通常確認が成功した場合は、めったに起こらないでしょう。
CHECK
TABLE ... EXTENDED
を使用すると、クエリーオプティマイザによって生成される実行プランに影響を与える場合があります。
CHECK TABLE
によって報告されたいくつかの問題は自動的に修復されません。
Found row where the
auto_increment column has the value 0
.
つまり、テーブル内に、AUTO_INCREMENT
インデックスカラムに値 0
が含まれている行が存在します。(UPDATE
ステートメントを使用してカラムを 0
に明示的に設定することによって、AUTO_INCREMENT
カラムが 0
である行を作成することが可能です。)
これ自体はエラーではないのですが、このテーブルを一度ダンプしそれを復旧させる、またはテーブル上に
ALTER TABLE
を実行することを決めたときに問題を引き起こします。この場合、AUTO_INCREMENT
カラムは、重複キーエラーのような問題を引き起こす可能性がある
AUTO_INCREMENT
カラムの規則に従って値を変更します。
警告を除去するには、カラム値を 0
以外の値に設定するために
UPDATE
ステートメントを実行してください。
CHECK TABLE
で InnoDB
テーブルの問題が検索された場合は、エラーの伝播を回避するためにサーバーが停止します。エラーの詳細は、エラーログに書き込まれます。