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

Note

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

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

  • MySQLサーバーは書き込みの途中で停止します。

  • 外部プログラムは、サーバーによって同時に変更されているテーブルを変更します。

  • マシンが予期せずシャットダウンされます。

  • コンピューターのハードウェアが故障します。

  • MySQLコードのどこかにソフトウェアのバグがあります。

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

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

sudo systemctl stop mysql

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

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

バックアップを作成したら、テーブルが実際に破損しているかどうかを調査する準備が整います。 テーブルがMyISAM storage engineを使用している場合、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のドキュメントにいくつかのalternative methods for repairing corrupted tablesが示されています。

一方、破損したテーブルがInnoDB storage engineを使用している場合、それを修復するプロセスは異なります。 InnoDBは、バージョン5.5以降のMySQLのデフォルトのストレージエンジンであり、自動化された破損チェックおよび修復操作を備えています。 InnoDBは、読み取るすべてのページでチェックサムを実行することで破損したページをチェックし、チェックサムの不一致を検出すると、MySQLサーバーを自動的に停止します。

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

それを念頭に置いて、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エンジンよりもフォールトトレラントであることに注意してください。 InnoDBcanを使用しているテーブルは引き続き破損していますが、そのauto-recovery featuresにより、テーブルの破損やクラッシュのリスクは明らかに低くなっています。

Related