WordPress : データベース破損から復旧しました

WordPress

昨日、当ブログ「Hinemosu」のデータベース情報が破損し、一時的に繋がりにくい状態になっていました。

なんとか復旧することが出来たので、流れをメモっておこうと思います。

サーバ環境など

さくらのVPS 2GBにnginx + fast-cgi on Ubuntuで環境を構築。

WordPress 3.4.1-ja、自作テーマ、MySQL 5.1.63-0ubuntu0.10.04.1を使用。データベースはWordPress専用で、35MBほど使ってます。

使っているプラグインを羅列すると"Akismet"、"Disqus Comment System"、"Google XML Sitemaps"、"Jetpack by WordPress.com"、"MO Cache"、"Portable phpMyAdmin"、"Secure WordPress"、"Simple Login Lockdown"、"Stats API Key"、"SyntaxHighlighter Evolved"、"Theme-Check"、"Wordpress.com Stats Helper"、"WP-Cron Dashboard"、"WP-PageNavi"、"WP Memcached Manager"、"WP Multibyte Patch"、"WP Super Cache"の17個。

ドロップインのプラグインは、"advanced-cache.php"、"db-error.php"、"object-cache.php"、"APC Object Cache"となっています。

データベース破損の発生状況

うろ覚えの記憶を辿って、データベース破損の発生状況をメモっておくと…

  1. WordPress管理画面の「ユーザー」を開こうとしたところ、WordPressが無応答になる
  2. SSHで繋いでnginxを再起動して見るも状況に変化なし。
  3. VPSの管理コンソールからサーバ再起動を実行。
  4. WordPressがデータベース接続エラー(HTTP 503)を表示。以降、自然復旧せず。
  5. DB接続エラー中もnginxなど他サービスは動いている。

感覚的には「ユーザー」をマウスオーバーしたタイミングで発生したけど、実際の発生原因・タイミングは良く分かっていません。

データベース復旧までの流れ

データベース復旧までにやったことをツラツラとメモ。

ファイルのバックアップ

ファイルシステムは生きているので、SFTPでログインしファイルのバックアップを実行。

サーバ完全クラッシュなど、最悪の状況を考慮しつつ、下記の順にバックアップを行った。

  1. WP Super Cacheのキャッシュフォルダ
  2. WordPressのアップロードフォルダ
  3. サイト全体

キャッシュフォルダのバックアップは自分では気がつかなかった。アドバイスをくれた なつき( @Stocker_jp ) さんに感謝です。

mysqldump コマンドに失敗

mysqldump コマンドでデータベースのバックアップを試みるも、DB破損エラーが表示される

$ mysqldump DB_NAME -u USER -p > BACKUP_FILE
Enter password:
mysqldump: Got error: 144: Table './DB_NAME/wp_options' is marked as crashed and last (automatic?) repair failed when using LOCK TABLES

MySQLのREPAIR TABLEコマンドを実行

MySQLコンソールから、REPAIR TABLEコマンドを実行し、データベースの復旧を試みる。

$mysql -u USER -p
mysql> use DB_NAME
Database changed
mysql> repair table wp_options;
+--------------------+--------+----------+----------------------------------------+
| Table              | Op     | Msg_type | Msg_text                               |
+--------------------+--------+----------+----------------------------------------+
| DB_NAME.wp_options | repair | warning  | Number of rows changed from 433 to 429 |
| DB_NAME.wp_options | repair | status   | OK                                     |
+--------------------+--------+----------+----------------------------------------+
2 rows in set (0.04 sec)

mysql>

データベースが復旧したようだ!

その後の流れ

mysqldumpでデータベースをバックアップ。

なんだかWordPressの動きがおかしいので、試しにプラグインフォルダを削除したところ正常に動き始める。

1つずつプラグインを戻してみたが、不具合が再現しないので正常復旧と見なす。キャッシュが悪さしたのか?

あとがき

バックアップ重要。

定期的にバックアップを取っていれば、ここまで慌てることはなかったハズ。最近ちょっとバックアップをサボってたから、余計に慌ててしまったんだよね…

これを機に、cronなりWordPressプラグインを活用し、定期的にバックアップを取る習慣を付けようと思いました。