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

【PostgreSQL】pg_basebackup によるオンライン物理バックアップ

PostgreSQLのバックアップ方法はいくつかありますが、本記事では pg_basebackup コマンドを使用した方法を解説します。

pg_basebackup は物理バックアップを取得するための公式ツールであり、主にストリーミングレプリケーションのセットアップやデータの完全バックアップに利用されます。

論理バックアップを取得しリストアする「pg_dump/pg_restore」については下記のブログを参考下さい。

参考ブログ:【PostgreSQL】バックアップ・リストア 「pg_dump/pg_dumpall/pg_restore/psql

【PostgreSQL】pg_basebackup による物理バックアップとは?

pg_basebackup はPostgreSQLのデータディレクトリ全体をコピー(物理バックアップ)し、取得するツールです。

取得したバックアップはそのまま復元することが可能で、クラッシュリカバリやストリーミングレプリケーションのセットアップにも利用されます。

pg_basebackup(物理バックアップ)の特徴

  • データベースを停止しないオンラインバックアップが可能
  • データディレクトリ全体をフルバックアップする方式
  • WALログと一緒に取得する為、PITR1や整合性がある
  • そのままリストア(データディレクトリを置き換える)するだけで復旧可能

pg_basebackupにおけるデータの整合性

pg_basebackup におけるデータの整合性は、以下の仕組みによって確保されます

  1. WAL(Write-Ahead Logging)と一緒にバックアップ
    -Xs オプションを使用すると、WAL(トランザクションログ)がバックアップとともに取得され、リストア時に適用されることで、データの一貫性が保たれます。

  2. チェックポイントを考慮したバックアップ
    pg_basebackup はバックアップ取得時に適切なチェックポイントを確保し、一貫したデータの状態を維持します。

  3. データのスナップショットを作成
    バックアップの取得中もデータベースが稼働しているため、取得されたデータが部分的にならないよう、整合性を保つ仕組みが組み込まれています。

【PostgreSQL】pg_basebackupによるバックアップの例

基本的なバックアップ取得コマンド

C:\>pg_basebackup -D C:\pg_backup -Fp -Xs -P -R -U postgres -h localhost -p 5432
33827/33827 kB (100%), 1/1 テーブル空間

C:\>

■主なオプション

オプション意 味
1-D C:\pg_backupバックアップ先ディレクトリ
2-Fpプレーンフォーマットでバックアップ
3-XsWALも一緒に取得
4-p進捗表示
5-Rリカバリ構成ファイルを作成
6-U postgresバックアップ実行ユーザー
7-h localhost -p 5432接続先サーバー指定

C:\pg_backup フォルダの内容

pg_basebackup のバックアップを7zip形式で圧縮

圧縮後はh:\pg_backup ディレクトリを削除してもかまいません。

C:\>7z a -t7z C:\pg_backup.7z C:\pg_backup

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
28 folders, 1358 files, 50891659 bytes (49 MiB)

Creating archive: C:\pg_backup.7z

Add new data to archive: 28 folders, 1358 files, 50891659 bytes (49 MiB)


Files read from disk: 1125
Archive size: 778075 bytes (760 KiB)
Everything is Ok

C:\>

スタンバイサーバー用のバックアップの取得

スタンバイサーバー用のバックアップを取得するには、ストリーミングレプリケーションに適した設定を加えて pg_basebackup を実行します。

C:\>pg_basebackup -D C:\pg_backup_rep -Fp -Xs -P -R -C -S standby1 -U postgres -h 
localhost -p 5432
33831/33831 kB (100%), 1/1 テーブル空間

C:\>

■スタンバイ用の主なオプション

オプション意 味
1-Cスタンバイサーバー用にレプリケーションスロットを作成
2-S standby1レプリケーションスロット名を standby1 に設定

【PostgreSQL】リストアの方法

PostgreSQLの停止

リストア前に管理者権限でPostgreSQLを停止します。

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

C:\>

既存データディレクトリのリネーム

既存のデータディレクトリをリネームしておきます。

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

バックアップデータの解凍

バックアップデータを7zipで圧縮した場合は以下の様に解凍します。

C:\>7z x C:\pg_backup.7z -oC:\pg_backup

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive for archives:
1 file, 778075 bytes (760 KiB)

Extracting archive: H:\pg_backup.7z
--
Path = H:\pg_backup.7z
Type = 7z
Physical Size = 778075
Headers Size = 8875
Method = LZMA2:24
Solid = +
Blocks = 1

Everything is Ok

Folders: 28
Files: 1358
Size:       50891659
Compressed: 778075

C:\>

バックアップデータのリストア

C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
              ・
              ・
              ・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members
C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
              ・
              ・
              ・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました

C:\>
00 H:\pg_backup\pg_multixact\offsets
C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
              ・
              ・
              ・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました

C:\>
00 H:\pg_backup\pg_wal
C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
              ・
              ・
              ・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました

C:\>
000001000000000000000B H:\pg_backup\pg_xact
C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
              ・
              ・
              ・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました

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

PostgreSQLの再起動

管理者権限でPsatgreSQLで起動します。

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

私の場合、最初 下記の様にサービスが開始できませんでした。

C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始できませんでした。

サービスはエラーを報告しませんでした。

NET HELPMSG 3534 と入力すると、より詳しい説明が得られます。

Applicationログを調べてみると、PostgreSQL の「postmaster.pid」に対してアクセス権限が不足しているらしいので、PostgreSQL サービスのアカウントを「ローカルシステムアカウント」に変更したら起動できました。

動作確認

正常にリストアされたか確認するため、PostgreSQLに接続してデータベースの一覧を表示してみます。正常に表示されました。

C:\>psql -U postgres -h localhost -p 5432 -d postgres
psql (16.4)
"help"でヘルプを表示します。

postgres=# \l
                                                                 データベース一覧
   名前    |  所有者  | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ICUロケール | ICUルール: |     アクセス権限
-----------+----------+------------------+----------------------+----------+-------------------+-------------+------------+-----------------------
 postgres  | postgres | UTF8             | libc                 | C        | C                 |             |            |
 template0 | postgres | UTF8             | libc                 | C        | C                 |             |            | =c/postgres          +
           |          |                  |                      |          |                   |             |            | postgres=CTc/postgres
 template1 | postgres | UTF8             | libc                 | C        | C                 |             |            | =c/postgres          +
           |          |                  |                      |          |                   |             |            | postgres=CTc/postgres
(3 行)

まとめ

PostgreSQLのバックアップには pg_basebackuppg_dump の2つの主要な方法があります。それぞれの特性を理解し、用途に応じて適切な手法を選択することが重要です。

pg_basebackup の特徴

  • フルバックアップ向け:データディレクトリ全体をコピーするため、データベース全体のバックアップ・リストアが容易
  • 整合性の確保:WALログを含めてバックアップを取得し、一貫性のある状態を保持
  • ストリーミングレプリケーション対応:レプリカサーバーのセットアップに最適
  • 圧縮可能:7zipなどを使ってバックアップサイズを削減可能
  • リストアがシンプル:データディレクトリを置き換えるだけで復旧可能

pg_dump の特徴

  • 部分バックアップ向け:特定のデータベース、スキーマ、テーブル単位でエクスポート可能
  • 移行用途に最適:異なるバージョン間の移行や他のデータベースシステムとの連携に向いている
  • 柔軟なフォーマット:SQLスクリプトやカスタム形式での出力が可能
  • リストアが詳細設定可能pg_restore を使用して特定のデータのみ復元できる

用途別の選び方

用途推奨ツール
1フルバックアップを取得・復元したいpg_basebackup
2特定のテーブルやスキーマのみ取得したいpg_dump
3ストリーミングレプリケーションをセットアップしたいpg_basebackup
4データを異なる環境へ移行したいpg_dump
5災害復旧のために完全なコピーを取りたいpg_basebackup


日常的なバックアップやストリーミングレプリケーションのセットアップには pg_basebackup を、特定のテーブルやスキーマのエクスポート・移行には pg_dump を活用すると良いでしょう。

脚 注

  1. PITR(Point-In-Time Recovery)
    特定の時点にデータベースを復元する機能です。WAL(Write-Ahead Logging)を活用し、バックアップ取得後の変更データを適用することで、障害発生直前の状態や任意の時刻の状態に戻す事が可能です。 ↩︎

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