MySQL/MariaDB テーブル破損の修復

投稿者: | 6月 3, 2020

MySQLやMariaDBを運用していると、ログファイルに次のようなテーブル破損のメッセージが記録される場合があります。

200603 11:36:12 [ERROR] /usr/libexec/mysqld: Table './dbname/tablename' is marked as crashed and should be repaired

WordPressのサイトではプラグインの更新のタイミングでテーブルの整合性がとれなくなりテーブルが破損するケースもあるようです。
このままではデータベースのデータが壊れる可能性がありますので、以下のような手順でテーブルを修復します。

破損テーブルの確認

破損したテーブルを確認するには mysqlコンソールで次のコマンドを実行します。

mysql> use dbname
mysql> check table `tablename`;
+------------------+-------+----------+-----------------------------------------------------------+
| Table            | Op    | Msg_type | Msg_text                                                  |
+------------------+-------+----------+-----------------------------------------------------------+
| dbname.tablename | check | warning  | Table is marked as crashed                                |
| dbname.tablename | check | warning  | 10 clients are using or haven't closed the table properly |
| dbname.tablename | check | error    | Record at pos: 613364 is not remove-marked                |
| dbname.tablename | check | error    | record delete-link-chain corrupted                        |
| dbname.tablename | check | error    | Corrupt                                                   |
+------------------+-------+----------+-----------------------------------------------------------+
5 rows in set (0.00 sec)

破損したテーブルの修復と確認

テーブルの状況が確認できたら、以下のコマンドでテーブルを修復します。

mysql> repair table `tablename`;
+------------------+--------+----------+----------------------------------------+
| Table            | Op     | Msg_type | Msg_text                               |
+------------------+--------+----------+----------------------------------------+
| dbname.tablename | repair | warning  | Number of rows changed from 499 to 500 |
| dbname.tablename | repair | status   | OK                                     |
+------------------+--------+----------+----------------------------------------+
2 rows in set (0.03 sec)

テーブルの修復(リペア)が完了したら、もう一度テーブルの状態を確認します。

mysql> check table `tablename`;
+------------------+-------+----------+----------+
| Table            | Op    | Msg_type | Msg_text |
+------------------+-------+----------+----------+
| dbname.tablename | check | status   | OK       |
+------------------+-------+----------+----------+
1 row in set (0.00 sec)

破損したテーブルが修復されると、ステータスがOKになります。
これでMySQL/MariaDBで破損したテーブルを修復し、通常運用にもどります。