mysqlでinnodbのindexが破損したらしい

mysqlで下のようなエラーが上がってしまった。なんかinnodbのindexが壊れてしまったらしい。

101126  8:40:35  InnoDB: Page checksum 2191097623, prior-to-4.0.14-form checksum
1133608065
InnoDB: stored checksum 407406258, prior-to-4.0.14-form stored checksum 11336080
65
InnoDB: Page lsn 27 2241249557, low 4 bytes of lsn at page end 2241249557
InnoDB: Page number (if stored to page already) 161913,
InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 192
InnoDB: Page may be an index page where index id is 517
InnoDB: (index "post_date" of table "wordpress"."wp_posts")
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 161913.
InnoDB: You may have to recover from a backup.
InnoDB: It is also possible that your operating
InnoDB: system has corrupted its own file cache
InnoDB: and rebooting your computer removes the
InnoDB: error.
InnoDB: If the corrupt page is an index page
InnoDB: you can also try to fix the corruption
InnoDB: by dumping, dropping, and reimporting
InnoDB: the corrupt table. You can use CHECK
InnoDB: TABLE to scan your table for corruption.
InnoDB: See also http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.
InnoDB: Ending processing because of a corrupt database page.

ググったけどなかなか良い情報にたどり着けない。
mysqldのインスタンスも死んでるから、drop index -> add indexとかもできなかった。

公式マニュアルを参考するとinnodb_force_recoveryオプションを付けて起動すると強制的に起動できるらしい。
この変数はレベルのようになっているらしくて、数字が高いほど強制度合いが高いらしい。
このオプションがついている間は他の更新を止めてくれるらしい。

で、my.cnfにオプションを書いて起動させる。 -> バッチリ起動する。
まずはインデックスを作り直そうと思ってdrop indexさせようとする。

mysql> ALTER TABLE `wordpress`.`wp_posts` DROP INDEX `type_date`;
ERROR 1031 (HY000): Table storage engine for 'wp_posts' doesn't have this option

と思ったら通らなかったです。
innodb_force_recoveryを4で起動してたから、1でならいけるかな、と思ったけどダメでした。
どうすれば良いのか分からなかったので適当にググると
Recovering Innodb table Corruption
というサイトが。
早速試してみる。


mysql> check table wordpress.wp_posts;
+--------------------------+-------+----------+-------------------------------------------------------+
| Table                    | Op    | Msg_type | Msg_text                                              |
+--------------------------+-------+----------+-------------------------------------------------------+
| wordpress.wp_posts       | check | Warning  | InnoDB: The B-tree of index 'post_date' is corrupted. |
| wordpress.wp_posts       | check | error    | Corrupt                                               |
+--------------------------+-------+----------+-------------------------------------------------------+
2 rows in set (1 min 19.67 sec)

mysql> optimize table wordpress.wp_posts;
+--------------------------+----------+----------+-------------------------------------------------------------------+
| Table                    | Op       | Msg_type | Msg_text                                                          |
+--------------------------+----------+----------+-------------------------------------------------------------------+
| wordpress.wp_posts       | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| wordpress.wp_posts       | optimize | error    | Got error -1 from storage engine                                  |
| wordpress.wp_posts       | optimize | status   | Operation failed                                                  |
+--------------------------+----------+----------+-------------------------------------------------------------------+
3 rows in set, 2 warnings (0.05 sec)

mysql> ANALYZE TABLE wordpress.wp_posts;
+--------------------------+---------+----------+----------+
| Table                    | Op      | Msg_type | Msg_text |
+--------------------------+---------+----------+----------+
| wordpress.wp_posts       | analyze | status   | OK       |
+--------------------------+---------+----------+----------+
1 row in set (0.01 sec)

ここまで来たけど結局直りませんでした。

コメントを残す