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 ストレス テストを実装する方法

推薦する

MySQL 5.7.18 winx64 のインストールと設定方法のグラフィックチュートリアル

圧縮パッケージのインストールは、mysql-5.7 以降、大幅に変更されました。この記事では、mys...

CSS3のwebkit-box-reflectを巧みに使用して、さまざまな動的効果を実現します。

かなり前の記事で、 -webkit-box-reflectプロパティについて説明しました。リフレクシ...

Alibaba Cloud ECS サーバーの開始プロセス (初心者必読のチュートリアル)

1. Alibaba Cloudは、個人のニーズに応じて適切なクラウドサーバーを選択し、CPU、メ...

Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

目次前面に書かれた要件分析 v1アイデア1: インターセプションメソッドを使用して入力ボックスの入力...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

JavaScriptはパスワードボックスの検証情報を実装します

この記事では、パスワードボックスの検証情報を実装するためのJavaScriptの具体的なコードを例と...

Linux での MySQL データベースのマスター スレーブ同期レプリケーション構成

Linux での MySQL データベースのマスター/スレーブ同期構成の利点は、この方法をバックアッ...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

Jenkins の紹介と Docker で Jenkins をデプロイする方法

1. 関連概念1.1 Jenkins の概念: Jenkins は、使用されるプラットフォームに関係...

Dockerのネットワークモードと設定方法

1. Dockerネットワークモードdocker run が Docker コンテナを作成するときに...

Zabbix を使用して Oracle データベースを監視する方法の詳細な説明

1. 概要Zabbix は非常に強力で、最も広く使用されているオープンソースの監視ソフトウェアです。...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

CSS を使用して等アスペクト比のアダプティブ コンテナを実装する方法

最近、モバイル ページを開発しているときに、ページの幅が 100% の場合、高さは幅の半分になり、携...

MySQL 5.7 の同時レプリケーションにおける暗黙のバグの分析

序文当社の MySQL オンライン環境のほとんどはバージョン 5.7.18 を使用しています。このバ...

JS でシンプルな画像カルーセル効果を実現

この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...