導入
MySQLテーブルが破損すると、エラーが発生し、テーブルに保存されているデータを読み取れなくなることがあります。破損したテーブルからデータを読み取ろうとすると、通常、サーバーがクラッシュします。.
テーブル破損の一般的な原因は次のとおりです。
- MySQL サーバーが書き込みの途中で停止します。.
- 外部アプリケーションが、サーバーによって同時に変更されているテーブルを変更します。.
- デバイスの電源が予期せずオフになります。.
- コンピュータのハードウェアが故障します。.
- MySQL コードのどこかにソフトウェア バグがあります。.
テーブルのいずれかが破損していると思われる場合は、トラブルシューティングやテーブルの修復を行う前に、データリストをバックアップしてください。これにより、データ損失のリスクを軽減できます。.
まず、MySQL サービスを停止します。
sudo systemctl stop mysql次に、すべてのデータを新しいバックアップフォルダにコピーします。Ubuntuシステムの場合、デフォルトのデータディレクトリは/var/lib/mysql/です。
cp -r /var/lib/mysql /var/lib/mysql_bkpバックアップを取得したら、テーブルが実際に破損しているかどうかを確認できます。テーブルがMyISAMストレージエンジンを使用している場合は、MySQLを再起動し、MySQLプロンプトからCHECK TABLE文を実行することで破損の有無を確認できます。
sudo systemctl start mysqlCHECK 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 ドキュメントに示されています。.
一方、破損したテーブルがInnoDBストレージエンジンを使用している場合、修復プロセスは異なります。InnoDBはMySQLバージョン8.0以降のデフォルトのストレージエンジンであり、自動破損チェックと修復機能を備えています。InnoDBは、読み取るすべてのページでチェックサムを実行して破損ページをチェックし、照合順序の不一致が見つかった場合はMySQLサーバーを自動的に停止します。.
InnoDBにはクラッシュリカバリメカニズムが搭載されており、サーバーの再起動時にほとんどの問題を解決できるため、InnoDBテーブルの修復が必要になることは稀です。しかし、破損したInnoDBテーブルを再構築する必要がある場合は、MySQLのドキュメントでは「ダンプとリロード」方式の使用を推奨しています。この方式では、破損したテーブルへのアクセスを復元し、mysqldumpユーティリティを使用してテーブル構造とデータを保持する論理バックアップを作成し、その後、テーブルをデータベースにリロードします。.
これを念頭に置いて、MySQL サービスを再起動して、サーバーにアクセスできるかどうかを確認します。
sudo systemctl restart mysqlサーバーがダウンしているかアクセスできない場合は、InnoDBのforce_recoveryオプションを有効にすると効果的です。mysqld.cnfファイルを編集することで設定できます。UbuntuおよびDebianシステムでは、このファイルは通常etc/mysqlにあります。Red HatおよびRockyシステムでは、このファイルは通常/etc/my.cnf.dにあります。.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] セクションに次の行を追加します。
. . .
[mysqld]
. . .
innodb_force_recovery=1ファイルを保存して閉じ、MySQLサービスを再起動します。破損したテーブルに正常にアクセスできる場合は、mysqldumpユーティリティを使用してテーブルデータを新しいファイルにダンプします。このファイルには任意の名前を付けることができますが、ここではdump.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.sqlInnoDBストレージエンジンは、従来のMyISAMエンジンよりも一般的にフォールトトレランスが高いことに注意してください。InnoDBを使用したテーブルが破損する可能性は依然としてありますが、自己修復機能により、テーブルの破損や障害のリスクは大幅に低減されます。.









