バックアップとリカバリの要点
内容の確認日: 2026-10-29
この分野は出題範囲の S2.4 (バックアップ方法) に当たり、50 問中およそ 7 問が出題されます。中分類の中で S3.1 (SQL コマンド) に次いで出題数が多い分野です。
バックアップは、SQL の形で書き出す 論理バックアップ (pg_dump・pg_dumpall) と、データベースクラスタのファイルをコピーする 物理バックアップ (ファイルシステムレベル・pg_basebackup・低レベルバックアップ) に分かれます。PITR (指定した時点への復旧) ができるのは、物理バックアップと WAL アーカイブを組み合わせたときだけです。
pg_dump と pg_restore
pg_dump は 1 つのデータベース を論理バックアップします。開始時点のスナップショットで読むので、サーバーを動かしたまま、ほかのセッションの更新を妨げずに一貫した内容を取れます。ロールやテーブルスペースなどクラスタ全体のオブジェクトは含まれません。
出力形式は -F で選びます。
・p プレーンテキスト (既定): SQL 文のファイル。psql -f でリストアする
・c カスタム: 圧縮されたアーカイブ。pg_restore でリストアする
・d ディレクトリ: テーブルごとのファイル。-j で並列に書き出せる唯一の形式
・t tar: tar 形式のアーカイブ
アーカイブ形式は pg_restore で、-t (テーブル)・-n (スキーマ) で一部だけをリストアしたり、-l で中身の一覧を出して -L で選んだり、-j で並列にリストアしたりできます。-C を付けると CREATE DATABASE で作ってからリストアするので、-d には既存の別のデータベース (postgres など) を指定します。プレーンテキストを pg_restore に渡すと、psql を使うよう促すエラーになります。
そのほかのオプション: -s 定義だけ、-a データだけ、-c リストア前に削除する文を含める、-C CREATE DATABASE を含める、--column-inserts データを列名付きの INSERT にする。
pg_dumpall
pg_dumpall は、ロール・テーブルスペースなどのグローバルオブジェクトと、すべてのデータベース を書き出します。出力はプレーンテキストだけで、psql でリストアします。-g (--globals-only) でグローバルオブジェクトだけ、-r でロールだけを書き出せるので、「データベースごとは pg_dump のカスタム形式、ロールは pg_dumpall -g」という組み合わせがよく使われます。
物理バックアップと WAL
ファイルシステムレベルのバックアップ は、データベースクラスタのディレクトリを tar などでコピーする方法です。一貫した内容にするにはサーバーを停止してからコピーし、クラスタ全体をまとめて扱う必要があります (テーブルのファイルだけを戻すことはできません)。同じメジャーバージョンでしか使えません。
WAL (先行書き込みログ) は、データファイルより先に変更の内容を書くログで、pg_wal ディレクトリに 16MB ずつのセグメントファイルとして書かれます。クラッシュ後の起動時には WAL を再生して、コミット済みの内容を戻します。
WAL アーカイブは、wal_level を replica 以上、archive_mode = on (再起動が必要) にし、archive_command に WAL をコピーするコマンドを書きます。%p はアーカイブするファイルのパス、%f はファイル名に置き換わります。コマンドが失敗し続けると、WAL ファイルが pg_wal にたまり続けます。
wal_level = replicaarchive_mode = onarchive_command = 'cp %p /mnt/archive/%f'PITR と pg_basebackup
PITR (ポイントインタイムリカバリ) は、ベースバックアップ を戻し、その後の WAL アーカイブを再生して、指定した時点まで進める方法です。PostgreSQL 14 では次の手順で行います (12 から recovery.conf は廃止)。
1. ベースバックアップを展開する
2. postgresql.conf に restore_command (アーカイブから WAL を取り出すコマンド) と、必要なら recovery_target_time を書く
3. データベースクラスタに recovery.signal という空のファイルを置いて起動する
standby.signal を置くと、リカバリを終えずにスタンバイサーバーとして WAL を受け取り続けます。
ベースバックアップは pg_basebackup で取れます。レプリケーションの接続でクラスタ全体のコピーを受け取るので、ロールには REPLICATION 属性が、pg_hba.conf には replication の行が必要です。-D 出力先、-F 形式 (p・t)、-z 圧縮、-X stream (既定) で取得中の WAL も受け取り、-P で進み具合を表示します。
非排他的低レベルバックアップ
pg_basebackup を使わずに、ファイルを自分でコピーする方法です。PostgreSQL 14 では次の関数を使います (15 からは pg_backup_start・pg_backup_stop に名前が変わり、排他的モードは廃止されました)。
1. あるセッションで SELECT pg_start_backup('label', false, false); を実行する (3 つ目の引数 false が非排他的モード)
2. そのセッションを接続したまま、データベースクラスタのファイルをコピーする
3. 同じセッションで SELECT * FROM pg_stop_backup(false); を実行する
4. 返された labelfile と spcmapfile の内容を、バックアップの側に backup_label・tablespace_map というファイルとして保存する
途中でセッションが切れると、バックアップは中止されます。backup_label がないと、リカバリを始める位置が分からず、正しく復元できません。
COPY と \copy
COPY はテーブルとファイル (または標準入出力) の間でデータをやり取りします。FORMAT csv・HEADER・DELIMITER などのオプションがあり、COPY (問い合わせ) TO ... で問い合わせの結果も書き出せます。CSV では、NULL は何も書かない値、空文字列は "" になります。
CREATE TABLE memo (id integer, note text);INSERT INTO memo VALUES (1, NULL), (2, ''), (3, 'a,b');COPY memo TO STDOUT WITH (FORMAT csv, HEADER);psql -A -t -P null=NULL -f example.sql id,note 1, 2,"" 3,"a,b"
COPY テーブル TO 'ファイル' は サーバーのプロセス がサーバー上のファイルを読み書きするので、スーパーユーザーか pg_read_server_files・pg_write_server_files ロールの権限が必要です。psql の \copy は、psql を動かしている クライアント側 のファイルを読み書きし、テーブルの権限があれば一般のロールでも使えます。
試験でよくある引っかけ
pg_dumpにロールは含まれないロール・テーブルスペースは
pg_dumpall(-g) で取ります。プレーンテキストは
pg_restoreで読めない-Fを付けないpg_dumpの出力は SQL 文なので、psql -fでリストアします。並列の書き出しはディレクトリ形式だけ
pg_dump -jはディレクトリ形式だけです。pg_restore -jはカスタム形式でも使えます。pg_restore -Cの-d作り直すデータベースではなく、作業用に接続する既存のデータベースを指定します。
論理バックアップで PITR はできない
PITR にはベースバックアップと、途切れない WAL アーカイブが必要です。
PostgreSQL 14 に
recovery.confはない設定は
postgresql.confに書き、recovery.signal(スタンバイならstandby.signal) を置きます。非排他的モードはセッションを切らない
pg_start_backupとpg_stop_backupは同じセッションで呼びます。backup_labelは自分で保存します。COPYと\copyのファイルの場所COPYはサーバー側、\copyはクライアント側のファイルです。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- LPI-Japan「OSS-DB Silver」(出題範囲)
- PostgreSQL 14 文書「バックアップとリストア」
- PostgreSQL 14 文書「継続的アーカイブとポイントインタイムリカバリ」
- PostgreSQL 14 文書「COPY」
コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。