MySQLで破損したテーブルを修正する方法
場合によっては、MySQLテーブルが破損することがあります。これは、エラーが発生し、テーブル内に保持されているデータが読み取れないことを意味します。 破損したテーブルから読み取ろうとすると、通常、サーバーがクラッシュします。
テーブルが破損する一般的な原因は次のとおりです。
- MySQLサーバーは書き込みの途中で停止します。
- 外部プログラムは、サーバーによって同時に変更されているテーブルを変更します。
- マシンが予期せずシャットダウンしました。
- コンピュータのハードウェアに障害が発生します。
- MySQLコードのどこかにソフトウェアのバグがあります。
テーブルの1つが破損していると思われる場合は、テーブルのトラブルシューティングまたは修正を試みる前に、データディレクトリのバックアップを作成する必要があります。 これは、データ損失のリスクを最小限に抑えるのに役立ちます。
まず、MySQLサービスを停止します。
sudo systemctl stop mysql
次に、すべてのデータを新しいバックアップディレクトリにコピーします。 Ubuntuシステムでは、デフォルトのデータディレクトリは/var/lib/mysql/
です。
cp -r /var/lib/mysql /var/lib/mysql_bkp
バックアップを作成したら、テーブルが実際に破損しているかどうかを調査する準備が整います。 テーブルがMyISAMストレージエンジンを使用している場合、MySQLプロンプトからCHECK TABLE
ステートメントを実行することで、テーブルが破損しているかどうかを確認できます。
CHECK TABLE table_name;
このステートメントの出力に、破損しているかどうかを知らせるメッセージが表示されます。 MyISAMテーブルが実際に破損している場合は、通常、REPAIR TABLE
ステートメントを発行して修復できます。
REPAIR TABLE table_name;
修復が成功したと仮定すると、出力に次のようなメッセージが表示されます。
Output+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+
ただし、テーブルがまだ破損している場合は、MySQLのドキュメントに、破損したテーブルを修復するためのいくつかの代替方法が示されています。
一方、破損したテーブルが InnoDBストレージエンジンを使用している場合、それを修復するプロセスは異なります。 InnoDBは、バージョン5.5以降のMySQLのデフォルトのストレージエンジンであり、自動化された破損チェックと修復操作を備えています。 InnoDBは、読み取るすべてのページでチェックサムを実行することにより、破損したページをチェックし、チェックサムの不一致を検出すると、MySQLサーバーを自動的に停止します。
InnoDBは、サーバーの再起動時にほとんどの問題を解決できるクラッシュリカバリメカニズムを備えているため、InnoDBテーブルを修復する必要はほとんどありません。 ただし、破損したInnoDBテーブルを再構築する必要がある状況が発生した場合、MySQLのドキュメントでは、「ダンプとリロード」メソッドの使用を推奨しています。 これには、破損したテーブルへのアクセスを回復し、mysqldump
ユーティリティを使用してテーブルの論理バックアップを作成し、テーブル構造とその中のデータを保持してから、テーブルをリロードすることが含まれます。データベースに戻ります。
そのことを念頭に置いて、MySQLサービスを再起動して、サーバーへのアクセスが許可されるかどうかを確認してください。
sudo systemctl restart mysql
サーバーがクラッシュしたままであるか、アクセスできない場合は、InnoDBのforce_recovery
オプションを有効にすると役立つ場合があります。 これを行うには、mysqld.cnf
ファイルを編集します。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
セクションに、次の行を追加します。
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . [mysqld] . . . innodb_force_recovery=1
ファイルを保存して閉じてから、MySQLサービスを再起動してみてください。 破損したテーブルに正常にアクセスできる場合は、mysqldump
ユーティリティを使用して、テーブルデータを新しいファイルにダンプします。 このファイルには好きな名前を付けることができますが、ここではout.sql
という名前を付けます。
mysqldump database_name table_name > out.sql
次に、データベースからテーブルを削除します。 MySQLプロンプトを再度開く必要がないように、次の構文を使用できます。
mysql -u user -p --execute="DROP TABLE database_name.table_name"
これに続いて、作成したダンプファイルを使用してテーブルを復元します。
mysql -u user -p < out.sql
InnoDBストレージエンジンは、通常、古いMyISAMエンジンよりもフォールトトレラントであることに注意してください。 InnoDB を使用するテーブルは引き続き破損する可能性がありますが、自動回復機能により、テーブルの破損とクラッシュのリスクは明らかに低くなります。