開発者ドキュメント

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

場合によっては、MySQLテーブルが破損することがあります。これは、エラーが発生し、テーブル内に保持されているデータが読み取れないことを意味します。 破損したテーブルから読み取ろうとすると、通常、サーバーがクラッシュします。

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

テーブルの1つが破損していると思われる場合は、テーブルのトラブルシューティングまたは修正を試みる前に、データディレクトリのバックアップを作成する必要があります。 これは、データ損失のリスクを最小限に抑えるのに役立ちます。

まず、MySQLサービスを停止します。

  1. sudo systemctl stop mysql

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

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

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

  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は、バージョン5.5以降のMySQLのデフォルトのストレージエンジンであり、自動化された破損チェックと修復操作を備えています。 InnoDBは、読み取るすべてのページでチェックサムを実行することにより、破損したページをチェックし、チェックサムの不一致を検出すると、MySQLサーバーを自動的に停止します。

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

そのことを念頭に置いて、MySQLサービスを再起動して、サーバーへのアクセスが許可されるかどうかを確認してください。

  1. sudo systemctl restart mysql

サーバーがクラッシュしたままであるか、アクセスできない場合は、InnoDBのforce_recoveryオプションを有効にすると役立つ場合があります。 これを行うには、mysqld.cnfファイルを編集します。

  1. 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という名前を付けます。

  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 を使用するテーブルは引き続き破損する可能性がありますが、自動回復機能により、テーブルの破損とクラッシュのリスクは明らかに低くなります。

モバイルバージョンを終了