論理バックアップはpg_dumpコマンドまたはpg_dumpallコマンドで取得します。中央管理ノードとデータノードそれぞれに対して取得し、中央管理ノード、データノードの順番でリストアします。
シャードに紐付いたテーブル空間、レプリケーションテーブル、全ノード対象のオブジェクトは、中央管理ノード経由でリストアします。これらのデータベースオブジェクトをリストアする場合、中央管理ノードとデータノードの両方をセットアップしてからリストアしてください。
論理バックアップの注意事項
全ノード対象のオブジェクトについて、一部のノード上でのみその定義を変更した場合、変更内容は復元されません。各ノードの全ノード対象のオブジェクトは中央管理ノードの定義内容で復元されます。以下にリストア時の挙動の例を示します。
一部のデータノードでのみ全ノード対象のオブジェクトを削除していた場合、復元時に全ノードにオブジェクトが定義されます。
全ノード対象のテーブルに対し、中央管理ノードでのみ列を追加していた場合、復元時にデータノードの全ノード対象のオブジェクトに対しても列が追加されます。
複数のデータノードにまたがる業務を実行中にバックアップを取得する場合は、ノード間で取得するバックアップの整合性を保つため、pgx_scaleout_lock_for_backup()を実行中に、各データノードのバックアップを取得してください。このとき、複数のノードにまたがる業務はバックアップを取得している間、ブロックされます。バックアップを取得する粒度が大きいほど、業務をブロックする時間が増えるため、ブロックする時間を減らす場合、バックアップを取得する粒度を小さくしてください。
複数ノードにまたがる業務を実行中にバックアップを取得する場合、pgx_scaleout_lock_for_backup()を実行し、TwoPhaseCommitLockを取得してから、pg_dumpall/pg_dumpコマンドによってバックアップを取得します。このときpg_dump/pg_dumpallコマンドはACCESS SHAREを取得します。postgres_scaleout_fdwでは、全ノード対象のオブジェクトに対してALTER/DROP文を発行した場合、中央管理ノードでACCESS EXCLUSIVEを取得してから、TwoPhaseCommitLockを取得します。ACCESS SHAREとACCESS EXCLUSIVEは競合するため、全ノード対象のオブジェクトに対してALTER/DROP文を発行した場合、デッドロックになりpg_dump/pg_dumpallコマンドの処理が継続できません。--lock-wait-timeoutを指定した場合は、指定した時間経過後、pg_dump/pg_dumpallコマンドが失敗します。そのため、複数ノードにまたがる業務を実行中にバックアップを取得する場合、全ノード対象のオブジェクトに対して、ALTER/DROP文を発行しないようにしてください。
スケールアウトで提供する以下のデータベースオブジェクトの論理バックアップについては、plain形式のみサポートします。
シャード
シャード表
レプリケーションオブジェクト
レプリケーションテーブル
全ノード対象のオブジェクト
スケールアウト環境では、pg_dumpallの--cleanオプションはサポートしません。
PGXNODEのバックアップとリストア
PGXNODEのバックアップを取得する場合、pg_dumpallコマンドまたはpg_dumpコマンドに--dump-pgxnodesオプションを指定してバックアップを取得してください。共有ユーザーマッピングをバックアップに出力する場合、--dump-shared-user-mappingsを追加で指定してください。
シャードのバックアップとリストア
シャードとシャードに紐付いたテーブル空間のバックアップを取得する場合、pg_dumpallコマンドを使用して、中央管理ノードとデータノード両方のバックアップを取得してください。
中央管理ノードに対しては--dump-shardsオプションを、データノードに対しては--no-shard-tablespacesオプションを指定してバックアップを取得してください。
以下に複数ノードで業務を実行中にバックアップを取得する手順を示します。
シャードをバックアップに含める場合、中央管理ノードに対してpg_dumpall --dump-shardsを実行して中央管理ノードのバックアップを取得します。テーブル空間とシャードを含めない場合はこのオプションを指定せずにpg_dumpallコマンドを実行します。
中央管理ノードでpgx_scaleout_lock_for_backup()を実行します。
pg_dumpallコマンドを使用して データノードのバックアップを取得します。
2.のセッションで実行中のpgx_scaleout_lock_for_backup()をキャンセルします。
以下にリストアの手順を示します。
リストア先の中央管理ノードとデータノードを起動します。
中央管理ノード、データノード上にシャード表が存在する場合、削除します。
取得したバックアップを使用して中央管理ノードにリストアします。
取得したバックアップを使用してデータノードにリストアします。
レプリケーションテーブルのバックアップとリストア
レプリケーションテーブルのバックアップを取得する場合、中央管理ノードに対してpg_dumpallコマンドまたはpg_dumpコマンドを実行して、バックアップを取得してください。
レプリケーションオブジェクトをバックアップに出力する場合、--create-replication-objectオプションを指定してバックアップを取得してください。
なお、--create-replication-objectオプションによって出力されるpgx_create_replication_object()のsynchronous_commitにはonが設定されるので、synchronous_commitを変更する場合、リストア後にpgx_alter_replication_object()で変更してください。
以下にバックアップの取得手順を示します。
中央管理ノードに対してpg_dumpallコマンドまたはpg_dumpコマンドに --create-replication-objectを指定して、バックアップを取得します。
以下にリストアの手順を示します。
リストア先の中央管理ノードとデータノードを起動します。
PGXNODEを定義します。
中央管理ノード上にレプリケーションテーブル、レプリケーションオブジェクトが存在する場合はすべて削除します。
取得したバックアップを使用して中央管理ノードをリストアします。
全ノード対象のオブジェクトのバックアップとリストア
全ノード対象のオブジェクトのバックアップを取得する場合、中央管理ノードに対して--dump-set-pgx-ddl-target-nodeオプションを指定してバックアップを取得してください。
リストア先のノード上にすでにリストア対象の全ノード対象オブジェクトが定義されている場合、リストアする前に予めそのオブジェクトを削除してください。
また、全ノード対象として作成したロールまたはデータベースをリストアする場合、initdbスーパーユーザーでリストアしてください。
以下にバックアップの取得手順を示します。
中央管理ノードに対してpg_dumpallコマンドまたはpg_dumpコマンドに--dump-set-pgx-ddl-target-nodeオプションを指定して、バックアップを取得します。
中央管理ノードでpgx_scaleout_lock_for_backup()を実行します。
pg_dumpallコマンドまたはpg_dumpコマンドを使用してデータノードのバックアップを取得します。
2.のセッションで実行中のpgx_scaleout_lock_for_backup()をキャンセルします。
以下にリストアの手順を示します。
リストア先の中央管理ノードとデータノードを起動します。
取得したバックアップを使用して中央管理ノードにリストアします。
取得したバックアップを使用してデータノードにリストアします。
物理バックアップを使用したリカバリでは、下記の2つのケースがあります。
ディスク障害からのリカバリ
特定のノードでディスク障害が発生した場合、障害が発生したノードで最新状態にリカバリしてください。
ユーザーの誤操作からのリカバリ
ユーザーの誤操作により、過去の時点にデータを戻す必要がある場合、全ノードで並列にリカバリを実施してください。このとき、全ノードで、同一の整合性のあるリカバリポイント、または、同一時刻にリカバリしてください。特定のノードのみ過去の時点に戻すと、トランザクションが不整合な状態となってしまうため、必ず全ノードでリカバリを実施してください。
全ノードで同一時刻にリカバリする場合、リカバリ中にいずれかのノードに異常が発生した場合には、残りのノードのリカバリが終了しません。その場合、残りのノードのリカバリを強制停止した後に、再度、全ノードで同一時刻にリカバリを実施してください。
pgx_rcvallコマンドを使用せずにリカバリする場合は、下記の作業が必要です。
中央管理ノードをリカバリする場合、リカバリ完了後に、全データノードに対して、“5.13.4 レプリケーションテーブルの復旧”を実施してください。これは、中央管理ノードのリカバリが完了すると、レプリケーションオブジェクト内部のレプリケーションスロットが削除されてしまうためです。
なお、pgx_rcvallコマンドを使用している場合は、内部でレプリケーションテーブルの復旧を実施するため、この作業は不要です。
時刻を指定して過去の時点にリカバリする場合、リカバリ開始前に、全ノードのpostgresql.confのwal_arbiterパラメータを'on'に設定してください。そして、リカバリ完了後に、全ノードのpostgresql.confのwal_arbiterパラメータを'off'に設定し、全ノードで再起動を実施してください。wal_arbiterパラメータを'on'に設定することで、複数のノードを更新するトランザクションの整合性を保ちながらリカバリを実施します。これにより、リカバリ完了後に、あるノードはトランザクションのcommit前で、別のノードはトランザクションのcommit後といった不整合な状態を防止できます。リカバリは、指定した時刻より前で、ノード間の整合性がとれている最も新しい時点にリカバリされます。
なお、pgx_rcvallコマンドを使用している場合は、内部でwal_arbiterパラメータを'on'や'off'に設定するため、この作業は不要です。
recovery_target_xidおよびrecovery_target_lsnを指定したリカバリは未サポートです。