pg_rmanを使ってみる
PostgreSQLのバックアップツールにpg_rmanがあります。今回はこれを使ってみることにします。
自分用作業メモです。
インストールする(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 行)
今日はこんなところで。