pg_rmanの挙動

追記(2014.02.19):バグのようです。1.2.2から紛れ込んだ模様。開発者に連絡してもらったので、そのうち直るでしょう


ドキュメントと違う挙動をしているように見える。
私の解釈が間違っているのか、使い方が間違っているのか?

ドキュメントの記述を抜粋。

  1. archive mode(アーカイブWAL): アーカイブWALのみのバックアップ
  2. incremental mode(増分バックアップ): 最新の検証済みバックアップの開始以降に変更のあったファイル・ページのみをバックアップします。


だけど、手元環境ではどちらもまったく同じで、アーカイブWALと変更ファイルの両方が保存される

基本データ

実験環境。

pg_rman 1.2.7

因みに1.2.0も1.2.3も同じだった。

[postgres@localhost ~]$ env | grep BACKUP_PATH
BACKUP_PATH=/home/postgres/backup_archives

[postgres@localhost ~]$ cat $BACKUP_PATH/pg_rman.ini

ARCLOG_PATH='/home/postgres/wal_archives'
postgresql 9.3.0

postgresql.conf

wal_level = hot_standby
archive_mode = on
archive_command = 'cp %p /home/postgres/wal_archives/%f'

log_destination = 'stderr'
logging_collector = on

archive modeの挙動

まずはarchiveモード。

[postgres@localhost ~]$ pg_rman backup --backup-mode=archive -D /usr/local/pgsql/data/ -d template1
[postgres@localhost ~]$ pg_rman validate

[postgres@localhost ~]$ pg_rman show
============================================================================
Start                Time   Total    Data     WAL     Log  Backup   Status  
============================================================================
2014-02-18 04:15:43    0m    ----    ----    33MB    ----    33MB   OK
2014-02-18 04:00:13    0m    27MB    ----    83MB    ----   109MB   OK

ドキュメントから期待するのは、archive log領域だけコピーしてくるだけども、データベースクラスタの(更新された)テーブルデータファイルもコピーしている。

[postgres@localhost ~]$ find backup_archives/20140218/041543/
backup_archives/20140218/041543/
backup_archives/20140218/041543/arclog
backup_archives/20140218/041543/arclog/000000010000000000000007
backup_archives/20140218/041543/arclog/000000010000000000000006
backup_archives/20140218/041543/arclog/000000010000000000000007.00000028.backup
backup_archives/20140218/041543/backup.ini
backup_archives/20140218/041543/database
backup_archives/20140218/041543/database/base
backup_archives/20140218/041543/database/base/16384
backup_archives/20140218/041543/database/base/16384/16385 <== このファイルが何故、バックアップされるのか?
backup_archives/20140218/041543/database/base/12891
backup_archives/20140218/041543/database/base/12896
backup_archives/20140218/041543/database/base/1
backup_archives/20140218/041543/database/pg_twophase
backup_archives/20140218/041543/database/pg_log
backup_archives/20140218/041543/database/pg_notify
backup_archives/20140218/041543/database/pg_snapshots
backup_archives/20140218/041543/database/pg_tblspc
backup_archives/20140218/041543/database/pg_tblspc/16388
backup_archives/20140218/041543/database/pg_tblspc/16388/PG_9.3_201306121
backup_archives/20140218/041543/database/pg_tblspc/16388/PG_9.3_201306121/16384
backup_archives/20140218/041543/database/pg_multixact
backup_archives/20140218/041543/database/pg_multixact/members
backup_archives/20140218/041543/database/pg_multixact/offsets
backup_archives/20140218/041543/database/global
backup_archives/20140218/041543/database/global/pg_control
backup_archives/20140218/041543/database/pg_xlog
backup_archives/20140218/041543/database/pg_serial
backup_archives/20140218/041543/database/backup_label
backup_archives/20140218/041543/database/pg_subtrans
backup_archives/20140218/041543/database/pg_stat
backup_archives/20140218/041543/database/pg_stat_tmp
backup_archives/20140218/041543/database/pg_clog
backup_archives/20140218/041543/database/pg_clog/0000
backup_archives/20140218/041543/mkdirs.sh
backup_archives/20140218/041543/file_arclog.txt
backup_archives/20140218/041543/srvlog
backup_archives/20140218/041543/file_database.txt

incremental mode の挙動

次にincrementalモード。

[postgres@localhost ~]$ pg_rman backup --backup-mode=incremental -D /usr/local/pgsql/data/ -d template1
INFO: database backup start
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
[postgres@localhost ~]$ pg_rman validate
INFO: validate: 2014-02-18 04:27:39 backup and archive log files by CRC
[postgres@localhost ~]$ pg_rman show
============================================================================
Start                Time   Total    Data     WAL     Log  Backup   Status  
============================================================================
2014-02-18 04:27:39    0m    ----    24kB    33MB    ----    33MB   OK
2014-02-18 04:15:43    0m    ----    ----    33MB    ----    33MB   OK
2014-02-18 04:00:13    0m    27MB    ----    83MB    ----   109MB   OK

こっちは、変更のあったテーブルと、archive log領域がコピーされている。
つまり、archiveモードとincrementalモードは同じ挙動を示す!?

[postgres@localhost ~]$ find backup_archives/20140218/042739/
backup_archives/20140218/042739/
backup_archives/20140218/042739/arclog
backup_archives/20140218/042739/arclog/000000010000000000000009
backup_archives/20140218/042739/arclog/000000010000000000000008
backup_archives/20140218/042739/arclog/000000010000000000000009.00000028.backup
backup_archives/20140218/042739/backup.ini
backup_archives/20140218/042739/database
backup_archives/20140218/042739/database/base
backup_archives/20140218/042739/database/base/16384
backup_archives/20140218/042739/database/base/16384/16385
backup_archives/20140218/042739/database/base/12891
backup_archives/20140218/042739/database/base/12896
backup_archives/20140218/042739/database/base/1
backup_archives/20140218/042739/database/pg_twophase
backup_archives/20140218/042739/database/pg_log
backup_archives/20140218/042739/database/pg_notify
backup_archives/20140218/042739/database/pg_snapshots
backup_archives/20140218/042739/database/pg_tblspc
backup_archives/20140218/042739/database/pg_tblspc/16388
backup_archives/20140218/042739/database/pg_tblspc/16388/PG_9.3_201306121
backup_archives/20140218/042739/database/pg_tblspc/16388/PG_9.3_201306121/16384
backup_archives/20140218/042739/database/pg_multixact
backup_archives/20140218/042739/database/pg_multixact/members
backup_archives/20140218/042739/database/pg_multixact/offsets
backup_archives/20140218/042739/database/global
backup_archives/20140218/042739/database/global/pg_control
backup_archives/20140218/042739/database/pg_xlog
backup_archives/20140218/042739/database/pg_serial
backup_archives/20140218/042739/database/backup_label
backup_archives/20140218/042739/database/pg_subtrans
backup_archives/20140218/042739/database/pg_stat
backup_archives/20140218/042739/database/pg_stat_tmp
backup_archives/20140218/042739/database/pg_clog
backup_archives/20140218/042739/database/pg_clog/0000
backup_archives/20140218/042739/mkdirs.sh
backup_archives/20140218/042739/file_arclog.txt
backup_archives/20140218/042739/srvlog
backup_archives/20140218/042739/file_database.txt

ソース

backup.cをザックリ見ると、

if (current.backup_mode < BACKUP_MODE_FULL) {

とか

        if (current.backup_mode == BACKUP_MODE_FULL)
        {
                delete_online_wal_backup();
		delete_arclog_link();
        }


などなど、fullバックアップの記述はあるけども、incrementとarchiveの違いを生み出すはずの条件式が見当たらない。もっともgrepでcurrent.backup_modeを調べた限りだが。

archiveとincrementの違いがでるのは唯一、showコマンドだが、それは単にオプションとして保存しているから表示が異なるだけ。実際にバックアップ処理を行っているbackup.cの中では扱いに違いがない。

上の実験結果をもとにソースを眺めたから、なんらかの先入観があるのかもしれないが、どうもおかしい。


この挙動は、手元で実験する限りver1.2.0ver1.2.3から。それ以前のバージョンはコンパイルできないので試せない。

さて、どうなっているんでしょう?