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 ですね。(当たり前ですが…)