sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLバックアップの自動テスト

    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に使用できるようになります。


    1. JDBCPreparedStatementへのパラメーターの受け渡し

    2. Microsoft SQL Serverエラー926を修正する方法?-解決しました

    3. SQLでテーブルの最後のレコードを選択するにはどうすればよいですか?

    4. InnoDBテーブルを修復するにはどうすればよいですか?