Kodrill

バックアップとリカバリ

OSS-DB Silver

pg_dump・pg_dumpall・pg_restore/ファイルシステムレベルのバックアップ/WAL とアーカイブ・PITR・pg_basebackup・非排他的低レベルバックアップ/COPY と \copy

問題数
21 問
合格ライン
70%
実行して確認済み
2 問
この分野の要点を読む7 章・約 8 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 16 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

バックアップとリカバリの要点

内容の確認日: 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 は何も書かない値、空文字列は "" になります。

SQL
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 はクライアント側のファイルです。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、PostgreSQL 14 で実際に実行して結果を確認しています。