ErogameScapeでは待機系のサーバーで1日1回pg_dumpでバックアップをとって、さくらインターネットに借りているサーバーに転送しています。
ErogameScapeのサーバーがある場所が災害でつぶれても、私が生きていれば復旧可能です。

※さくらインターネットが同時につぶれることも想定して、一ヶ月に一回実家にデータをバックアップしたDVDを送っています。そのDVDをお父さんが貸金庫に預けているので、私が生きていれば…データ的には一ヶ月くらいの巻き戻りで済みます。問題は私が死んだ場合、どうしようかなあ…というところです。私のバックアップが必要なので、私が死んでもErogameScapeを運用できるマニュアルが必要だと今思いました…そういえば人間RAID - うんこめもな記事を読んだことを思い出ました。1人で運用しているサービスは、何かあったときにどうするかを考えているのか知りたいなあ…と思いました。

さて、そのバックアップが実はできていないことが先日分かりました。

※分かった契機は、PHP5.4でもErogameScapeは動くのか?の検証をするために、VMwareに検証環境を構築していたときでした。バックアップのデータをリストアしてみたら、nobodyの権限でDBに接続できませんでした。接続できない理由は、そもそもテーブルに権限が設定されていなかったからでした。バックアップしたデータは圧縮されているので、バックアップを取り直してみたら、 以下に記載するエラーを吐いてバックアップがちゃんとされていないことが分かりました。

pg_dumpを実行すると以下のメッセージを出力しました。
pg_dump: SQLコマンドが失敗しました
pg_dump: サーバのエラーメッセージ: ERROR:  missing chunk number 0 for toast value 47801904 in pg_toast_28652299
pg_dump: 次のコマンドでした: COPY public.serch_word_his (category, word, media, "timestamp") TO stdout;
pg_dump: *** エラーのため中断

googleで検索すると
PostgreSQL - admin - missing chunk number 0 for toast value
で、REINDEXすればよさそう的なことが書いてありました。

[ap2@erogamescape15 ~]$ psql
psql (9.0.10)
"help" でヘルプを表示します.
ap2=# select reltoastrelid::regclass from pg_class where relname = 'serch_word_his';
       reltoastrelid
----------------------------
 pg_toast.pg_toast_28652299
(1 行)

ap2=# reindex table pg_toast.pg_toast_28652299 ;
REINDEX
ap2=# \q
以上で、無事バックアップがとれるようになりました。

恐ろしいのは、バックアップはcronで仕掛けてとっているので全然エラーに気がつかなかったことと、バックアップが中途半端にとれてしまっているので、ファィルがそれなりの日付で生成されていて気がつかなかったことでした。

バックアップが中途半端なので、ファイルサイズがあきらかに以前より小さくなっていた(今は500MBくらいなのですが、失敗していたファイルは半分の250MBくらいでした)ので、そこで気がつけていなければいけなかった気がするのですが、ちょっと難易度高いなあと思いました。

 バックアップはcronで、そのままpg_dumpコマンドを叩いているのですが、pg_dumpコマンドの応答を見て、失敗しているようだったら通知する仕組みに変えないといけないなあと思いした。