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 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

このエラーは初心者によく発生します。この記事では主に、エラー 2003 (HY000): '...

MySQLが大量のデータを処理する際にクエリ速度を最適化するいくつかの方法

実際に参加したプロジェクトでは、MySQL テーブルのデータ量が数百万に達すると、通常の SQL ク...

CSS 標準: vertical-align プロパティ

<br />原文: http://www.mikkolee.com/13私は最近、ver...

Linux でファイルの権限 (所有権) を変更する

Linux と Unix はマルチユーザー オペレーティング システムであるため、ファイルの権限と所...

Linux (CentOS7) で RPM を使用して MySQL 8.0.11 をインストールするチュートリアル

目次1. インストールの準備1. Linux関連情報の表示(Linuxコマンドライン操作) 2. M...

VMware ESXi6.7 の簡単なセットアップ(画像とテキスト付き)

1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...

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

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...

MYSQL データベースの基礎 - 結合操作の原理

結合では、ネスト ループ結合アルゴリズムが使用されます。ネスト ループ結合には 3 つの種類がありま...

MySql キャッシュ クエリの原理とキャッシュ監視およびインデックス監視の概要

クエリキャッシュ1. クエリキャッシュの動作原理クエリ ステートメントを実行する前に、MySQL は...

コンテンツ領域の周囲を回転する CSS 動的グラデーション ボーダーの効果 (サンプル コード)

レンダリング ネットで関連情報を調べたところ、現在のダイナミックグラデーションボーダーの実装方法のほ...

HTML ユーザー登録ページ設定ソースコード

上記の Web ページをデザインします。 <!DOCTYPE html> <htm...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

アイデアを通じてプロジェクトをDockerにパッケージ化する方法

多くの友人が、Docker でプロジェクトを実行する方法をずっと知りたがっていました。今日は、自分の...

Linux が Sudo 権限昇格の脆弱性を公開、どのユーザーでも root コマンドを実行可能

Linux で最も一般的に使用される重要なユーティリティの 1 つである Sudo は、ほぼすべての...

設計仕様に準拠した設計は良い設計でしょうか?

これまでの数年間、私はいわゆる「設計仕様」についてかなりの数の執筆やコンサルティングを行ってきました...