WAL まで試してみました

postgresql.conf を開いて、WAL をいじくってみる予定でしたが
気になって他の設定をいじくりまわしたいのをぐっとがまんしたけど
全文検索周りで、ランク付けやハイライト関数があったので
またまた横道にそれてしまいました。(やっぱりランク付け関数とか気になります)
でも、軌道修正して、WAL の扱いに戻ります。

  • WAL とアーカイブログを扱う、とりあえずの設定です。
#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------

# - Settings -

fsync = on                              # turns forced synchronization on or off
synchronous_commit = on         # immediate fsync at commit
wal_sync_method = fsync         # the default is the first option 
                                        # supported by the operating system:
                                        #   open_datasync
                                        #   fdatasync
                                        #   fsync
                                        #   fsync_writethrough
                                        #   open_sync
full_page_writes = on                   # recover from partial page writes
wal_buffers = 64kB                      # min 32kB
                                        # (change requires restart)
wal_writer_delay = 200ms                # 1-10000 milliseconds

commit_delay = 0                        # range 0-100000, in microseconds
commit_siblings = 5                     # range 1-1000

# - Checkpoints -

checkpoint_segments = 3         # in logfile segments, min 1, 16MB each
checkpoint_timeout = 5min               # range 30s-1h
checkpoint_completion_target = 0.5      # checkpoint target duration, 0.0 - 1.0
checkpoint_warning = 30s                # 0 is off

# - Archiving -

archive_mode = on               # allows archiving to be done
                                # (change requires restart)
archive_command = 'cp -i %p /mnt/server/archivedir/%f '         
# command to use to archive a logfile segment
archive_timeout = 0             # force a logfile segment switch after this
                                # time; 0 is off

基本的に、コメントアウトしただけで
アーカイブログをとってみたかったので
archive_mode と archive_command のみ書き換えました。


仕組み分科会でいただいた資料を照らし合わせながら

  • 更新時は、同期書き込みで data/pg_xlog にログの書き出し
  • psql 上で checkpoint; で data/base にログ書き出し
  • psql 上で select pg_switch_xlog(); で archive_command の実行

をポチポチを見ていました。


実は、cp -i %p /mnt/server/archivedir/%f が実行されなくてハマっていました。
原因は /mnt/server/archivedir に
postgres ユーザの書き込み権限の付与を忘れていたことです。
serverlog に表示されていたのですが(翌日に気づきました)
なかなか気づかず、すごく悩みました。
もうひとつ、psql で checkpoint; を実行するときに
; を付けずに、実行されなくて悩んでいました。(初心者すぎます)


ただ、WAL とアーカイブログのこのあたりの挙動は
先日の PostgreSQL しくみ勉強会で教えていただいたのでなんとか動きがつかめてます。


でも、あまり自分の理解に自信がないです。
PITR(Point In Time Recovery) をうまく動かして、今週中にはなんとか
オンラインリカバリのテストまで進めてみたいです。