MySQLで破損したテーブルを修復する方法

はじめに

時々、MySQLのテーブルは破損することがあります。これはエラーが発生し、それらに格納されたデータが読み取れなくなったことを意味します。破損したテーブルからの読み取りを試みると、通常、サーバーがクラッシュすることになります。

テーブルが破損する一般的な原因は次のとおりです:

  • The MySQL server stops in middle of a write.
  • An external program modifies a table that’s simultaneously being modified by the server.
  • The machine is shut down unexpectedly.
  • The computer hardware fails.
  • There’s a software bug somewhere in the MySQL code.

もしテーブルの一つが破損している可能性があるのであれば、トラブルシューティングやテーブルの修復を試みる前に、データディレクトリのバックアップを作成するべきです。これにより、データの損失リスクを最小限に抑えることができます。

最初に、MySQLサービスを停止してください。

  1. sudo systemctl stop mysql

 

Note

注意:Rocky Linuxなどの一部のプラットフォームでは、MySQLサービスは「mysqld」と呼ばれる場合があります。

新しいバックアップディレクトリにすべてのデータをコピーしてください。Ubuntuシステムでは、デフォルトのデータディレクトリは/var/lib/mysql/です。

  1. cp -r /var/lib/mysql /var/lib/mysql_bkp

 

バックアップを作成した後、実際にテーブルが破損しているかどうか調査する準備が整いました。テーブルがMyISAMストレージエンジンを使用している場合、MySQLを再起動し、MySQLプロンプトからCHECK TABLEステートメントを実行することで、破損しているかどうかを確認できます。

  1. sudo systemctl start mysql

 

  1. CHECK TABLE table_name;

 

このステートメントの出力には、メッセージが表示され、そのステートメントが破損しているかどうかを知らせます。もしもMyISAMテーブルが実際に破損している場合、通常はREPAIR TABLEステートメントを発行することで修復することができます。

  1. REPAIR TABLE table_name;

 

修理が成功した場合、出力には以下のようなメッセージが表示されます。

Output

+————————–+——–+———-+———-+ | Table | Op | Msg_type | Msg_text | +————————–+——–+———-+———-+ | database_name.table_name | repair | status | OK | +————————–+——–+———-+———-+

もしテーブルがまだ破損している場合は、MySQLのドキュメンテーションには破損したテーブルを修復するためのいくつかの代替手法が示されています。

それに対して、破損したテーブルがInnoDBストレージエンジンを使用している場合、修復するプロセスは異なります。InnoDBはMySQLのデフォルトのストレージエンジンであり、バージョン8.0以降では自動的な破損チェックと修復操作が可能です。InnoDBは、読み込んだすべてのページに対してチェックサムを実行して破損したページを検出し、チェックサムの不一致があれば自動的にMySQLサーバーを停止します。

InnoDBテーブルの修復が必要な場合はほとんどありません。InnoDBはクラッシュ回復機構を備えており、サーバーを再起動することでほとんどの問題を解決できます。ただし、破損したInnoDBテーブルを再構築する必要が生じる場合は、「ダンプとリロード」メソッドを使用することをMySQLのドキュメントで推奨しています。これには、破損したテーブルへのアクセスを回復し、mysqldumpユーティリティを使用してテーブルの論理バックアップを作成し、テーブルの構造とデータを保持したままデータベースにテーブルを再ロードするという手順が含まれます。

それを踏まえて、MySQLサービスを再起動してみてください。そうすれば、サーバーへのアクセスが可能になるかどうか確認できます。

  1. sudo systemctl restart mysql

 

もしサーバーがクラッシュしたままもしくはアクセス不能な場合、InnoDBのforce_recoveryオプションを有効にすると役立つかもしれません。これはmysqld.cnfファイルを編集することで行えます。UbuntuやDebianシステムでは、このファイルは通常、etc/mysqlにあります。Red HatやRockyシステムでは、このファイルは通常、/etc/my.cnf.dにあります。

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

 

「[mysqld]」セクションに、以下の行を追加してください。

/etc/mysql/mysql.conf.d/mysqld.cnfの日本語への文言は「/etc/mysql/mysql.conf.d/mysqld.cnf」です。
. . .
[mysqld]
. . .
innodb_force_recovery=1

ファイルを保存して閉じ、MySQLサービスを再起動してください。もし破損したテーブルにアクセスできた場合は、mysqldumpユーティリティを使用してテーブルデータを新しいファイルにダンプしてください。ファイル名は自由に設定できますが、ここではout.sqlと名付けましょう。

  1. mysqldump database_name table_name > out.sql

 

その後、データベースからテーブルを削除してください。MySQLのプロンプトを再度開かなくてもよいように、以下の構文を使用することができます。

  1. mysql -u user -p –execute=“DROP TABLE database_name.table_name

 

この後、作成したダンプファイルを使用してテーブルを復元してください。

  1. mysql -u user -p < out.sql

 

InnoDBストレージエンジンは、古いMyISAMエンジンよりも一般的に耐障害性が高いことに注意してください。InnoDBを使用するテーブルも破損する可能性がありますが、自動回復機能のおかげでテーブルの破損やクラッシュのリスクは著しく低下しています。

コメントを残す 0

Your email address will not be published. Required fields are marked *


广告
広告は10秒後に閉じます。
bannerAds