PostgreSQLの周辺ツール ~ pg_rmanでバックアップ・リカバリーを管理する ~
PostgreSQLインサイド

データベース運用において、バックアップ・リカバリーは日常的に行う重要な作業の1つです。「PostgreSQLインサイド」の“技術を知る:PostgreSQLのバックアップとリカバリー”で説明していますが、お客様の重要なデータを扱うシステムでは最新状態まで迅速に復旧できることが求められ、そのようなシステムには物理バックアップのオンラインバックアップ・リカバリーが利用されます。
ここでは、PostgreSQLの周辺ツールの1つである、pg_rmanを使ったPostgreSQLのバックアップ・リカバリーについて解説します。

1. pg_rmanとは

pg_rmanは、PostgreSQLのバックアップとリカバリーを管理するツールです。物理バックアップであるオンラインバックアップの1つで、Linux上で動作します。pg_rmanは、PostgreSQLのポイントインタイムリカバリー(以降、PITRと略します)に対応しています。PITRは、バックアップした時点から障害発生の直前までの任意の時点に復旧できる機能ですが、復旧時には非常に煩雑な手順を必要とします。pg_rmanを使用することにより、PITRの煩雑な手順を簡略化し、より少ない手順で実施できます。
pg_rmanには以下の機能があります。

  • 1コマンドによるオンラインバックアップ・リカバリー
  • 増分バックアップやバックアップの圧縮
  • バックアップ世代ごとの管理と一覧表示
  • ストレージ・スナップショットによるバックアップ取得時間の短縮

pg_rmanによるオンラインバックアップ・リカバリーの流れを以下に示します。

参照

  • pg_rmanの仕様については、オープンソース・ソフトウェアのウェブページを参照してください。
  • 物理バックアップの詳細については、「PostgreSQLインサイド」の“技術を知る:物理バックアップ”を参照してください。

2. pg_rmanの使い方

では、pg_rmanを使ってバックアップ・リカバリーを体験してみましょう。PostgreSQLデータベースで構築したデータベースクラスタ:人事情報システムを想定しました。

PostgreSQLのバージョン PostgreSQL 10.3
pg_rmanのバージョン 1.3.6
データベース名 mydb
テーブル名 人事テーブル1(jtbl1)
データ格納先(ディスク1) データベースクラスタのパス /data
WALのパス /tran
バックアップデータ格納先(ディスク2) アーカイブログのパス /arch
バックアップカタログのパス /back

なお、pg_rmanのインストールおよびバックアップカタログの初期化は完了しているものとします。

2.1 バックアップ

pg_rmanでは、全体バックアップおよび増分バックアップを取得できます。人事情報システムで、毎日1時に全体バックアップを行い、6時間おきに増分バックアップを行う例を説明します。バックアップ開始前の、人事テーブル1(jtbl1)のデータは以下とします。

$ psql -c "SELECT * FROM jtbl1;" mydb
  id  | name  | code
------+-------+------
 0001 | Kato  |   21
 0002 | Goto  |   22
 0003 | Sato  |   31
 0004 | Takao |   50
 0005 | Yamao |   21
  1. 人事情報システム全体のバックアップを実行します。検証して結果を確認します。
$ pg_rman backup --backup-mode=full --with-serverlog --progress -d mydb      #全体バックアップ
$ pg_rman validate                                                           #検証
$ pg_rman show                                                               #結果表示
===================================================================
 StartTime           EndTime              Mode    Size  TLI  Status
===================================================================
2019-01-22 01:00:01  2019-01-22 01:00:06  FULL  4036kB    2  OK
  1. 定時バックアップとして増分バックアップを実行します。検証して結果を確認します。
$ pg_rman backup --backup-mode=incremental --with-serverlog --progress -d mydb #増分バックアップ
$ pg_rman validate                                                             #検証
$ pg_rman show                                                                 #結果表示
=====================================================================
 StartTime           EndTime              Mode    Size  TLI  Status
=====================================================================
2019-01-22 07:00:01  2019-01-22 07:00:03  INCR    55kB    2  OK
2019-01-22 01:00:01  2019-01-22 01:00:06  FULL  4036kB    2  OK
  1. 組織変更に伴って人事テーブル1(jtbl1)における部署コード(code)の値を変更します。
$ psql -c "UPDATE jtbl1 SET code = code + 1000;" mydb
$ psql -c "SELECT * FROM jtbl1;" mydb
  id  | name  | code
------+-------+------
 0001 | Kato  | 1021
 0002 | Goto  | 1022
 0003 | Sato  | 1031
 0004 | Takao | 1050
 0005 | Yamao | 1021
  1. 順次、定時バックアップとして増分バックアップを実行し、検証して結果を確認します。
$ pg_rman backup --backup-mode=incremental --with-serverlog --progress -d mydb  #増分バックアップ
$ pg_rman validate                                                              #検証
$ pg_rman show                                                                  #結果表示
=====================================================================
 StartTime           EndTime              Mode    Size  TLI  Status
=====================================================================
2019-01-22 13:00:01  2019-01-22 13:00:03  INCR    72kB    2  OK
2019-01-22 07:00:01  2019-01-22 07:00:03  INCR    55kB    2  OK
2019-01-22 01:00:01  2019-01-22 01:00:06  FULL  4036kB    2  OK

ポイント

pg_rman showコマンドのStatusに’DONE’が表示された場合は、バックアップのあとに検証が実行されていないことを意味します。

バックアップデータとして利用するためには、Statusを'OK'(検証済)にする必要があります。そのため、pg_rmanのバックアップでは、以下をセットで実行することをお勧めします。

  1. pg_rman backup
  2. pg_rman validate

2.2 最新状態にリカバリー

システム運用中にデータベースに異常が発生した場合、障害が発生する直前の状態に戻す必要があります。pg_rmanでは、全体バックアップ、増分バックアップ、WALおよびアーカイブログを利用して簡単にリカバリーできます。人事情報システムでデータ更新後にデータベース(/dataディレクトリー)に異常が発生したため、システムを最新状態にリカバリーする例を説明します。


図1:pg_rmanによるオンラインバックアップと最新状態へのリカバリー

  1. データベース異常が発生!人事情報システムを緊急停止して、データベースクラスタを退避します。
$ pg_ctl stop -m immediate
$ cp -rf /data  /data_crash
  1. バックアップデータをリストアします(recovery.confが生成されます)。
$ pg_rman restore
  1. 人事情報システムを起動すると、最新状態にリカバリーされます。
$ pg_ctl start
  1. 最新状態にリカバリーできたかを確認します。
$ psql -c "SELECT * FROM jtbl1;" mydb
  id  | name  | code
------+-------+------
 0001 | Kato  | 1021
 0002 | Goto  | 1022
 0003 | Sato  | 1031
 0004 | Takao | 1050
 0005 | Yamao | 1021

2.3 指定した日時にリカバリー

ディスク内のデータが論理的に破壊され、データベースが正常に動作しない場合は、バックアップを取得した正常な状態にデータベースを戻す必要があります。pg_rmanでは、復旧する日時を指定して簡単にリカバリーできます。人事情報システムでデータ更新中にデータベース(/dataディレクトリー)に異常が発生したため、システムをデータ更新前の状態にリカバリーする例を説明します。


図2:pg_rmanによるオンラインバックアップと指定日時へのリカバリー

  1. データベース異常が発生!人事情報システムを緊急停止して、データベースクラスタを退避します。
$ pg_ctl stop -m immediate
$ cp -rf /data  /data_crash 
  1. 増分バックアップの完了時点に戻したいため、バックアップデータの一覧を表示してバックアップ終了日時とStatusを確認します。
$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2019-01-22 07:00:01  2019-01-22 07:00:03  INCR    55kB    2  OK
2019-01-22 01:00:01  2019-01-22 01:00:06  FULL  4036kB    2  OK
  1. 増分バックアップの完了日時を指定してバックアップデータをリストアします(recovery.confが生成されます)。
$ pg_rman restore  --recovery-target-time '2019-01-22 07:00:03'
  1. 人事情報システムを起動すると、指定した日時にリカバリーされます。
$ pg_ctl start
  1. 増分バックアップの直後の状態にリカバリーできたかを確認します。
$ psql -c "SELECT * FROM jtbl1;" mydb
  id  | name  | code
------+-------+------
 0001 | Kato  |   21
 0002 | Goto  |   22
 0003 | Sato  |   31
 0004 | Takao |   50
 0005 | Yamao |   21

3. pg_rmanのメリット

3.1 PostgreSQLとpg_rmanの比較

PostgreSQL標準機能によるオンラインバックアップ・リカバリーと、pg_rmanによるオンラインバックアップ・リカバリーの手順を比較してみましょう。なお、リカバリーはデータベース異常時に最新状態にリカバリーする場合を想定しています。

工程 PostgreSQL標準機能 pg_rman
バックアップ
  1. pg_basebackupコマンドでベースバックアップ
  2. ベースバックアップデータが生成されたかを確認
  3. WALが生成されたかを確認
  1. pg_rmanコマンドで全体(増分)バックアップと検証
  2. pg_rmanコマンドでバックアップ状態を確認
リカバリー
  1. ベースバックアップデータをリストア
  2. リストアした古いWALを削除
  3. 未アーカイブのWALをpg_walにコピー
  4. 復旧コマンドファイル(recovery.conf)を作成
  5. データベースサーバーを起動
  6. 最新状態かを確認
  1. pg_rmanコマンドでリストア(recovery.confを自動生成)
  2. データベースサーバーを起動
  3. 最新状態かを確認

pg_rmanは、PostgreSQL標準機能と比べて多くのメリットがあります。1コマンドでバックアップとリカバリーの操作が実行できるため、複数のコマンドを使分ける必要が無く、操作ミスを防ぎます。特にリカバリー(PITR)はPostgreSQL標準機能の手順のような古いWALの削除や復旧コマンドファイルの作成など事前準備が不要なため、格段に手軽です。また、増分バックアップ機能およびバックアップの圧縮機能があるため、定時バックアップの時間とサイズが少なく済みます。全体バックアップと増分バックアップで取得したバックアップデータは世代管理されて一覧表示して確認できるため、バックアップデータの取得状況や障害発生時に戻りたいバックアップ時点をすぐに把握できます。

参考

メリットの多い周辺ツールのpg_rmanですが、バグ修正の必要性が生じてもコミュニティーの開発ペースに依存します。
そこで、富士通が提供するFUJITSU Software Enterprise Postgres(以降、Enterprise Postgresと略します)に同梱しているpg_rmanをご紹介します。Enterprise Postgresでは、pg_rmanをプリインストールしていますので、現在PostgreSQLデータベースでpg_rmanを使って業務運用している場合、Enterprise Postgresに移行したあとも、そのまま継続利用できます。富士通の24時間365日保守サポートにより、PostgreSQL本体およびpg_rmanを含む周辺ツールのご質問、トラブル対応およびバグ修正にも迅速に対応します。また、Enterprise Postgresでは、PostgreSQLのバックアップ・リカバリーを独自強化しており、pg_rmanとはまた違ったメリットがあります。PostgreSQLの継続的アーカイブによるバックアップを1コマンドまたはGUIツールで実施でき、リカバリー(PITR)も1コマンドまたはGUIツールで実施できます。さらに、WALを配置したディスクの障害に備えてWALを二重化できるため、ディスク障害が発生した場合も常に最新状態に復旧できます。例えばpg_rmanの図1で説明すると、ディスク1自体が故障した場合、リカバリーに必要な資源のWALも消失するので最新状態に復旧できません。Enterprise PostgresではWALをバックアップデータ格納先のディスク(ディスク2)に二重化しているため、ディスク2のWALを使って最新状態に復旧できる仕組みです。日常的なデータ保全のバックアップツールとしては、増分バックアップの取得やバックアップデータの一覧表示ができるpg_rmanが便利です。ディスク障害などシステム全体の保全に対応するバックアップツールとしては、Enterprise Postgresをお勧めします。
pg_rmanとEnterprise Postgresのオンラインバックアップ・リカバリーの違いを以下にまとめます。なお、表中記号の意味は以下のとおりです。

レ:機能有り、N/A:機能無し

項目 pg_rman Enterprise Postgres
コマンド機能 GUIツール
全体バックアップ
増分バックアップ N/A N/A
バックアップデータの圧縮 N/A N/A
バックアップデータの世代管理 N/A N/A
バックアップ領域の自動生成 N/A N/A
ストレージ製品との連携による高速バックアップ N/A
ディスク障害に備えたWALの二重化 N/A
リカバリーの復旧時点 最新時点
注1

注1
指定した任意の時点 N/A
バックアップ時点
異常箇所の自動特定 N/A N/A
動作環境 Linux
Windows N/A
  • 注1
    データだけではなく、WALのディスク障害が発生した場合でも最新に復旧できます。

Enterprise Postgresでは、バージョン 10から、pg_rmanを同梱しています。
Enterprise Postgresのバックアップ・リカバリーの詳細については、Enterprise Postgresの製品マニュアル“FUJITSU Software Enterprise Postgres 運用ガイド”を参照してください。なお、同一のインスタンスに対するバックアップ処理として、pg_rmanとWALの二重化は併用できません。

バックアップ・リカバリーの手段として、pg_rmanおよびEnterprise Postgresの機能・用途を理解して、ご利用のシステムに適した方法を選択してください。

2021年1月22日更新

オンデマンド(動画)セミナー

    • PostgreSQLに関連するセミナー動画を公開中。いつでもセミナーをご覧いただけます。
      • 【事例解説】運送業務改革をもたらす次世代の運送業界向けDXプラットフォームの構築
      • ハイブリッドクラウドに最適なOSSベースのデータベースご紹介

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ