pg_rmanを使ってみる

PostgreSQLのバックアップツールにpg_rmanがあります。今回はこれを使ってみることにします。
自分用作業メモです。

環境


今回の環境は以下の通りです。

  • CentOS6.5(64bit版)
  • PostgreSQL 9.3.4(RPM)
  • pg_rman 1.2.8(Source)

インストールする(PostgreSQL)


まずは、pgdgリポジトリの設定を行います。

# yum install http://yum.postgresql.org/9.3/redhat/rhel-6.5-x86_64/pgdg-centos93-9.3-1.noarch.rpm


PostgreSQLをインストールします。

# yum install postgresql93-server


自動起動設定をしておきます。

# chkconfig postgresql-9.3 on
# chkconfig --list postgresql-9.3
postgresql-9.3  0:off   1:off   2:on    3:on    4:on    5:on    6:off


データベースの初期化し、PostgreSQLを起動します。

# service postgresql-9.3 initdb
データベースを初期化中:                                    [  OK  ]
# service postgresql-9.3 start
postgresql-9.3 サービスを開始中:                          [  OK  ]

インストールする(pg-rman)


コンパイル時にいくつかヘッダファイルが必要になるので、事前にインストールしておきます。

# yum install postgresql93-devel zlib-devel libxml-devel pam-devel openssl-devel readline-devel


パスを通しておきます。今回はrootユーザでコンパイルします。環境変数を追加します。

export PATH=/usr/pgsql-9.3/bin:$PATH


pg-rmanはソースからインストールします。

# wget http://downloads.sourceforge.net/project/pg-rman/1.2.8/pg_rman-1.2.8.tar.gz
# tar -xvzf pg_rman-1.2.8.tar.gz
# cd pg_rman-1.2.8
# make USE_PGXS=1
# make USE_PGXS=1 install


postgresql.conf」に以下の設定を入れておきます。

wal_level = archive
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/9.3/arclog/%f'

バックアップしてみる


まずは初期化します。

$ pg_rman init -B /var/lib/pgsql/9.3/pg_rman/


設定ファイル類が作成されました。

$ ls /var/lib/pgsql/9.3/pg_rman/
backup  pg_rman.ini  timeline_history


pg_rman.iniを用意しておきます。


PGDATA = /var/lib/pgsql/9.3/data
ARCLOG_PATH = /var/lib/pgsql/9.3/arclog
SRVLOG_PATH = /var/lib/pgsql/9.3/data/pg_log
BACKUP_PATH = /var/lib/pgsql/9.3/pg_rman
BACKUP_MODE = FULL
COMPRESS_DATA = YES
KEEP_ARCLOG_FILES = 10
KEEP_ARCLOG_DAYS = 10
KEEP_DATA_GENERATIONS = 2
KEEP_DATA_DAYS = 14
SMOOTH_CHECKPOINT = YES


事前にデータベースを作成し、データを登録します。

$ psql
psql (9.3.4)
"help" でヘルプを表示します.

postgres=# create database test;
CREATE DATABASE
postgres=# \c test
データベース "test" にユーザ"postgres"として接続しました。
test=# create table test ( number int, name text );
CREATE TABLE
test=# insert into test ( number, name ) values ( 1, 'test1' );
INSERT 0 1
test=# insert into test ( number, name ) values ( 2, 'test2' );
INSERT 0 1
test=# insert into test ( number, name ) values ( 3, 'test3' );
INSERT 0 1
test=# insert into test ( number, name ) values ( 4, 'test4' );
INSERT 0 1


バックアップをします。

$ pg_rman backup --backup-mode=full --with-serverlog
INFO: database backup start
NOTICE:  pg_stop_backup が完了し、要求されたすべての WAL セグメントがアーカイブされました


取得したバックアップを検証します。

$ pg_rman validate
INFO: validate: 2014-06-08 15:32:26 backup and archive log files by CRC


バックアップ結果を表示する例です。

$ pg_rman show timeline
============================================================
Start                Mode  Current TLI  Parent TLI  Status  
============================================================
2014-06-08 15:32:26  FULL            1           0  OK
$ pg_rman show
============================================================================
Start                Time   Total    Data     WAL     Log  Backup   Status  
============================================================================
2014-06-08 15:32:26    0m    27MB    ----   167MB   2801B  7282kB   OK


次に差分バックアップを取得するためにデータを更新します。

$ psql
psql (9.3.4)
"help" でヘルプを表示します.

postgres=# \c test
データベース "test" にユーザ"postgres"として接続しました。
test=# create table test2 ( number int, name text );
CREATE TABLE
test=# insert into test2 ( number, name ) values ( 1, 'test1' );
INSERT 0 1
test=# insert into test2 ( number, name ) values ( 2, 'test2' );
INSERT 0 1
test=# insert into test2 ( number, name ) values ( 3, 'test3' );
INSERT 0 1
test=# insert into test2 ( number, name ) values ( 4, 'test4' );
INSERT 0 1


差分バックアップを取得します。

$ pg_rman backup --backup-mode=incremental --with-serverlog
INFO: database backup start
NOTICE:  pg_stop_backup が完了し、要求されたすべての WAL セグメントがアーカイブされました
$ pg_rman validate
INFO: validate: 2014-06-08 15:37:50 backup and archive log files by CRC


結果を確認します。

$ pg_rman show timeline
============================================================
Start                Mode  Current TLI  Parent TLI  Status  
============================================================
2014-06-08 15:37:50  INCR            1           0  OK
2014-06-08 15:32:26  FULL            1           0  OK

$ pg_rman show
============================================================================
Start                Time   Total    Data     WAL     Log  Backup   Status  
============================================================================
2014-06-08 15:37:50    0m    ----  1802kB    33MB      0B  2198kB   OK
2014-06-08 15:32:26    0m    27MB    ----   167MB   2801B  7282kB   OK

リストアしてみる


まずはデータベースを削除します。

postgres=# drop database test;
DROP DATABASE


PostgreSQLを停止します。


# service postgresql-9.3 stop
postgresql-9.3 サービスを停止中:                           [  OK  ]


リストアします。まずはフルバックアップを取得した状態に戻します。

$ pg_rman show
============================================================================
Start                Time   Total    Data     WAL     Log  Backup   Status  
============================================================================
2014-06-08 15:37:50    0m    ----  1802kB    33MB      0B  2198kB   OK
2014-06-08 15:32:26    0m    27MB    ----   167MB   2801B  7282kB   OK


「RECOVERY_XID」「RECOVERY_TIME」が必要なため、確認しておきます。

$ pg_rman show 2014-06-08 15:32:26
# configuration
BACKUP_MODE=FULL
WITH_SERVERLOG=true
COMPRESS_DATA=true
# result
TIMELINEID=1
START_LSN=0/1a000028
STOP_LSN=0/1a0000b8
START_TIME='2014-06-08 15:32:26'
END_TIME='2014-06-08 15:32:41'
RECOVERY_XID=1831
RECOVERY_TIME='2014-06-08 15:32:32'
TOTAL_DATA_BYTES=27226652
READ_DATA_BYTES=27226652
READ_ARCLOG_BYTES=167773755
READ_SRVLOG_BYTES=2801
WRITE_BYTES=7282273
BLOCK_SIZE=8192
XLOG_BLOCK_SIZE=8192
STATUS=OK


リストアします。

$ pg_rman restore --recovery-target-xid 1831 --recovery-target-time='2014-06-08 15:32:32'
INFO: validate: 2014-06-08 15:32:26 backup and archive log files by SIZE
INFO: validate: 2014-06-08 15:32:26 server log files by SIZE
INFO: validate: 2014-06-08 15:37:50 server log files by SIZE
INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started.


PostgreSQLを起動し、結果を確認します。

$ psql
psql (9.3.4)
"help" でヘルプを表示します.

postgres=# \c test
データベース "test" にユーザ"postgres"として接続しました。
test=# \d
          リレーションの一覧
 スキーマ | 名前 |    型    |  所有者  
----------+------+----------+----------
 public   | test | テーブル | postgres
(1 行)


差分バックアップを取得した状態に戻したければ、起点になるフルバックアップから順番に戻せばOK.

$ pg_rman restore --recovery-target-xid 1831 --recovery-target-time='2014-06-08 15:32:32'
INFO: validate: 2014-06-08 15:32:26 backup and archive log files by SIZE
INFO: validate: 2014-06-08 15:32:26 server log files by SIZE
INFO: validate: 2014-06-08 15:37:50 server log files by SIZE
INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started.

$ pg_rman restore --recovery-target-xid 1837 --recovery-target-time='2014-06-08 15:37:52'
INFO: validate: 2014-06-08 15:32:26 backup and archive log files by SIZE
INFO: validate: 2014-06-08 15:37:50 backup and archive log files by SIZE
INFO: validate: 2014-06-08 15:37:50 server log files by SIZE
INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started.

$ psql
psql (9.3.4)
"help" でヘルプを表示します.

postgres=# \c test
データベース "test" にユーザ"postgres"として接続しました。
test=# \d
           リレーションの一覧
 スキーマ | 名前  |    型    |  所有者  
----------+-------+----------+----------
 public   | test  | テーブル | postgres
 public   | test2 | テーブル | postgres
(2 行)


今日はこんなところで。