【PostgreSQL】「pg_start_backup()」 によるオンライン物理バックアップ

【PostgreSQL】バックアップの種類と比較

PostgreSQLには主に以下の3種類のバックアップ方法があり、それぞれに特徴とメリット・デメリットがあります。

バックアップを実施するには目的に合った方法を理解し適切にバックアップを行う事が重要です。

論理バックアップ

論理バックアップとはデータベースの内容をSQLスクリプトや圧縮ファイルとしてエクスポートするバックアップ方法です

特 徴

  • pg_dumppg_dumpall を使用
  • SQLスクリプトとしてエクスポート
  • テーブル単位、データベース単位での復元が容易

メリット

  • 柔軟な復元(テーブル単位、スキーマ単位など)
  • 異なるバージョンのPostgreSQLへの移行が容易

デメリット

  • 大規模データベースでは時間がかかる
  • 一貫性のあるスナップショットを取得するには注意が必要

論理バックアップ「pg_dump/pg_restore」については下記のブログを参考下さい。
参考ブログ【PostgreSQL】バックアップ・リストア 「pg_dump/pg_dumpall/pg_restore/psql

オフライン物理バックアップ

PostgreSQLを停止しデータディレクトリ全体を手動でコピーするバックアップ方法です。データの一貫性が確保されるシンプルで確実な手法ですが、バックアップ中はデータベースを使用できないという制約があります。

特 徴

  • PostgreSQLを停止し、データディレクトリ全体をコピー

メリット

  • シンプルで確実な方法
  • すべてのデータが一貫性のある状態でバックアップされる

デメリット

  • バックアップ中はデータベースを使用できない
  • 柔軟性が低い(部分的な復元が困難)

オンライン物理バックアップ (pg_start_backup())

PostgreSQLを停止せずにデータディレクトリを手動でコピーするバックアップ方法です。

WAL (Write-Ahead Logging) を活用し、一貫性のあるスナップショットを取得できるため、PITR (ポイントインタイムリカバリ) にも対応可能です。

  • WAL(Write-Ahead Logging)とは?
    データの整合性を保つための技術で、データが変更される前にその変更内容をログに記録することで、システムがクラッシュしても、ログを使って変更を復元できるようにしています。

  • PITR (ポイントインタイムリカバリ) とは?
    データベースの復旧方法の一つで、特定の時点にデータベースを戻すプロセスです。これにより、データベースがクラッシュしたり、誤ってデータを削除した場合でも、指定した時点まで正確に復旧することができます。

特 徴

  • pg_start_backup() を使用し、PostgreSQLを停止せずにデータディレクトリを手動でコピー
  • Write-Ahead Logging (WAL) を利用

メリット

  • サーバーを停止せずにバックアップ可能
  • 一貫性のあるスナップショットを取得可能
  • PITR(Point-in-Time Recovery)に対応

デメリット

  • 手動操作が必要で手順が複雑
  • WALファイルの管理が必要

【PostgreSQL】pg_start_backup() を使用したオンライン物理バックアップの手順

前提条件

wal_level が replica 以上に設定されている(WALログを適切に取得するために必要)

wal_level は、PostgreSQLのWAL (Write-Ahead Logging) の詳細度を決定する設定パラメータで、以下の3つのレベルがあります。

  • minimal
    もっとも低いレベルで、クラッシュリカバリのみをサポート。レプリケーションや PITR (ポイントインタイムリカバリ) には対応しない。
  • replica (推奨)
    ストリーミングレプリケーションやアーカイブをサポートする標準設定。
  • logical
    論理デコーディングをサポートし、データ変更を詳細に記録。

オンライン物理バックアップを行う場合は、wal_level = replica 以上に設定する必要があります。設定を変更するには、postgresql.conf を編集し、PostgreSQLを再起動してください。

wal_level = replica

バックアップの取得手順

バックアップモードの開始(psql で実行)

pg_backup_start()はスーパーユーザーで実行します。又、下記の「backup label」にはバックアップが特定できる一意の文字を入力します。

  • PostgreSQL 14以前
    pg_start_backup('backup_label');
  • PostgreSQL 15以降
    pg_backup_start('backup_label', true);
C:\>psql -U postgres
psql (16.4)
"help"でヘルプを表示します。

postgres=# SELECT pg_backup_start('backup_label', true);
 pg_backup_start
-----------------
 0/2000028
(1 行)

データディレクトリをコピー(コマンドプロンプトで実行)

C:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\data\backup_label.old
C:\Program Files\PostgreSQL\data\backup_manifest
                         ・
                         ・
                         ・
C:\Program Files\PostgreSQL\data\pg_wal\archive_status
C:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\16\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\16\data\backup_label.old
C:\Program Files\PostgreSQL\16\data\backup_manifest
                         ・
                         ・
                         ・
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
C:\Program Files\PostgreSQL\16\data\pg_xact\0000
2006 個のファイルをコピーしました

C:\>
0000010000000000000002.done C:\Program Files\PostgreSQL\data\pg_xact
C:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\16\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\16\data\backup_label.old
C:\Program Files\PostgreSQL\16\data\backup_manifest
                         ・
                         ・
                         ・
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
C:\Program Files\PostgreSQL\16\data\pg_xact\0000
2006 個のファイルをコピーしました

C:\>
00 2006 個のファイルをコピーしました C:\>

バックアップモードの終了(psql で実行)

  • PostgreSQL 14以前
    pg_stop_backup();
  • PostgreSQL 15以降
    pg backup_stop();
postgres=# SELECT pg_backup_stop();
NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
                              pg_backup_stop
---------------------------------------------------------------------------
 (0/3000060,"START WAL LOCATION: 0/2000028 (file 000000010000000000000002)+
 CHECKPOINT LOCATION: 0/2000060                                           +
 BACKUP METHOD: streamed                                                  +
 BACKUP FROM: standby                                                     +
 START TIME: 2025-02-10 06:08:54 JST                                      +
 LABEL: backup_label                                                      +
 START TIMELINE: 1                                                        +
 ","")
(1 行)

postgres=#

WALログを保存(コマンドプロンプトで実行)

C:\>xcopy /E /I "C:\Program Files\PostgreSQL\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\data\pg_wal
C:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000002 C:\Program Files\PostgreSQL\data\pg_wal
C:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000003 C:\Program Files\PostgreSQL\data\pg_wal\archive_status
C:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000002.done 3 個のファイルをコピーしました

オンライン物理バックアップ(pg_basebackup)との違い

データベースを停止しないオンライン物理バックアップには(pg_basebackupコマンドを使用する方法もあります。pg_basebackupは主に以下の場合に使用されます。

  • データディレクトリ全体のスナップショットを取得し、復旧のために必要な全てのデータを取得する場合
  • レプリケーションのスタンバイサーバをセットアップする場合
  • Point-In-Time Recovery (PITR) を行うための基盤となるバックアップを作成する場合
  • 別のサーバーにPostgreSQLデータベースを移行する場合
  • 定期的なバックアップを自動化する場合

pg_basebackup」を使用したオンライン物理バックアップについては下記のブログを参考下さい。
参考ブログ【PostgreSQL】pg_basebackup によるオンライン物理バックアップ

項目pg_start_backup()pg_basebackup
操作方法手動でコピーコマンドで一括取得
柔軟性高い(ディレクトリ選択可能)低い(全体コピー)
WAL管理手動で取得が必要自動取得
使いやすさ複雑簡単
利用ケース高度なバックアップ戦略簡単なフルバックアップ

【PostgreSQL】バックアップの復元

バックアップの復元手順

既存のデータディレクトリを削除(または別の場所に移動)

C:\>net stop postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを停止中です.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に停止されました。

C:\>ren "C:\Program Files\PostgreSQL\data" "data_old"

バックアップをリストア

c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\data"
C:\backup_directory\data
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\>
0000010000000000000002 C:\backup_directory\data
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\>
0000010000000000000003 C:\backup_directory\data\backup_label.old C:\backup_directory\data\backup_manifest ・ ・ ・ C:\backup_directory\data\pg_wal
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\>
0000010000000000000003 C:\backup_directory\data\pg_wal\archive_status
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\>
0000010000000000000002.done C:\backup_directory\data\pg_xact
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\>
00 2009 個のファイルをコピーしました C:\>

WALログを適用

C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\data\pg_wal"
C:\backup_directory\pg_wal
C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました

C:\>
0000010000000000000002 C:\backup_directory\pg_wal
C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました

C:\>
0000010000000000000003 C:\backup_directory\pg_wal\archive_status
C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました

C:\>
0000010000000000000002.done 3 個のファイルをコピーしました C:\>

PostgreSQLを起動

C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に開始されました。

C:\>

まとめ

pg_start_backup() を使用すると、柔軟で細かい管理が可能になりますが、pg_basebackup の方が簡単にフルバックアップを取得できます。運用環境に応じて適切な方法を選択して下さい。

バックアップ方式メリットデメリット
1論理バックアップ柔軟な復元、異なるバージョン対応大規模DBでは遅い、一貫性管理が必要
2オフライン物理バックアップシンプルで確実停止が必要、部分復元不可
3オンライン物理バックアップ (pg_start_backup()********)柔軟な管理が可能手順が複雑、WAL管理が必要
4pg_basebackup簡単に取得可能カスタマイズ性が低い

タイトルとURLをコピーしました