myisamchkで破損したMySQLテーブルを修正する

MyISAMは、メイン(つまり、InnoDBとともに)MySQL DBMSのデータストレージシステムの1つです。 同時に、MyISAMテーブルは非常に簡単に破損します-これに問題はありません。 すべての損傷を排除することはより困難ですが、これは非常に迅速に行うこともできます。 この記事では、myisamchkを使用して問題を解決し、MyISAMの問題を特定して修正する方法について説明します。

MySQLでテーブルを作成すると、3つの異なるファイルが作成されることはよく知られています。* .frm-テーブル形式、* .MYD(MyData)-データストレージ、* .MYI(MyIndex)-インデックス。 大規模なデータベースでは、InnoDBを使用する必要があります。これは、Oracleおよび対応する機能とある程度の類似性があるためです。

エラーを示す例として、これを使用します。

undef error - DBD::mysql::db selectrow_array failed: Table 'attach_data' is marked as crashed and should be repaired [for Statement "SELECT LENGTH(thedata) FROM attach_data WHERE id = ?"] at Bugzilla/Attachment.pm line 344 Bugzilla::Attachment::datasize('Bugzilla::Attachment=HASH(0x9df119c)') called 


attach_dataテーブルが破損しており、修正する必要があることは明らかです。 myisamchkを使用してテーブルを修正します。

1. myisamchkを使用して、破損したすべてのテーブルを定義します



 # myisamchk /var/lib/mysql/bugs/*.MYI >> /tmp/myisamchk_log.txt myisamchk: error: Wrong bytesec: 0-0-0 at linkstart: 18361936 MyISAM-table 'attach_data.MYI' is corrupted Fix it using switch "-r" or "-o" myisamchk: warning: 1 client is using or hasn't closed the table properly MyISAM-table 'groups.MYI' is usable but should be fixed myisamchk: warning: 1 client is using or hasn't closed the table properly MyISAM-table 'profiles.MYI' is usable but should be fixed 


一時ファイルでmyisamchkの出力を指定すると、破損したテーブルの名前のみが表示されます。 ただし、ファイル/tmp/myisamchk_log.txtでは、無傷のテーブルの名前を含む、より多くのデータが示されます。

 Checking MyISAM file: user_group_map.MYI Data records: 182 Deleted blocks: 0 - check file-size - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 


2. myisamchkを使用して破損したテーブルを修正する



これを行うには、以下に示すように-rオプションを付けてmyisamchkを使用します。

 # myisamchk -r profiles.MYI - recovering (with sort) MyISAM-table 'profiles.MYI' Data records: 80 - Fixing index 1 - Fixing index 2 


エラーメッセージがここに表示される場合があります。クライアントがテーブルを使用している、またはテーブルが適切に閉じられていない場合、アプリケーションまたは他のテーブルでテーブルが使用されている場合。 このエラーを回避するには、テーブルの修正を開始する前にmysqldを完了することをお勧めします。 ここでFLUSH TABLESを使用できます。

3. MySQLデータベース全体に対してチェックと修正を実行します



 # myisamchk --silent --force --fast --update-state /var/lib/mysql/bugs/*.MYI myisamchk: MyISAM file /var/lib/mysql/bugs/groups.MYI myisamchk: warning: 1 client is using or hasn't closed the table properly myisamchk: MyISAM file /var/lib/mysql/bugs/profiles.MYI myisamchk: warning: 1 client is using or hasn't closed the table properly 


-s:エラーのみを出力します。 double -s -sを使用して、モードを可能な限り静かにすることができます。
-f:-rオプションを使用してmyisamchkを自動的に再起動します。エラーが検出されます。
-F:通常モードで閉じられなかったテーブルのみをチェックします。
-U:エラーが検出された場合、テーブルを破損としてマークします。

4.大規模なMySQLデータベースに追加のメモリを使用する



大規模なデータベースで作業する場合、リカバリには数時間かかる場合があります。 追加のリソースがある場合、それらを使用してプロセスを高速化できます。


 # myisamchk --silent --force --fast --update-state \ --key_buffer_size=512M --sort_buffer_size=512M \ --read_buffer_size=4M --write_buffer_size=4M \ /var/lib/mysql/bugs/*.MYI 


5. myisamchkを使用してテーブルデータを取得する



必要に応じて、非常に多くのデータを取得できます。

 # myisamchk -dvv profiles.MYI MyISAM file: profiles.MYI Record format: Packed Character set: latin1_swedish_ci (8) File-version: 1 Creation time: 2007-08-16 18:46:59 Status: open,changed,analyzed,optimized keys,sorted index pages Auto increment key: 1 Last value: 88 Data records: 88 Deleted blocks: 0 Datafile parts: 118 Deleted data: 0 Datafile pointer (bytes): 4 Keyfile pointer (bytes): 4 Datafile length: 6292 Keyfile length: 6144 Max datafile length: 4294967294 Max keyfile length: 4398046510079 Recordlength: 2124 table description: Key Start Len Index Type Rec/key Root Blocksize 1 2 3 unique int24 1 1024 1024 2 5 765 unique char packed stripped 1 2048 4096 Field Start Length Nullpos Nullbit Type 1 1 1 2 2 3 no zeros 3 5 765 no endspace 


6.すべてのmyisamchkオプション



チームに関する追加情報を取得するには、ヘルプを使用する必要があります。

#myisamchk --help

一般的なオプション:

-s:エラー出力のみ。
-v:詳細情報を出力します。
-V:バージョンの出力と出力。
-w:テーブルがロックされるまで待機します。

検証オプション:

-c:テーブルのエラーをチェックします。
-e:非常に「粗い」チェック。 通常モードでエラーが検出されない場合、最後の手段としてのみ使用する必要があります。
-F:クイックチェック。正しく閉じられなかったテーブルのみがチェックされます。
-C:最後のチェック以降に変更されたテーブルのみをチェックします。
-f:-rオプションを使用してmyisamchkを自動的に再起動します。エラーが検出されます。
-i:チェックされたテーブルの統計を出力します。
-m:軽量検証モード、通常より高速、99.99%のエラーが検出されます。
-U:ステータスの更新:エラーが検出された場合、テーブルを破損としてマークします。
-T:テーブルをチェック済みとしてマークしません。

修正オプション:

-B:バックアップファイル.MYD、 "filename-time.BAK";
--correct-checksum;
-e:データファイルの最大行数の修正を試みます。 さらに、このコマンドはゴミ文字列を検索します。 状況が絶望的でない場合は、このコマンドを使用しないでください。
-f:古い一時ファイルを上書きします。
-r:実際には一意ではない一意のキーを除くほとんどすべてを修正します。
-n:一時ファイルが非常に大きい場合でも強制的にソートします。
-o:古い回復方法を使用します。
-q:データファイルを変更せずに簡単に修正。
-u:myisampackによってパックされたファイルを解凍します。

Source: https://habr.com/ru/post/J257291/


All Articles