今朝、いつものように、スパムコメントのチェックもかねて、何気なくMovable Typeのコメント画面を見ると、コメントが1個も表示されません。突然コメントが全部削除されるわけもないので、とりあえずデータベース(MySQL)のバックアップをとって、調べてみようと思ったところ、mysqldumpでエラーが…
mysqldump: Error 1030: Got error 127 from table handler when dumping table `mt_comment` at row: 4591
ということで、ゴールデンウィーク明けの月曜早朝から、MySQLと格闘することになりました。
さっそくmysqlに入って調べてみると、
mysql> select * from mt_comment;
ERROR 1030: Got error 127 from table handler
しょうがないので、MySQLのマニュアルを見たところ
とあります。
ということで、まずmt.cgiを動かしているApacheを落として、flush tables
を実行し、テーブルをチェックしてみました。
mysql> check table mt_comment quick;
+--------------------+-------+----------+--------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+-------+----------+--------------------------------------------------------+
| xxxxxxx.mt_comment | check | warning | 4 clients is using or hasn't closed the table properly |
| xxxxxx.mt_comment | check | status | OK |
+--------------------+-------+----------+--------------------------------------------------------+
あやしいので、quickチェックからextendedに切り替えて再度。
mysql> check table mt_comment extended;
+--------------------+-------+----------+----------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+-------+----------+----------------------------------+
| xxxxxx.mt_comment | check | warning | Table is marked as crashed |
| xxxxxx.mt_comment | check | error | Found too long record at 2925500 |
| xxxxxx.mt_comment | check | error | Corrupt |
+--------------------+-------+----------+----------------------------------+
ということで、repairコマンドで、テーブルの修復を実行。
mysql> repair table mt_comment ;
+--------------------+--------+----------+-------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+--------+----------+-------------------------------------------------------+
| xxxxxx.mt_comment | repair | info | Found block with too small length at 2925500; Skipped |
| xxxxxx.mt_comment | repair | info | Found block with too small length at 3445396; Skipped |
| xxxxxx.mt_comment | repair | info | Wrong bytesec: 45-101-109 at 4124404; Skipped |
| xxxxxx.mt_comment | repair | warning | Number of rows changed from 23143 to 23112 |
| xxxxxx.mt_comment | repair | status | OK |
+--------------------+--------+----------+-------------------------------------------------------+
としたところ、あっさりと直りました。
DBが壊れた原因は、ちょっと究明しているヒマがないので、とりあえず放置。あとでログなどを見て解析しようと思っています(が、ヒマがあるかは不明です)。