MySQL の壊れたテーブルを修復

MySQL の壊れたテーブルを修復

サーバーのエラーを検知したので確認してみると、mysql のログファイルに下記のようなエラーが出ていました。

どうやら WordPress で使用しているデータベースの wp_options というテーブルの読み込みでエラーが発生しているみたいです。

150102 23:20:17 [ERROR] Got error 127 when reading table './wordpress/wp_options'

 

調べてみると、テーブルが破損した可能性が高いらしい…

ということで、テーブルを修復する手順を紹介します。

※CUI 上で操作していますが、SQL 文さえ実行できればよいので、phpmyadmin 等でも修復可能です。

Mysql の破損したテーブルを修復

mysql にログイン

#mysql にログイン
sudo mysql -u root -p

 

データベースの選択

mysql>use wordpress;

 

エラーが出ている wp_options テーブルにアクセスします。

mysql> select * from wp_options;
ERROR 1194 (HY000): Table 'wp_options' is marked as crashed and should be repaired

やはり破損してそうです。

 

下記の SQL で、check します。

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

破損してますね。
下記の SQL で修復します。

mysql> repair table wp_options;
+--------------------------------+--------+----------+-------------------------------------------------------+
| Table                          | Op     | Msg_type | Msg_text                                              |
+--------------------------------+--------+----------+-------------------------------------------------------+
| wordpress.wp_options | repair | info     | Found block with too small length at 1405348; Skipped |
| wordpress.wp_options | repair | status   | OK                                                    |
+--------------------------------+--------+----------+-------------------------------------------------------+
2 rows in set (0.44 sec)

 

正常に修復できたか確認するため、念のためもう一度 check しておきます。

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

修復できたようです。

error ログも出なくなったので、解決できたようです。

 

なぜテーブルが破損したか

このエラーの発生時刻を鑑みると、どうやら WordPress の記事の編集中に httpd プロセスを停止してしまったのが原因として考えられそうです。しかも、httpd プロセスの停止後すぐにシステムを再起動してしまったので、そちらも原因として考えられそう。wp_options テーブルなので関係ない気もしますが、なんにせよ WordPress 上でなにか作業中に httpd プロセスやシステムを停止するのは NG ですね。(当たり前ですが…)