このセクションの説明では,MyISAM
テーブル(拡張子.MYI
および.MYD
)に対しmyisamchkを使用する方法について説明します。
さらに,检查表
および修理表
ステートメントを使用して,MyISAM
テーブルをチェックして修復することもできます。セクション13.7.2.2”检查表構文”およびセクション13.7.2.5“修理表構文”を参照してください。
破損したテーブルの兆候として,予期せずに中止するクエリーや次のような観察可能なエラーが含まれます。
が変更に対してロックされますtbl_name
.frmファイル
が見つかりません(エラーコード:tbl_name
.MYInnn
)。予期しないファイルの終わり
レコードファイルがクラッシュしました
テーブルハンドラからエラー
nnn
を取得します
エラーの詳細を取得するには,perrornnn
を実行します。ここで,nnn
はエラー番号です。次の例は,perrorを使用して,テーブルの問題を示すもっとも一般的なエラー番号の意味を見つける方法を示しています。
壳> perror 126 127 132 134 135 136 141 144 145 MySQL错误代码126 =索引文件是坠毁MySQL错误代码127 =记录文件是坠毁MySQL错误代码132 =老MySQL数据库文件错误代码134 =记录已经删除(或记录文件坠毁)MySQL错误代码135 =没有更多的空间在记录文件MySQL错误代码136 =没有更多的空间index file MySQL error code 141 = Duplicate unique key or constraint on write or update MySQL error code 144 = Table is crash and last repair failed MySQL error code 145 = Table was marked as crash and should be repair .索引文件MySQL错误代码141 =重复唯一键或约束写入或更新MySQL错误代码144 = Table is crash and last repair failed
エラー135(レコードファイルに空きがない)およびエラー136(インデックスファイルに空きがない)は,単純な修復で修正できるエラーではありません。この場合,ALTER TABLE
を使用して,MAX_ROWS
およびAVG_ROW_LENGTH
テーブルオプションの値を増やす必要があります。
ALTER TABLEtbl_nameMAX_ROWS =xxxAVG_ROW_LENGTH =多;
現在のテーブルオプション値が不明な場合は,显示创建表
を使用します。
その他のエラーの場合は,テーブルを修復する必要があります。myisamchkは通常発生するほとんどの問題を検出し,修正できます。
修復プロセスには,ここに示す最大4つのステージがあります。始める前に,場所をデータベースディレクトリに変更し,テーブルファイルの権限をチェックしてください。Unixでは,mysqldを実行するユーザーによって(およびチェックするファイルにアクセスする必要があるため,チェックするユーザーにも),それらが読み取り可能であることを確認します。ファイルを変更する必要があることが分かったら,それらに書き込みできる必要もあります。
このセクションでは,テーブルチェックが失敗した(セクション土壤质素”MyISAMテーブルのエラーのチェック方法”で説明しているものなど)場合,またはmyisamchkが提供する拡張機能を使用する場合について説明します。
テーブル保守に使用されるmyisamchkオプションについては,セクション4.6.3”myisamchk——MyISAMテーブルメンテナンスユーティリティー”で説明しています。myisamchkには,パフォーマンスを向上できるメモリー割り当てを制御するために設定できる変数もあります。セクション4.6.3.6”myisamchkメモリー使用量”を参照してください。
コマンド行からテーブルを修復する場合は,まずmysqldサーバーを停止する必要があります。リモートサーバーでmysqladmin关闭を実行すると,mysqladminが戻ったあとに,すべてのステートメント処理が停止し,すべてのインデックス変更がディスクにフラッシュされるまで,しばらくの間mysqldサーバーがまだ使用できることに注意してください。
ステージ1:テーブルのチェック
myisamchk *。MYIまたは時間があればmyisamchk - e *。MYIを実行します。- s
(サイレント)オプションを使用すると,不要な情報を抑制します。
mysqldサーバーが停止している場合は,——update-state
オプションを使用して,myisamchkにテーブルを「チェック済み」とマークするように指示してください。
myisamchkがエラーを報告しているテーブルだけを修復する必要があります。そのようなテーブルの場合,ステージ2に進みます。
チェック時に,予期しないエラー(内存不足
エラーなど)を受け取った場合,またはmyisamchkがクラッシュした場合,ステージ3へ進みます。
ステージ2:簡単で安全な修復
まずmyisamchk - r - qtbl_name
を試します(- r - q
は「クイックリカバリモード」を意味します)。これは,データファイルにアクセスせずに,インデックスファイルを修復しようとします。データファイルに,必要なすべてのものが含まれ,削除リンクがデータファイル内の正しい場所を指している場合,これは機能するはずであり,テーブルが修正されます。次のテーブルの修復を開始します。そうでない場合は,次の手順を使用します。
続行する前に,データファイルのバックアップを作成します。
myisamchk - r
tbl_name
を使用します(- r
は「リカバリモード」を意味します)。これによって,正しくない行と削除された行がデータファイルから削除され,インデックスファイルが再構築されます。先述のステップが失敗した場合,myisamchk——safe-recover
tbl_name
を使用します。安全なリカバリモードでは,通常のリカバリモードで扱われないわずかなケースを処理する古いリカバリ方法を使用します(ただし遅くなります)。
修復操作を大幅に高速化する場合,sort_buffer_size
およびkey_buffer_size
変数の値をそれぞれ,myisamchkの実行時に使用可能なメモリーの約25%に設定してください。
修復時に,予期しないエラー(内存不足
エラーなど)を受け取った場合,またはmyisamchkがクラッシュした場合,ステージ3へ進みます。
ステージ3:困難な修復
このステージに到達するのは,インデックスファイル内の最初の16 kバイトのブロックが破損しているか,誤った情報が含まれている場合,またはインデックスファイルが失われている場合に限られるはずです。この場合,新しいインデックスファイルを作成する必要があります。次のように実行します。
データファイルを安全な場所に移動します。
テーブル記述ファイルを使用して,新しい(空の)データファイルとインデックスファイルを作成します。
壳> mysqldb_namemysql >设置自动提交= 1;mysql >截断表tbl_name;mysql >退出
古いデータファイルを新しく作成したデータファイルにコピーします。(古いファイルを新しいファイルに単に移動しないでください。何か異常があった場合に備えて,コピーを保持する必要があります)。
レプリケーションを使用している場合,それにはファイルシステム操作が含まれ,これらはMySQLによって記録されないため,上記の手順を実行する前に,それを停止してください。
ステージ2に戻ります。myisamchk - r - qが機能するはずです。(これは無限ループにならないはずです)。
手順全体を自動的に実行する修理表
SQLステートメントを使用することもできます。tbl_name
USE_FRM修理表
を使用すると,サーバーがすべての作業を実行するため,ユーティリティーとサーバー間の不要なやり取りの可能性もなくなります。セクション13.7.2.5“修理表構文”を参照してください。
ステージ4:きわめて困難な修復
.frm
記述ファイルもクラッシュしている場合のみ,このステージに到達するはずです。記述ファイルはテーブルが作成されたあとに変更されないため,これが発生することはないはずです。
バックアップから記述ファイルをリストアし,ステージ3に戻ります。インデックスファイルをリストアし,ステージ2に戻ることもできます。後者の場合,myisamchk - rで起動してください。
バックアップがないが,テーブルの作成方法が正確にわかっている場合は,別のデータベースにテーブルのコピーを作成します。新しいデータファイルを削除して,ほかのデータベースから
.frm
記述ファイルと.MYI
インデックスファイルを,クラッシュしたデータベースへ移動します。これにより,新しい記述ファイルとインデックスファイルが得られますが,.MYD
データファイルはそのまま残ります。ステージ2に戻り,インデックスファイルの再構築を試みます。