OCI PostgreSQLデータ同期: 初期ロード(ダンプ/リストア)およびCDCとpglogical (2026/03/12)

OCI PostgreSQLデータ同期: 初期ロード(ダンプ/リストア)およびCDCとpglogical (2026/03/12)

https://blogs.oracle.com/cloud-infrastructure/oci-psql-sync-init-load-dump-restore-cdc-pglogical

投稿者:Kaviya Selvaraj

1.1. はじめに

組織は、アプリケーションの稼働時間を確保し、環境間でデータの一貫性を維持するために、シームレスなデータ移行とリアルタイムレプリケーションへの依存度を高めています。堅牢な論理レプリケーション拡張機能を備えたOCI PostgreSQLは、大量データ転送と変更データキャプチャ(CDC)の両方に対応する柔軟なソリューションを提供します。

pg_dumpおよびpg_restoreをpglogical (またはネイティブ論理レプリケーション)と組み合せて利用すると、OCI PostgreSQLデータベースで停止時間がほぼゼロの移行と効率的なCDCが可能になります。pg_dump/pg_restoreは、最初のフル・データ・ロードを管理し、pglogicalは、このプロセス中およびプロセス後に進行中の変更を取得します。

OCI PostgreSQL移行ワークフローでは、初期ロードにpg_dumpとrestoreを使用し、CDCにはpglogicalを使用します。


このガイドでは、信頼性の高いアプローチについて説明します。まず、初期データ移行にはpg_dumppg_restoreを使用し、その後、継続的な増分レプリケーションのためにpglogicalを設定します。この方法により、ダウンタイムを最小限に抑え、ソース OCI PostgreSQL データベースとターゲット OCI PostgreSQL データベース間のデータの一貫性を確実に維持できます。

このチュートリアルでは OCI PostgreSQL に焦点を当てていますが、ネットワークの到達可能性、適切な権限、必要な拡張機能のサポートなどの前提条件が満たされている限り、他のクラウド プロバイダーまたはオンプレミスで実行されている PostgreSQL でも同じパターンが機能します。

1.2. ステップ1:初期データロード – ソースデータベースからのエクスポート

信頼性の高いレプリケーション設定は、一貫性のある完全なデータスナップショットから始まります。最初のステップは、ソースOCI PostgreSQLデータベースからグローバルオブジェクト、データベーススキーマ、そして実際のデータをエクスポートすることです。

1.2.1. グローバルオブジェクト(ロールなど)のエクスポート

テーブルスペース情報を含めずにアクセス制御を保持するために、ユーザー、グループ、および権限をエクスポートします。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
pg_dumpall -U psql -h <source_ip_address> -g --no-role-passwords --no-tablespaces -f global_role_object.sql</source_ip_address>
  • -g: グローバルオブジェクトのみをダンプし、データベースはダンプしません。
  • –no-role-passwords: このフラグを使用すると、パスワードのダンプを回避できます。
  • –no-tablespaces: OCI PostgreSQL Database はインプレース テーブルスペースのみをサポートします。

1.2.2. データベーススキーマのエクスポート

スキーマのみのダンプを生成します。これには構造(テーブル、インデックス)は含まれますが、データは含まれません。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
pg_dump -U psql -h <source_ip_address> -s -C -E 'UTF8' -d <database_name> -f schema_dump.sql</database_name></source_ip_address>
  • -U: ダンプを作成するユーザー
  • -h: ソースデータベースのホストアドレス。
  • -s: スキーマのみをダンプし、データはダンプしない
  • -C: CREATE DATABASE ステートメント。
  • -E: ダンプファイルのクライアントエンコーディングをUTF-8に設定します。
  • -d: ダンプするデータベース。
  • -f: データベーススキーマをダンプする O/p ファイル

1.2.3. テーブルデータのエクスポート

スキーマの詳細を除き、テーブルデータをすべて抽出します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
pg_dump -U psql -h <source_ip_address> -a -E 'UTF8' -d <database_name> -f data_dump.sql</database_name></source_ip_address>
  • -a: スキーマではなくデータのみをダンプします

1.3. ステップ2:初期データロード – ターゲットデータベースへのインポート

データのエクスポートが完了したら、次の段階はデータをターゲットサーバーに復元することです。

1.3.1. グローバルオブジェクトのインポート

ユーザーアカウント、グループ、および関連する権限を再作成します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
psql -U psql -d postgres -h <target_ip_address> -f global_role_object.sql</target_ip_address>

注記:

  • OCI PostgreSQLデータベースシステムの管理者ユーザーにはSUPERUSER権限がないため 、CREATE USERダンプ内のステートメント  からNOSUPERUSER、NOREPLICTIONなどを削除する必要があります。
  • グローバルダンプファイルに必要な変更を加えて、SUPERUSER権限を必要とするコマンドをすべて削除します。例:ALTER ROLE/USER test WITH NOSUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'test';
  • 次のように変更する必要があります:ALTER ROLE/USER test WITH LOGIN PASSWORD 'test';

1.3.2. データベーススキーマのインポート

対象システム上にデータベース構造を作成します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
psql -U psql -d postgres -h <target_ip_address> -f schema_dump.sql</target_ip_address>

注:先に進む前に、権限の不一致やオブジェクトの不一致に関するエラーをすべて修正してください。

1.3.3. テーブルデータのインポート

エクスポートされたデータをターゲット テーブルに入力します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
psql -U psql -d postgres -h <target_ip_address> -f data_dump.sql</target_ip_address>

詳細については、pg_dumpおよびpg_restoreを使用したデータの移行 に関する公式 OCI ドキュメントを参照してください

1.4. ステップ3:変更データキャプチャ(CDC)用にpglogicalを設定する

両環境が同期されたら、pglogicalを使用して、進行中の変更をソースからターゲットへリアルタイムで複製します。これにより、データの完全ロードを繰り返すことなく、スムーズな増分更新が可能になります。

1.4.1. ソースデータベース – プロバイダとして設定する

1.4.1.1. プロバイダノードを作成する

ソースデータベースを論理レプリケーションプロバイダとして確立します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=source_fqdn port=5432 user=psql password=xxxx dbname=postgres'
);

1.4.1.2. レプリケーションセットの作成

複製する変更の種類(挿入、更新、削除、切り捨て)を指定します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT pglogical.create_replication_set(
'default1',

replicate_insert := true,

replicate_update := true,

replicate_delete := true,

replicate_truncate := true

);

1.4.1.3. すべてのテーブルをレプリケーションセットに追加する

パブリックスキーマのすべてのテーブルをレプリケーションセットに含める。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT pglogical.replication_set_add_all_tables('default1',ARRAY['public']);

1.4.2. 対象データベース – サブスクライバーとして設定する

データ損失なくCDCを確立するには、レプリケーション開始点をダンプスナップショットと同期させる必要があります。

1.4.2.1. サブスクライバーノードの作成

ターゲットを論理レプリケーションノードとして構成します。

a. サブスクライバーノードの作成:
ターゲットを論理レプリケーションノードとして定義します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT pglogical.create_node( node_name := 'subscriber1', dsn := 'host=target_fqdn port=5432 user=psql password=xxx dbname=postgres' );

b. サブスクリプションの作成:初期データコピーなしで
サブスクリプションを作成します。プロバイダーノードからの変更を購読します。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT pglogical.create_subscription( subscription_name := 'subscription1', provider_dsn := 'host=source_fqdn port=5432 user=psql password=xxx dbname=postgres', replication_sets := ARRAY['default'], synchronize_data := false );
  • synchronize_data := falseデータは既に最初のダンプ/リストアによってロードされているため、新しい変更のみが複製されます。

この時点で、CDC が流れ始めます

1.4.3. サブスクリプションのステータスを確認する:

以下のコマンドを使用して、購読状況を確認してください。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SELECT * FROM pglogical.show_subscription_status();

ステータスにサブスクリプションが表示されるはずですreplicating

1.5.重要な考慮事項:

次のセクションでは、CDCpg_dump for initial loadと組み合わせて使用​​する際の重要な考慮事項について説明します。pglogical

  • pglogical での初期データ同期を無効にする
    設定synchronize_data = falseにより、pglogical が既にロードされたデータを再コピーするのを防ぎますpg_dump
  • プライマリキーまたはレプリカIDの検証
    論理レプリケーションでは、行の変更を正確に追跡するために、プライマリキーまたは定義済みのレプリカIDが必要です。
  • 配列同期の計画
    移行中に配列の同期がずれる可能性があるため、CDCの追いつき後に検証および同期を行う必要があります。
  • スキーマ変更は手動で処理してください。pglogical
    はDDLの変更を複製しません。すべてのスキーマ変更は、ターゲット上で個別に適用する必要があります。
  • 大規模テーブルのダンプとリストアを最適化する。
    カスタム形式のダンプと並列リストアを使用して、大規模データセットの移行時間を短縮します。
  • リストア後にVACUUMとANALYZEを実行し、
    ターゲットデータベースの統計情報を更新して、最適なクエリパフォーマンスを確保してください。
  • 切り替え前にデータを検証する。
    行数、シーケンス値、サンプルデータを比較して、一貫性を確認する。
  • 計画的な切り替えを行うには、
    ソース側での書き込みを一時停止し、CDCが完全に追いつくまで待ってから、アプリケーションをターゲット側にリダイレクトします。
  • テストのロールバックと復旧戦略
    移行後に問題が検出された場合に備えて、必ず代替案を用意しておきましょう。

1.6. 結論

要約すると、OCI PostgreSQLのネイティブツールを初期データロードに活用しpg_dumppg_restorepglogicalのリアルタイム変更データキャプチャ(CDC)機能を組み合わせることで、データベースの移行と同期のための堅牢かつ柔軟なソリューションが実現します。このアプローチにより、ターゲット環境は一貫性のあるデータセットから開始し、ソースからの継続的な変更にシームレスに対応して最新の状態を維持できます。

このガイドに記載されている詳細な手順に従うことで、チームはダウンタイムを最小限に抑え、データ損失のリスクを軽減し、高可用性とデータ統合の両方のユースケースに対応できる信頼性の高い基盤を構築できます。いつものように、本番環境に展開する前に、管理された環境でこれらの手順をテストし、組織のセキュリティおよびコンプライアンス要件に合わせて構成を調整することが不可欠です。

追加リソース

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

ミリ秒の問題: BCCグループとOCIが市場データ・パフォーマンスを再定義する方法(AWSに対するベンチマークを使用) (2025/11/13)

OCIサービスを利用したWebサイトの作成 その4~Identity Cloud Serviceでサイトの一部を保護 (2021/12/30)