PostgreSQLデータベースの定期的なバックアップだけでは、災害復旧には不十分です。復元手順に必要な場合は、バックアップファイルにアクセスでき、正常であることを確認する必要があります。 PostgreSQLバックアップの自動テストを設定する方法の例をご覧ください。
pg_basebackupを使用して作成されたバックアップ
pg_basebackup バックアップには、データベースクラスターのデータディレクトリ全体が含まれます。このディレクトリは通常、tarballにパックされており、バックアップの開始以降に作成されたWALファイル用に追加のtarballが含まれる場合もあります。
このようなpg_basebackupをテストするには tarball、最初にtarballを空のディレクトリに解凍します。別のWALファイルtarballがある場合は、それをpg_wal
に解凍します。 新しいディレクトリ内のディレクトリ:
$ mkdir backup-test
$ cd backup-test
$ tar --no-same-owner xvf /path/to/base.tar.gz
$ mkdir -p pg_wal
$ cd pg_wal
$ tar --no-same-owner xvf /path/to/pg_wal.tar.gz
これで、このディレクトリのPostgreSQLサーバープロセスを開始できます。
$ pg_ctl -D path/to/backup-test start
(注: pg_ctl は、標準のPostgresディストリビューションに含まれているコマンドラインツールです。 psql などの他の含まれているツールと同様に、Postgres自体がどこにある場合でも利用できます。 およびpg_dump .pg_ctlの詳細については、こちらをご覧ください。)
このマシンにすでにPostgreSQLサーバーがインストール/実行されている場合は、デフォルトの5432以外のポートで起動することをお勧めします。
$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start
これまでにすべてが成功した場合は、復元されたデータベース内のデータが正常であるかどうかを確認する必要があります。データベースに対して実行する自動テストスクリプトがある場合は、この復元されたデータベースに対して少なくともいくつかのテストのセットを起動する良い機会です。そうでない場合は、psqlを使用していくつかのクイックチェックを一緒にハックできます:
$ psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
上記のコマンドは、存在するはずのテーブルに対して単純なクエリを実行します。 psqlのexitコードは、クエリが成功したかどうかを示します。もちろん、より複雑なクエリを実行したり、.sqlファイルを実行したり、このデータベースに接続してテストを実行する別のテストスクリプトを実行したりすることもできます。
テストが終了したら、次のコマンドでPostgresサーバープロセスを停止できます。
$ pg_ctl -D path/to/backup-test stop
そして、抽出されたデータベースクラスタディレクトリ全体をクリーンアップします:
$ rm -rf path/to/backup-test
すべてをまとめると、次のようになります。
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest backup
# TODO: copy out base.tar.gz and pg_wal.tar.gz of latest backup
# create a directory to work in
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
mkdir $BACKUP_DIR
# unpack the backup archives
tar -C $BACKUP_DIR --no-same-owner xvf /path/to/base.tar.gz
mkdir -p $BACKUP_DIR/pg_wal
tar -C $BACKUP_DIR/pg_wal --no-same-owner xvf /path/to/pg_wal.tar.gz
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/base.tar.gz /path/to/pg_wal.tar.gz
pg_dumpを使用して作成されたバックアップ
pg_dump ツール(docs)を使用してバックアップを作成することもできます。これは、 pg_basebackup とは対照的に、バックアップするデータベース/スキーマ/テーブルをオプションで選択できるという点でより柔軟性があります。 pg_basebackup これはオールオアナッシングのプロセスです。
pg_dumpを使用 、単一の.sql
を生成できます スクリプトまたはバイナリ.pgdmp
すべてのデータ(およびオプションで、テーブル/インデックスなどを作成するためのDDLステートメントも含む)を含むファイル。このようなファイルを復元するには、ライブデータベースサーバーに接続し、.sql/.pgdmpファイル内でSQLコマンドを実行する必要があります。通常のpsqlを使用できますが .sqlファイルを実行するには、 pg_restoreを使用する必要があります .pgdmpファイルを実行するコマンド(ドキュメント)。
このようなバックアップをテストするには、最初にファイルをフェッチしてから、新しい空のデータベースクラスターを作成します。
$ rm -rf path/to/backup-test
$ pg_ctl -D path/to/backup-test initdb
PostgreSQLサーバーを起動し、以前と同じようにポート6000でリッスンします。
$ pg_ctl -D path/to/backup-test -o "-p 6000 -k /tmp" start
pg_dumpを生成することが可能です 完全に自己完結型のファイルですが、そうでないように生成することもできます。したがって、ダンプの生成方法によっては、いくつかのセットアップ手順が必要になる場合があります。
- データベースを作成する
- テーブル、インデックスなどを作成します。
- 特権を付与する
それが完了したら、 psqlを使用できます。 またはpg_restore データを復活させるには:
# for .sql files
$ psql -p 6000 -h /tmp -v ON_ERROR_STOP=1 -1 -b -f path/to/dump.sql
# for .pgdmp files
$ pg_restore -p 6000 -h /tmp -d mydb -C -1 -f path/to/dump.pgdmp
以前と同様に、この時点で、保存されたデータの健全性を確認するためのテストを実行できます。
見た目は次のとおりです。
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest dump
# TODO: copy out the dump.sql or dump.pgdmp of latest backup
# create an empty database cluster
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
pg_ctl -D $BACKUP_DIR initdb
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# TODO: perform any specific setup steps here
# restore the file, .sql:
psql -p 6000 -h /tmp -v ON_ERROR_STOP=1 -1 -b -f path/to/dump.sql
# or .pgdmp:
pg_restore -p 6000 -h /tmp -d mydb -C -1 -f path/to/dump.pgdmp
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/dump.*
pg_dumpの復元中 バックアップでは、アプリケーションが行う場合と同様に、データがテーブルに挿入されます。外部サービスに接続して行の挿入を通知するトリガーがある場合は、復元手順中にそれらを無効にすることをお勧めします。
pg_dumpを呼び出す場合 SQLファイルを発行するには、オプション--disable-triggers
を使用できます。 pg_dumpに通知する 挿入中にトリガーを無効にするスクリプトを生成します。
pg_restoreを呼び出す場合 すでにトリガーがあるデータベースでは、--disable-triggers
を使用できます pg_restoreで 同じ効果を達成するために。
PITRテスト
PostgresのPoint-in-time-recovery(PITR)は、 pg_basebackupを使用して作成された完全バックアップに依存しています。 、およびその時点から回復したい時点までの一連のWALファイル。したがって、PITRのテストには、完全バックアップと後続のWALファイルのテストが含まれます。
自動バックアップテストの場合、特定のリカバリターゲットはありません。最後のバックアップ以降から最新のものまでのすべてのアーカイブされたWALファイルをテストする必要があります。これをテストする最も簡単な方法は、 pg_basebackupと同じ手順に従うことです。 たった1つの追加ステップでの試験方法。最新のバックアップを解凍した後、関連する利用可能なすべてのWALファイルをフェッチし、それらをpg_wal
に配置します。 Postgresサーバーを起動する前に。具体的には:
#!/bin/bash
# exit immediately if any step fails
set -eo pipefail
# fetch the latest backup
# TODO: copy out base.tar.gz and pg_wal.tar.gz of latest backup
# create a directory to work in
BACKUP_DIR=/tmp/backup-test
rm -rf $BACKUP_DIR
mkdir $BACKUP_DIR
# unpack the backup archives
tar -C $BACKUP_DIR --no-same-owner xvf /path/to/base.tar.gz
mkdir -p $BACKUP_DIR/pg_wal
tar -C $BACKUP_DIR/pg_wal --no-same-owner xvf /path/to/pg_wal.tar.gz
# --> this is the new extra step <--
# TODO: fetch all WAL files from the WAL archive since the last
# backup, and place them in $BACKUP_DIR/pg_wal
# start a new Postgres server for the cluster on port 6000
pg_ctl -D $BACKUP_DIR -o "-p 6000 -k /tmp" start
# perform a simple test
psql -p 6000 -d mydb -o /dev/null -c "select * from users limit 1"
# shutdown the server
pg_ctl -D $BACKUP_DIR stop
# cleanup the files
rm -rf $BACKUP_DIR /path/to/base.tar.gz /path/to/pg_wal.tar.gz
これにより、最後のバックアップと後続のWALファイルの両方が適切であるかどうかが確認され、必要に応じてPITRに使用できるようになります。