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により、テーブルの破損やクラッシュのリスクは明らかに低くなっています。