myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法

myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法

サーバーのデータベース ハード ディスク領域がいっぱいだったため、大量のデータの書き込みに失敗し、「キー 'username' のエントリが重複しています」というエラーが発生しました。

このような MySQL データベース エラーが発生した場合は、MySQL データベース インデックスに問題がある可能性があります。では、MySQL データベース インデックスとは何でしょうか?

分析: インデックスがプライマリまたは一意である場合、データ テーブル内のデータに対応するフィールドは、各レコードの一意性を保証する必要があります。そうしないとこのエラーが発生します。

これは通常、データベースへの書き込み時に発生します。たとえば、Discuz! 4.1 フォーラム プログラムでは、すべてのメンバーのユーザー名が一意であること、つまりユーザー名のインデックスが一意であることが求められます。このとき、既存のユーザー名レコードを cdb_members テーブルに強制的に挿入したり、レコードのユーザー名を既存のユーザー名に更新したりすると、このエラーが表示されます。

たとえば、あるネットユーザーの dedecms の Web サイトに問題が発生しました。そのサイトにアクセスすると、全画面にエラー メッセージが表示されました。MySQL ログを確認すると、次のようなエラー メッセージが表示されました。

テーブル .dedecmsv4dede_archives はクラッシュとしてマークされており、修復する必要があります

CMS 記事テーブル dede_archives が問題ありとしてマークされており、修復する必要があることが示されます。

そこで、すぐに履歴データを復元し、インターネットで原因を調べました。ついに問題は解決しました。

解決策は次のとおりです。

mysql インストール ディレクトリで bin/myisamchk ツールを見つけて、コマンド ラインに入力します。

myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI

次に、myisamchk ツールを使用してデータ テーブルのインデックスを復元します。 mysql を再起動すると問題は解決します。

次に、MySQL データベースを修復するには、通常、次の 2 つの方法で myisamchk ツールまたは mysqlcheck ツールを使用します。

1. myisamchk ツール

myisamchk を使用するには、MySQL サーバーを一時的に停止する必要があります。たとえば、discuz データベースを全面的に改修したいと考えています。次の操作を行います。

# service mysql stop (MySQLを停止します);

# myisamchk -r /データベースファイルの絶対パス/*MYI

# サービスmysql開始

myisamchk は、データ テーブル内のインデックス エラーを自動的にチェックして修復します。

2. mysqlcheckツール

mysqlcheck を使用すると、MySQL を停止する必要がなく、ホット フィックスが可能になります。手順は次のとおりです。

# mysqlcheck -r discuz.*

# service mysql stop (MySQLを停止します);

# myisamchk -r /データベースファイルの絶対パス/*MYI

# サービスmysql開始

myisamchk はデータ テーブル内のインデックス エラーを自動的にチェックし、修復します。

注意: myisamchk と mysqlcheck の両方で、修復を強制するために -f を使用しないでください。-f パラメータは、一般的な修復が失敗した場合に、問題を修復するために一部の誤ったデータを削除します。したがって、絶対に必要な場合を除いて -f を使用しないでください。

以下は他のネットユーザーからのコメントです

すべてのデータベースをチェックして修復します:

# mysqlcheck -A -o -r -p
パスワードを入力してください:
db1 大丈夫
db2 正常
db3 大丈夫
db4 大丈夫
......
......
......

指定されたデータベースを修復する

# mysqlcheck -o -r データベース名 -p

あなたはできる

コマンドの詳細:

mysqlcheck クライアントは MyISAM テーブルをチェックおよび修復できます。テーブルを最適化および分析することもできます。
mysqlcheck は myisamchk と同様に機能しますが、動作は異なります。主な違いは、mysqlcheck は mysqld サーバーが実行中の場合に使用する必要があり、myisamchk はサーバーが実行中でない場合に使用する必要があることです。 mysqlcheck を使用する利点は、テーブルをチェックまたは修復するためにサーバーを停止する必要がないことです。
MySQLcheck は、ユーザーが SQL ステートメント CHECK TABLE、REPAIR TABLE、ANALYZE TABLE、および OPTIMIZE TABLE を使用するための便利な方法を提供します。実行する操作で使用するステートメントを決定し、そのステートメントをサーバーに送信して実行します。
mysqlcheck を呼び出す方法は 3 つあります。

シェル> mysqlcheck [オプション] db_name [テーブル]
シェル> mysqlcheck [オプション] ---データベース DB1 [DB2 DB3...]
シェル> mysqlcheck [オプション] --all --database

テーブルが指定されていない場合、または --database または --all-database オプションが使用されている場合は、データベース全体がチェックされます。
他のクライアントと比較して、mysqlcheck には特別な機能があります。バイナリの名前を変更すると、チェックリスト (--check) のデフォルトの動作が変更される可能性があります。デフォルトでテーブルを修復できるツールが必要な場合は、mysqlcheck を mysqlrepair にコピーするか、シンボリック リンク mysqlrepair を使用して mysqlcheck にリンクします。 mysqlrepair を呼び出すと、コマンドに従ってテーブルを修復できます。

mysqlcheck のデフォルトの動作を変更するには、次の名前を使用できます。

mysql修復

デフォルトのオプションは--repairです

mysql分析
デフォルトのオプションは--analyzeです

mysql最適化
デフォルトのオプションは--optimizeです

mysqlcheck は次のオプションをサポートしています。
- -ヘルプ、 -?
ヘルプ メッセージを表示して終了します。
--すべての--データベース、-A
すべてのデータベース内のすべてのテーブルをチェックします。 --database オプションを使用する場合と同じですが、すべてのデータベースの名前がコマンド ラインで指定される点が異なります。
--オールインワン、-1
各テーブルに対して 1 つのステートメントを発行する代わりに、処理するデータベース内のすべてのテーブルを指定する 1 つのステートメントが各データベースに対して実行されます。
--分析、-a
分析表。
--自動修復
チェックされたテーブルが破損している場合は、自動的に修復されます。すべてのテーブルをチェックした後、必要な修復が自動的に実行されます。
--character-sets-dir=パス
文字セットがインストールされているディレクトリ。セクション5.10.1「データとソートの文字セット」を参照してください。
--チェック、-c
表にエラーがないか確認してください。
--変更のみチェック、-C
前回のチェック以降に変更されたテーブル、または適切に閉じられなかったテーブルのみがチェックされます。
--圧縮
クライアントとサーバー間で送信されるすべての情報を圧縮します (両方が圧縮をサポートしている場合)。
---データベース、-B
データベース内で指定されたすべてのテーブルを処理します。このオプションを使用すると、すべての文字列名引数はテーブル名ではなくデータベース名として扱われます。
---debug[=デバッグオプション], -#[デバッグオプション]
デバッグログを書き込みます。 debug_options 文字列は通常 'd:t:o,file_name' です。
--default-character-set=文字セット
charset をデフォルトの文字セットとして使用します。セクション5.10.1「データとソートの文字セット」を参照してください。
--拡張、-e
このオプションを使用してテーブルをチェックする場合、テーブルが 100% 一貫していることを確認できますが、時間がかかる場合があります。
このオプションを使用してテーブルを修復する場合、拡張修復を実行すると実行に長い時間がかかるだけでなく、大量のガベージ行も生成されます。
--高速、-F
適切に閉じられなかったテーブルのみがチェックされます。
--force、-f
SQL エラーが発生しても続行します。
--host=ホスト名、-h ホスト名
指定されたホスト上の MySQL サーバーに接続します。
--medium-check、-m
--extended よりも高速なチェックを実行します。エラーは 99.99% しか検出されないため、ほとんどの場合これで十分です。
--最適化、-o
テーブルを最適化します。
--password[=パスワード], -p[パスワード]
サーバーに接続するときに使用するパスワード。短いオプション形式 (-p) を使用する場合は、オプションとパスワードの間にスペースを入れないでください。コマンドラインの --password または -p オプションの後にパスワード値が指定されていない場合は、パスワードの入力を求められます。
--port=ポート番号、-P ポート番号
接続に使用する TCP/IP ポート番号。
--protocol={TCP | ソケット | パイプ | メモリ}
使用する接続プロトコル。
--クイック、-q
チェック テーブルでこのオプションを使用すると、チェックで行をスキャンして不正なリンクをチェックすることがなくなります。これが最も早く確認する方法です。
このオプションを使用してテーブルを修復する場合は、インデックス ツリーのみを修復しようとします。これが最も早い解決策です。
--修復、-r
一意の値が一意でない場合を除き、ほとんどの問題を修正する修正を実行します。
--サイレント、-s
サイレントモード。エラーメッセージのみが印刷されます。
--socket=パス、-S パス
接続に使用するソケット ファイル。
--テーブル
--database または -B オプションを上書きします。オプションに続くすべての引数はテーブル名として扱われます。
--user=ユーザー名, -u ユーザー名
サーバーに接続するときに使用する MySQL ユーザー名。
--詳細, -v
詳細モード。プログラム操作の各段階に関する情報を出力します。
--バージョン、-V
バージョン情報を表示して終了します。

以下もご興味があるかもしれません:
  • MySQLを監視するためのbinlogログ解析ツールの詳しい説明:Canal
  • データベース管理に役立つ 5 つの MySQL GUI ツール
  • MySQL監視ツールmysql-monitorの詳細な説明
  • ツールの構築と使用の詳細な紹介。Anemometer は MySQL のスローログをグラフィカルに表示します。
  • MySQL ストレステストツールの使い方
  • Pycharm ツールが MySQL データベースに接続できませんでした
  • MySQLデータ移行方法とツールの分析
  • MySQL データを誤って削除した場合の簡単な解決策 (MySQL フラッシュバック ツール)
  • KTLツールはMySQLからMySQLへのデータの同期方法を実現します
  • MySQL可視化ツールNavicatへの接続方法
  • MySQL関連のツールをいくつかお勧めします

<<:  Docker環境にJenkinsコンテナをインストールする詳細なチュートリアル

>>:  Apache Bench で Web ストレス テストを実装する方法

推薦する

親子コンポーネントの通信を解決するための3つのVueスロット

目次序文環境の準備カテゴリコンポーネントアプリのコンポーネント1. デフォルトスロット2. 名前付き...

Linux での mysql8.018 のインストールと設定のプロセスの詳細な説明

Windowsでのインストールの紹介:こちらもご覧ください –》WindowsでのMySQL 8.0...

vue $setは配列コレクションオブジェクトへの値の割り当てを実装します

Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...

CentOS7 64 ビットでの MySQL 5.7 のインストールと設定のチュートリアル

インストール環境: CentOS7 64ビットMINI版、MySQL5.7をインストール1. YUM...

Vue 親子コンポーネントの相互値の転送と呼び出し

目次1. 親が子コンポーネントに値を渡す2. 子コンポーネントが親コンポーネントに値を渡す3. 子コ...

HTML テーブル マークアップ チュートリアル (2): テーブル境界属性 BORDER

デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...

jQueryメソッド属性の詳細な説明

目次1. jQueryの紹介2. jQueryセレクター2.1 5つの基本セレクタ2.2 4種類の関...

SQL ストアド プロシージャの取得、データ取得、プロセス分析

この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...

JavaScriptで配列を作成する方法の詳細な説明

目次JavaScript で配列を作成する配列の使用配列を分割文字列に変換する配列に要素を追加する配...

myBatis で条件を削除する際のスプライシング問題を解決する

私は今日、mybatis を学び、データベースに対していくつかの簡単な追加、削除、変更、クエリを実行...

Zabbix による VMware Exsi ホストの監視のグラフィカルな手順

1. 仮想化 vcenter に入り、ブラウザでログインし (クライアントは設定する場所を見つけませ...

nginxを使用して取得したIPアドレスが127.0.0.1である問題を解決する

IPツールを取得 lombok.extern.slf4j.Slf4j をインポートします。 org....

シンプルな画像ドラッグ効果を実現する js

この記事では、簡単な画像ドラッグ効果を実現するためのjsの具体的なコードを参考までに紹介します。具体...

MySQLの重複排除操作を極限まで最適化する方法

目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...