PostgreSQL11でバックアップ/リストアの管理ツールpg_rmanを使う

# はじめに

pg_rmanは、PostgreSQLのポイントインタイムリカバリー（PITR）に対応したバックアップ/リストアの管理ツールです。pg_rmanを使用しないでもPITRは標準で実現できるのですが、操作やバックアップの管理が煩雑なので、pg_rmanを使用してみます。


# 環境

- CentOS 7.5
- PostgreSQL 11.2
- pg_rman 1.3.8

※pg_rman 1.3.8は11.1の利用を推奨していますが、11.2の環境しかなかったので11.2を利用。


# アーカイブ設定

WALファイルをアーカイブするために、以下の設定を実施しておきます。

```
archive_mode = on
archive_command = 'test ! -f /arc/%f && cp %p /arc/%f'
```

archive_modeを"on"に変更し、archive_commandを設定しています。


# pg_rmanインストール

まず、以下のサイトからpg_rmanのRPMファイルをダウンロードし、インストールします。

https://github.com/ossc-db/pg_rman/releases

PostgreSQL11/RHEL7用のRPMファイルをインストールしています。

```
wget https://github.com/ossc-db/pg_rman/releases/download/V1.3.8/pg_rman-1.3.8-1.pg11.rhel7.x86_64.rpm
rpm -ivh pg_rman-1.3.8-1.pg11.rhel7.x86_64.rpm
```

".pgsql_profile"を以下のように修正しています。
PGDATAはデータベースクラスタのディレクトリパスで、BACKUP_PATHはバックアップの格納先です。バックアップの格納先はバックアップカタログと呼ばれます。

```
PGDATA=/data/
export PGDATA

BACKUP_PATH=/bakcatalog/catalog/
export BACKUP_PATH
```


# pg_rmanの初期化

"pg_rman init"コマンドで初期化を行います。

```
$ pg_rman init
INFO: ARCLOG_PATH is set to '/arc'
INFO: SRVLOG_PATH is set to '/data//log'
```


# 完全バックアップ取得

"pg_rman backup"コマンドで完全バックアップを取得します。

"--backup-mode"はフルバックアップなので"full"を指定、"--compress-data"はバックアップファイルを圧縮、"--progress"はバックアップの経過を表示します。

```
$ pg_rman backup --backup-mode=full --compress-data --progress
INFO: copying database files
Processed 2033 of 2033 files, skipped 0
INFO: copying archived WAL files
Processed 3 of 3 files, skipped 0
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
```

# バックアップデータの検証

バックアップデータは、検証を実施しないとリストアや増分バックアップが行えません。
以下のようにバックアップデータの検証を実行します。

```
$ pg_rman validate
INFO: validate: "2019-05-26 00:34:53" backup and archive log files by CRC
INFO: backup "2019-05-26 00:34:53" is valid
```

# バックアップの確認

"pg_rman show"コマンドでバックアップの確認ができます。
検証まで完了しているとStatusが"OK"になります。検証未実施の場合は"DONE"になります。

```
$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status 
=====================================================================
2019-05-26 00:34:53  2019-05-26 00:34:59  FULL    13MB     1  OK
```

"detail"をつけると詳細な情報が表示されます。

```
$ pg_rman show detail
======================================================================================================================
 StartTime           EndTime              Mode    Data  ArcLog  SrvLog   Total  Compressed  CurTLI  ParentTLI  Status 
======================================================================================================================
2019-05-26 00:34:53  2019-05-26 00:34:59  FULL    91MB    33MB    ----    13MB        true       1          0  OK

```


# 増分バックアップの取得

増分バックアップにも対応しています。
増分バックアップを実行するためには、"--backup-mode=incremental"と指定します。
"--with-serverlog"でサーバログもバックアップできます（フルバックアップの時は付け忘れていましたが）。

```
$ pg_rman backup --backup-mode=incremental --with-serverlog
INFO: copying database files
INFO: copying archived WAL files
INFO: copying server log files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
-bash-4.2$ pg_rman validate
INFO: validate: "2019-05-26 00:37:04" backup, archive log files and server log files by CRC
INFO: backup "2019-05-26 00:37:04" is valid

$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status 
=====================================================================
2019-05-26 00:37:04  2019-05-26 00:37:07  INCR    35MB     1  OK
2019-05-26 00:34:53  2019-05-26 00:34:59  FULL    13MB     1  OK
```


# リストア

リストアを実行する前に PostgreSQL サーバを停止します。

```
$ pg_ctl stop -m immediate
```

最新の状態に戻す場合は、オプションなしで"restore"コマンドを実行します。

```
$ pg_rman restore
INFO: the recovery target timeline ID is not given
INFO: use timeline ID of current database cluster as recovery target: 1
INFO: calculating timeline branches to be used to recovery target point
INFO: searching latest full backup which can be used as restore start point
INFO: found the full backup can be used as base in recovery: "2019-05-26 00:34:53"
INFO: copying online WAL files and server log files
INFO: clearing restore destination
INFO: validate: "2019-05-26 00:34:53" backup and archive log files by SIZE
INFO: backup "2019-05-26 00:34:53" is valid
INFO: restoring database files from the full mode backup "2019-05-26 00:34:53"
INFO: searching incremental backup to be restored
INFO: validate: "2019-05-26 00:37:04" backup, archive log files and server log files by SIZE
INFO: backup "2019-05-26 00:37:04" is valid
INFO: restoring database files from the incremental mode backup "2019-05-26 00:37:04"
INFO: searching backup which contained archived WAL files to be restored
INFO: backup "2019-05-26 00:37:04" is valid
INFO: restoring WAL files from backup "2019-05-26 00:37:04"
INFO: restoring online WAL files and server log files
INFO: generating recovery.conf
INFO: restore complete
HINT: Recovery will start automatically when the PostgreSQL server is started.
```

任意の時点にリストアする場合は、"--recovery-target-time"で戻したい日時を指定します。

```
$ pg_rman restore --recovery-target-time '2019-05-26 7:30:00'
```

リストアが完了したら、PostgreSQLを起動します。

```
$ pg_ctl start
```

バックアップ時にバックアップの世代数、最低保存日数を指定することができます。同時に指定した場合は、両方の閾値を超えたバックアップが削除されます。
以下は3世代、最低保存日数を10日でバックアップを実行しています。

```
$ pg_rman backup --backup-mode=incremental --keep-data-generations=3 --keep-data-days=10
```

# 設定ファイル

ここまで色々なオプションを使用しましたが、間違いがないように設定ファイルに記述しておいたほうが良いです。
pg_rmanの設定ファイルは、バックアップカタログパス直下のpg_rman.iniです。
例えば以下のように設定します。
※最初に2行は初期化時に自動で追加されます。

```
$ cat $BACKUP_PATH/pg_rman.ini

ARCLOG_PATH='/arc'
SRVLOG_PATH='/data//log'

COMPRESS_DATA = YES
KEEP_DATA_GENERATIONS = 3
KEEP_DATA_DAYS = 10
```


# 参考

- [pg_rmanドキュメント](http://ossc-db.github.io/pg_rman/index-ja.html)