PostgreSQL バックアップリストア(PITR)

https://www.postgresql.jp/document/11/html/continuous-archiving.html
第8回 バックアップ・リストア

データベース全体のバックアップ(ベースバックアップ)に加えて、運用中のアーカイブとして記録された更新データを利用してデータベースをリカバリする機能。
WAL = Write Ahead Log

データベースの更新を WALファイル(先行書き込みログ、16MB) に書き込む。
WALファイルをWALアーカイブにする。
リカバリ時には、ベースバックアップ+WALアーカイブ+未アーカイブのWALファイルを利用する。

WALファイルは、$PGDATA\pg_wal ディレクトリ配下に作成される。

前準備・設定

posgresql.confを修正し、WALアーカイブを有効にする。

  • posgresql.conf
    • wal_level = replica(デフォルト) または logical
    • archive_mode = on または always、デフォルトでは off
    • archive_command = 'cp %p /mnt/archivedir/%f'

バックアップ

データベース全体のバックアップ(ベースバックアップ)を取得。
物理バックアップ方式。

  1. pg_start_backup()
    1. $ cd $PGDATA
    2. $ psql -c "SELECT pg_start_backup('ラベル', true);"
    3. pg_start_backup()はチェックポイントの実行も行う。
  2. データベースクラスタのバックアップを取得。(OSのスーパーユーザー)
    1. $ tar czvf /mnt/backup.tar.gz data
  3. pg_stop_backup()
    1. $ psql -c "SELECT pg_stop_backup();"
受験対策

2.04_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法」
pg_start_backup()によりバックアップ開始を宣言して、OSコマンドによるバックアップを取得しているが、データベースを停止していないため、ホットバックアップ に分類される。
2.26_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法」
PostgreSQL 9.0からサポートされたストリーミングレプリケーションはPITRと同じ原理で動作しているので、PITRと同じ手順でベースバックアップを取得します。
PostgreSQL 9.1以降では pg_basebackup というコマンドが追加され、これを実行すると、pg_start_backup() → tarコマンドによる物理的バックアップ → pg_stop_backup() という一連の処理を自動的に実行することができるようになりました。
2.37_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法」
pg_basebackupコマンドは PITR、レプリケーション で利用する。
2.47_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法」
https://oss-db.jp/sample/silver_management_04/63_160419
2.84_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(ポイントインタイムリカバリ(PITR)の概念と手順)」
DROP TABLEで削除したテーブルを元に戻すことができる。
DROP USERで削除したユーザを元に戻すことができる。
DROP DATABASEで削除したデータベースを元に戻すことができる。
WALファイルを使用するという性質上、WALファイルに記録されない変更はPITRを使って元に戻すことができない。
2.102_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(ポイントインタイムリカバリの概念と手順)」
2.122_Silverの例題解説「S2 管理 - S2.4 バックアップ方法(ポイントインタイムリカバリ(PITR)の概念と手順))」
1.123_Silverの例題解説「運用管理 - バックアップ方法(トランザクションログ(WAL)とWALアーカイブ)」2.123_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(トランザクションログ(WAL)とWALアーカイブ)」

リストア

  1. ベースバックアップをリストア
    1. $ cd $PGDATA
    2. $ pg_ctl status
    3. $ mv $PGDATA /mnt
    4. $ tar xzvf /mnt/backup.tar.gz
  2. アーカイブのWALファイルをコピー
    1. $ rm -rf $PGDATA\pg_wal
    2. $ cp -r /mnt/data/pg_wal $PGDATA
  3. recovery.confファイルを設定してPostgreSQL を起動
    1. $PGDATA/recovery.conf ファイルを作成
      1. restore_command = 'cp /mnt/archivedir/%f %p'
    2. $ pg_ctl start