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

*シリーズの一部:link:/ community / tutorial_series / how-to-troubleshoot-issues-in-mysql [MySQLの問題のトラブルシューティング方法] *

このガイドは、MySQLセットアップを診断する際のトラブルシューティングリソースおよび開始点として役立つことを目的としています。 多くのMySQLユーザーが遭遇する問題のいくつかを調べ、特定の問題のトラブルシューティングのガイダンスを提供します。 また、特定の場合に役立つ可能性のあるDigitalOceanチュートリアルおよび公式のMySQLドキュメントへのリンクも含めます。

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

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

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

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

  • マシンが突然シャットダウンします。

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

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

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

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

sudo systemctl stop mysql

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

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

バックアップを作成したら、テーブルが実際に破損しているかどうかの調査を開始できます。 テーブルがhttps://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html[MyISAM storage engine]を使用している場合、 `+ CHECK TABLE +`を実行することで破損しているかどうかを確認できますMySQLプロンプトからのステートメント:

CHECK TABLE ;

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

REPAIR TABLE ;

修復が成功したと仮定すると、出力に次のようなメッセージが表示されます。

Output+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| . | repair | status   | OK       |
+--------------------------+--------+----------+----------+

それでもテーブルが破損している場合、MySQLのドキュメントでは、https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html [破損したテーブルを修復するための代替方法]がいくつか提案されています。

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

InnoDBには、サーバーの再起動時にほとんどの問題を解決できるクラッシュリカバリメカニズムが備わっているため、InnoDBテーブルを修復する必要はほとんどありません。 ただし、破損したInnoDBテーブルを再構築する必要がある場合は、MySQLのドキュメントでhttps://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html#rebuilding- tables-dump-reload [「ダンプおよびリロード」メソッド]。 これには、破損したテーブルへのアクセスの回復が含まれます。`+ mysqldump + `ユーティリティを使用して、テーブルのhttps://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_logical_backup[logical backup]を作成し、テーブル構造とその中のデータを保持してから、テーブルをデータベースに再ロードします。

それを念頭に置いて、MySQLサービスを再起動して、サーバーにアクセスできるかどうかを確認してください。

sudo systemctl restart mysql

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

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

`+ [mysqld] +`セクションで、次の行を追加します。

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
[mysqld]
. . .

ファイルを保存して閉じてから、MySQLサービスを再起動してください。 破損したテーブルに正常にアクセスできる場合は、 `+ mysqldump `ユーティリティを使用してテーブルデータを新しいファイルにダンプします。 このファイルには好きな名前を付けることができますが、ここでは「 out.sql +」という名前を付けます。

mysqldump   > .sql

次に、データベースからテーブルを削除します。 MySQLプロンプトを再度開く必要を回避するために、次の構文を使用できます。

mysql -u  -p --execute="DROP TABLE ."

これに続いて、作成したダンプファイルでテーブルを復元します。

mysql -u  -p < .sql

InnoDBストレージエンジンは、通常、古いMyISAMエンジンよりもフォールトトレラントであることに注意してください。 InnoDBを使用するテーブルは引き続き破損しますが、https://dev.mysql.com/doc/refman/5.7/en/innodb-recovery.html [自動復旧機能]により、テーブルの破損とクラッシュのリスクが明らかになります。低い。

Related