はじめに
MySQLは、データベースを分析および修復するためのいくつかの異なる方法を提供します。エラーや異常はさまざまな理由で発生しますが、その一部には次のようなものがあります。
- MySQLの更新またはダウングレード。
- インデックスまたはデータの急激な変化。
- テーブルの不整合。
破損したデータをチェックしてテーブルを修復する場合、エラーを修正するために実行する手順は、データベースへの接続方法、データベースサーバーの状態、エラーの種類、および使用するデータベースエンジンによって異なります。
この記事では、MySQLデータベースのトラブルシューティングと修復を行う複数の方法を紹介します。
前提条件
- root権限を持つターミナルまたはコマンドライン。
- MySQLバージョン8.0がインストールおよび構成されています。
- 破損したデータベースまたはデータベーステーブル。
MySQLテーブルのエラーをチェックする方法
診断の実行は、問題のトラブルシューティングの最初のステップです。 MySQLテーブルのエラーをチェックする方法は2つあります。
- MySQLを介して
CHECK TABLE
クエリ。 - ターミナルプログラムの使用
mysqlcheck
。
チェックテーブルでテーブルをチェック
チェックテーブル
クエリは、サービスの実行中にMySQLで機能します。一般的な使用法は次のとおりです。
CHECK TABLE <table name> [, table name, table name] [option] [option];
最も簡単な使用法は、オプションのない1つのテーブルです。
CHECK TABLE <table name>;
CHECK TABLE
の出力 クエリは、チェック結果に関する有益な表を示しています:
テーブルをチェックするときに使用できるオプションは次のとおりです。
アップグレード用
-バージョンの不整合を検出します。たとえば、MySQL 8.0は2桁の年をサポートしていないため、そのような値を含むテーブルにはアップグレードのマークが付けられます。クイック
-行のリンクが正しくないかどうかをチェックしません。これは、タイムアウトを回避するのに役立ちます。-
FAST
-適切に閉じられていないテーブルのチェックを実行します。 変更
-最後のチェック以降に変更があったテーブル、または正しく閉じられていないテーブルのみをチェックします。中
-テーブルの行をチェックして、削除されたリンクの有効性を確認し、行のチェックサムを実行します。拡張
-完全な整合性をチェックします。
オプションがない場合、 CHECK TABLE
MEDIUM
を実行します MyISAMのテーブルとビューを確認してください。 アップグレード用コード>
およびQUICK
他のオプションは無視されますが、InnoDBエンジンテーブルとビューのチェックを実行します。
オプションを組み合わせて、より詳細なチェックを行うこともできます。たとえば、テーブルが適切に閉じているかどうかをすばやく確認するには、次のコマンドを実行します。
CHECK TABLE <table name> FAST QUICK;
テーブルに適用されないオプションはすべて無視されます。
mysqlcheckを使用してテーブルをチェックする
mysqlcheck
commandは、 CHECK TABLE
のコマンドラインバージョンです。 。 MySQLサービスが動作している間、プログラムはターミナルで実行されます。チェックを実行するには:
1. rootユーザーとして、データベースが保存されているディレクトリに移動します。
sudo su
cd /var/lib/mysql
2.データベース全体を次のように確認します:
mysqlcheck <database name>
または、テーブル名も指定して、データベース内の特定のテーブルを確認します。
mysqlcheck <database name> <table name>
MySQLデータベースを修復する方法
MySQLでデータベースを修復する方法はいくつかあります。ただし、これらの方法は迅速な解決策ではなく、データが失われる可能性があることに注意してください。データベーステーブルが頻繁に破損している場合は、発生の理由を特定してください。
変更を加えて修復を開始する前に、ディレクトリのコピーを作成してください:
cp -rfv /var/lib/mysql /var/lib/mysql_copy
または、修復ソリューションを試す前に、データベースのバックアップバージョンを作成します。ガイドに従ってください:MySQLデータベースをバックアップおよび復元する方法。
以下に、MySQLデータベースを修復する方法の3つのオプションを示します。
REPAIRTABLEクエリを使用したMySQLデータベースの修復
問題のあるデータベースとテーブルをスキャンして特定した後、問題を修正する最も簡単な方法は、 REPAIR TABLE
を使用することです。 クエリ:
修復中にサーバーがシャットダウンした場合は、 REPAIR TABLE
を再実行してください サーバーが再起動したときの操作。同じテーブルで他の操作を実行する前に、必ずこれを実行してください。通常の状態では、MyISAMテーブルでこのメソッドを使用してもデータが失われることはありません。
MySQLデータベースをmysqlcheckで修復する
mysqlcheck コマンドは、ターミナルのデータベーステーブルを修復する代わりの方法です。
1.まず、rootユーザーとしてMySQLデータベースフォルダに移動します:
cd /var/lib/mysql
2. -r
を追加します mysqlcheck
のオプション データベーステーブルを修復するコマンド:
mysqlcheck -r <database> <table name>
mysqlcheck -r
コマンドは、 REPAIR TABLE
の最終バージョンです。 クエリ。
ALTERTABLEを使用したMySQLデータベースの修復
ALTER TABLE
を使用します 同じストレージエンジンを使用してテーブルを再構築するクエリ。たとえば、InnoDBテーブルがある場合は、次を実行します。
ALTER TABLE <table name> ENGINE = InnoDB;
MyISAMテーブルを再構築するには、次を使用します。
ALTER TABLE <table name> ENGINE = MyISAM;
テーブルが使用するストレージエンジンがわからない場合は、次のクエリを実行して調べてください。
SHOW CREATE TABLE <table name>;
MySQLデータベースに対するエンジン固有の診断と修復の実行
使用するデータベースエンジンに応じて、MySQLはデータベーステーブルを分析および修復するためのエンジン固有のアプローチを提供します。
MyISAMテーブルは破損する傾向があります。ただし、ほとんどの場合、エラーは簡単に修正できます。
InnoDBデータベースを操作する場合、チェックサム値が一致しないと破損が発生します。エラーは通常、停電またはその他のハードウェアの問題が原因で発生します。
myisamchkを使用したMyISAMテーブルの確認と修復
MySQLは、MyISAMテーブルに特定のチェッカーを提供します。
1.MySQLサーバーをシャットダウンします。ターミナルを開いて実行します:
systemctl mysql stop
2. rootユーザーとして、データベースの場所に移動します。
cd /var/lib/mysql/<database name>
3.特定のテーブルを確認するには、次を実行します。
myisamchk <table name>
4.次を実行してテーブルを修復します:
myisamchk --recover <table name>
5. MySQLサーバーを再起動します:
systemctl restart mysql
6.最後に、リカバリ後にMySQLのテーブルを確認します。
sudo mysql -u <user> -p <password>
USE <database name>;
SELECT * FROM <table name> LIMIT 4;
InnoDBリカバリプロセスの実行
MySQLのドキュメントでは、InnoDBデータベースに対してInnoDBリカバリプロセスを実行することを推奨しています。
1.お気に入りのテキストエディタを使用して、グローバル構成ファイルを見つけて開きます。 UbuntuおよびDebianシステムの場合、場所は次のとおりです。
cd /etc/mysql/my.cnf
2.次のオプションをmy.cnfに追加します ファイル:
[mysqld]
innodb_force_recovery=4
デフォルトでは、強制リカバリオプションは0(オフ)に設定され、最大6になります。すべての新しいレベルには、小さい数値のリカバリ機能が含まれています。
3.ファイルを保存して閉じます。
4. MySQLサーバーを再起動して、新しい構成ファイルが適用されることを確認します。
systemctl restart mysql
5.ホームフォルダで、 mysqldump
を使用してすべてのデータベースをバックアップファイルにエクスポートします コマンド:
sudo mysqldump --all-databases --add-drop-database --add-drop-table --routines > <file name>.sql
6. MySQLクライアントを起動し、影響を受けるすべてのデータベーステーブルを削除します。データベーステーブルを削除するには、次のことを試してください。
DROP TABLE IF EXISTS <table name>;
テーブルがドロップしない場合は、データベーステーブルを手動で削除してみてください。 rootユーザーとしてログインし、データベースがあるディレクトリに移動します。
sudo su
cd /var/lib/mysql/<database name>
データベーステーブルを削除します:
rm -r <table name>
7. MySQLサーバーを停止します:
systemctl stop mysql
8. my.cnfで ファイル、 innodb_force_recovery
をコメントアウトします 手順2で追加されたオプションで、リカバリモードを無効にします。次に、ファイルを保存して閉じます。
9. MySQLサーバーを再起動します:
systemctl start mysql
10.バックアップ.sqlからデータベースを復元します MySQLシェルのファイル。 MySQLクライアントにログインします:
sudo mysql -u <username> -p <password>
11.次のクエリを実行して、データベースをインポートします。
USE <database name>;
# Turning off auto commit is optional and speeds things up for larger databases
SET autocommit=0;
SOURCE <file name>.sql;
12.最後に、データベースをテストして、すべてが正しく機能することを確認します。そうでない場合は、バックアップからデータベースを復元し、別の方法を試してください。