[pgsql-jp: 39015] ウォームスタンバイサーバがフェイルーバーで起動しない

Nobuaki Inamura inamuran36 @ mahikari.or.jp
2007年 12月 25日 (火) 13:04:52 JST


稲村と申します。お世話になっております。
よろしくお願いいたします。

起きている問題は「ウォームスタンバイ構成にて、スタンバイまではうまくいくが
フェイルオーバさせるとデータベースが起動しない」という現象です。

以下の環境でウォームスタンバイ構成を構築中です。
ハード
 DELL SC830 (Pen4 2.8G,MEM:4G,HDD:300GB)×2
ソフト
 Debian4.1
 PostgreSQL8.2.5
  実行ファイル(/usr/local/pgsql/bin)
  クラスタ(/var/local/pgsql/data)
   ウォームスタンバイ用ログ(/var/local/pgsql/ws_log)

マスタ側で必要なpostgresql.conf内の設定は、
archive_command = 'cp -i %p /var/local/pgsql/ws_log'
archive_timeout = 600
としています。

スタンバイ側では上記の設定はコメントアウトしています。
あと、スタンバイ側ではリカバリコマンドが必要ですが、これにはPostgreSQL8.3beta4のcontribにある
pg_standbyを使用しました。

data内に置くrecovery.confの内容です。
restore_command = '/usr/local/pgsql/bin/pg_standby -l -t /tmp/failover.5432 /var/local/pgsql/ws_log %f %p'

ログの転送ですが、スタンバイ側の/var/local/pgsql/ws_logをnfsを使ってマスタ側の/var/local/pgsql/ws_logに
マウントしています。

ウェブページを参考にしながらスタンバイサーバを構築するまではよかったのですが、
いざ、フェイルオーバーさせようとするとPostgresサーバが起動しませんでした。

行った手順です。(データベースサーバの状態はマスタは起動、セカンダリは停止)
1.マスタ側で「select pg_start_backup('test')」を実行
2./var/local/pgsql以下にあるdata をバックアップ「tar cfz /tmp/backup.tar.gz data」
3.マスタ側で「select pg_stop_backup('')」を実行
4.スタンバイ側にbackup.tar.gzを転送
5.スタンバイ側で以下のコマンドを実行
 cd /var/local/pgsql
  tar xfz /tmp/backup.tar.gz
  rm -fr pg_xlog/*
  mkdir pg_xlog/archive_status
  rm postmaster.pid
6.セカンダリを起動

この手順で一応リカバリが開始されるところまではログにて確認しています。
2007-12-25 11:53:15 JST 9423 LOG:  database system was interrupted at 2007-12-25 11:52:59 JST
2007-12-25 11:53:15 JST 9423 LOG:  starting archive recovery
2007-12-25 11:53:15 JST 9423 LOG:  restore_command = "/usr/local/pgsql/bin/pg_standby -l -t /tmp/failover.57481 /var/local/pgsql
/ws_log %f %p"
2007-12-25 11:53:15 JST 9423 LOG:  restored log file "000000010000000000000093.00000068.backup" from archive
2007-12-25 11:53:15 JST 9423 LOG:  restored log file "000000010000000000000093" from archive
2007-12-25 11:53:15 JST 9423 LOG:  checkpoint record is at 0/93000068
2007-12-25 11:53:15 JST 9423 LOG:  redo record is at 0/93000068; undo record is at 0/0; shutdown FALSE
2007-12-25 11:53:15 JST 9423 LOG:  next transaction ID: 0/27664; next OID: 16399
2007-12-25 11:53:15 JST 9423 LOG:  next MultiXactId: 1; next MultiXactOffset: 0
2007-12-25 11:53:15 JST 9423 LOG:  automatic recovery in progress
2007-12-25 11:53:15 JST 9423 LOG:  redo starts at 0/930000B0
2007-12-25 11:55:35 JST 9423 LOG:  restored log file "000000010000000000000094" from archive
2007-12-25 11:58:16 JST 9423 LOG:  restored log file "000000010000000000000095" from archive

で、いざフェイルオーバーをさせようと、以下の手順を行いました。
1./tmp にfailover.5432ファイルを置いてリカバリ状態を停止させる。
2./tmp/failover.5432を削除
3./var/local/pgsql/data/recovery.confをrecovery.doneにリネーム
4.Postgresを起動

そうすると、どうやらWALがないおかしいということでサーバーが起動しません。
2007-12-25 12:00:54 JST 9454 LOG:  database system was interrupted while in recovery at log time 2007-12-25 11:57:58 JST
2007-12-25 12:00:54 JST 9454 HINT:  If this has occurred more than once some data may be corrupted and you may need to choose an
 earlier recovery target.
2007-12-25 12:00:54 JST 9454 LOG:  could not open file "pg_xlog/000000010000000000000095" (log file 0, segment 149): No such fil
e or directory
2007-12-25 12:00:54 JST 9454 LOG:  invalid primary checkpoint record
2007-12-25 12:00:54 JST 9454 LOG:  could not open file "pg_xlog/000000010000000000000093" (log file 0, segment 147): No such fil
e or directory
2007-12-25 12:00:54 JST 9454 LOG:  invalid secondary checkpoint record
2007-12-25 12:00:54 JST 9454 PANIC:  could not locate a valid checkpoint record
2007-12-25 12:00:54 JST 9451 LOG:  startup process (PID 9454) was terminated by signal 6
2007-12-25 12:00:54 JST 9451 LOG:  aborting startup due to startup process failure

そこで、バックアップをスタンバイサーバに転送、解凍した際に、WALを削除していた部分を
やめてみると何とかうまくいきました。(起動しました。)
(※リカバリモードになってすぐフェイルオーバーさせるとだめでした。少し待って1回でも
restoredされれば大丈夫でした。)

しかし、ウェブ上の解説をみると「rm pg_xlog」とか、「WALは不要」などと書いてあります。
解説どおり、pg_xlogを削除して正常動作する方法があるのか、私の設定が間違いや仕様上
よくない部分などをご指摘いただければと思います。

よろしくお願いいたします。


-- 
Nobuaki Inamura : inamuran36 @ mahikari.or.jp




pgsql-jp メーリングリストの案内