ウェブページの復旧

たいていのことを雑文の方でばかりやっているので気がつかなかったのだが、自分のウェブページが壊れていることを指摘された。

ウェブページの方はMODxを使っているのだが、どうやらデータベースが壊れているみたい。

現象として何が起きてたかと言えば、ウェブページにPHPのエラーが出ている。いろいろ調べてみると、どうやらアクセスログのテーブルが壊れているようだ。多分、度重なるサーバクラッシュの時に破壊されたのだろう。テーブル実体のファイルがない。壊れているのはログのテーブルだけなのだが、PHPのエラーメッセージがページに出てしまうので、何からおかしげなことになる。

じゃあ問題のテーブルをdropしてcreateすりゃいいじゃないかということで、まずはdropする。ところが、本体のファイルが存在してないせいか、「そんなテーブルはない」ということで、drop出来ない。じゃあ知らんぷりしてcreateすりゃいいかと言えば、管理情報にはあるものだから、「既にテーブルがあるぞ」と言う。まぁありがち。

じゃあ何でもいいからファイルを作ってしまえと、touchして実体ファイルっぽい名前のファイルを作るのだが、今度は「内容がおかしい」旨のエラー。どうせ消すんだから名前なんてどーでもいーだろー。じゃあと言うので、適当な実体ファイルをcpしてファイルを作るとdrop出来た。

そこでcreateするのだが、今度はcreateが出来ない。

ERROR 1005 (HY000) at line 147: Can't create table './ogochan_modx/modx_log_access.frm' (errno: 121)

という謎のエラー。いろいろ調べると、外部制約のあるテーブルを「後から」作ることは出来ないらしい。つまり、「制約」があるのだから、

テーブルを作ってからデータを入れる

という、ごく当然のことを要求しているわけだ。まぁ確かにそうだろう。後からテーブルを作ることを許したら、制約されてないデータを許したことになってしまう。消す分には問題ないということも、これで納得。

とは言え、問題のテーブルがないことには始まらない。そこで何をやったかと言えば、

一度バックアップを取って、
「あるべき場所」にcreate tableを入れる

ということに。幸い、古いバックアップがあったので、「あるべき場所」はわかる。この「あるべき場所」は、テーブルやデータの依存関係は解決されているはずだ。

つまり、最新のバックアップを取得し、それをエディタで開いて、古いバックアップを見ながら、当該テーブルをcreateするように書き加えるわけだ。

ついでにテーブル管理情報とかおかしくなっていたので、一度データベース自体を削除して、バックアップを復元する。

無事、全てのテーブルが復旧して、問題解決。