OCI Database with PostgreSQLのメジャー・バージョン・アップグレード・ガイド

pg_dump/pg_restoreまたはpglogicalアプローチを使用して、OCI Database with PostgreSQLのメジャー・バージョンをアップグレードします。

OCI Database with PostgreSQLは、Oracle Cloud上でPostgreSQLを実行するためのフルマネージド・サービスであり、基盤となるインフラストラクチャの管理に関連する運用オーバーヘッドを削減するように設計されています。自動化されたプロビジョニング、サポートされるパッチ適用、自動バックアップおよび統合監視機能により、日々の管理を合理化します。

最新のOCI PostgreSQL環境を維持することは、最新のパフォーマンス改善、セキュリティ更新、および新機能を利用するために重要です。

サポートされているPostgreSQLのメジャー・バージョンは、14、15、16および17です。

メジャー・バージョン・アップグレードで一般的に採用されている次のアプローチは、データを移行し、アプリケーションを新しいバージョンに移行するための構造化された反復可能な方法を提供します。

pg_dumpとpg_restore

pg_dumpおよびpg_restoreを使用したOCI PostgreSQLのアップグレードは、特にメジャー・バージョン・アップグレードの実行時や環境間の移行時に、シンプルで信頼性の高いアプローチです。この方法により、データベース・オブジェクトとデータの両方のクリーンで制御された移行が保証されます。ロール、並列処理および検証を適切に処理することで、スムーズで制御された移行プロセスが保証されます。

このドキュメントでは、正確なコマンドを使用して完全なアップグレード・プロセスについて説明します。

重要なノート

  • pg_dumpおよびpg_restoreは、論理バックアップ・ツールです。
  • メジャー・バージョン・アップグレードに適しています。
  • 最終スイッチオーバー中の停止時間が必要です。
  • ロールは常に個別に処理する必要があります。

ワークフローのアップグレード

pg_dumpおよびpg_restoreを使用したアップグレード・プロセスは、次のステップで構成されます。

  1. ステップ1: グローバル・オブジェクトのダンプ(ロール)

    このステップにより、すべてのロール、権限およびアクセス制御が保持され、ユーザーおよびアプリケーションがアップグレード後に一貫したアクセスを維持できるようになります。

  2. ステップ2: データベースのダンプ

    このステップでは、データベースの完全な論理バックアップを作成し、アップグレードされた環境にデータを転送するための信頼できる方法を提供します。

  3. ステップ3: グローバル・ダンプ・ファイルの変更

    このステップでは、必要に応じてダンプを確認および調整できるため、ターゲットのPostgreSQLバージョンとの互換性とよりスムーズなリストア・プロセスを確保できます。

  4. ステップ4: グローバル・オブジェクトのリストア

    最初にロールをリストアすると、データが再導入される前に適切なユーザーおよび権限が確保され、一貫性のあるセキュアな環境がサポートされます。

  5. ステップ5: データベースのリストア

    このステップでは、アップグレードされたシステムにデータを取り込み、移行を完了し、データベースを新しいPostgreSQLバージョンで使用できるようにする。

ステップ1: グローバル・オブジェクトのダンプ(ロール)

最初に、ソース・データベースからロールおよびグローバル・オブジェクトをエクスポートします(以前のバージョン)。

/usr/lib/postgresql/bin/pg_dumpall -U psql -h <IP_of_Source_DB> -g --no-role-passwords --no-tablespaces -f <all_roles>.sql
  • -g: ロールやユーザーなどのグローバル・オブジェクトをダンプします。

    このオプションは、データベース固有のデータではなく、ロール、ユーザー、およびそれらに関連付けられた権限などのクラスタ全体のオブジェクトの抽出に重点を置いています。これらの要素を個別に取得すると、ターゲット環境でアクセス制御を一貫して再作成できるようになります。

  • --no-role-passwords: パスワード関連の問題を回避します

    これにより、特にパスワード・ポリシーまたは認証方法が環境間で異なる場合に、リストア・プロセスを簡素化するのに役立つロール・パスワード定義がダンプから除外されます。また、アップグレード後に必要に応じて資格証明を再構成する柔軟性も備えています。

  • --no-tablespaces: 表領域の依存性の問題を防止します

    これにより、ダンプから表領域定義が省略され、ターゲット環境に存在しない可能性のある特定の記憶域構成への依存性が回避されます。これにより、リストア・プロセスの移植性が向上し、OCI管理のストレージへの適応が容易になります。

  • -f <all_roles>.sql: 再利用のために出力をファイルに書き込みます

    これにより、出力がSQLファイルに送られ、リストア・フェーズで確認、バージョン管理、再利用が容易になります。グローバル・オブジェクト用に別のファイルを設定すると、より制御されたステップワイズ・アップグレード・プロセスもサポートされます。

ステップ2: データベースのダンプ

次のディレクトリ形式を使用してデータベース・ダンプを取得します。

/usr/lib/postgresql/bin/pg_dump -v -h < IP_of_Source_DB > -U <username> -d <databasename> -Fd -C -j <Num of parallel jobs> -Z0 -f sampledb_dir_format
  • -Fd: ディレクトリ形式(複数のファイルを作成)

    -Fd (ディレクトリ形式)オプションは、パラレル・ダンプ(-j)をサポートし、大規模なデータベースのパフォーマンスを向上させ、個々のオブジェクトのより粒度が高く柔軟なリストアを可能にするため選択されています。この形式では、ダンプが単一のアーカイブではなく複数のファイルを含むディレクトリとして格納されます。パラレル処理をサポートし、特に大規模なデータベースの場合、リストア時の柔軟性を高めます。

    または、カスタム・フォーマット(-Fc)は、単一ファイル・バックアップを優先し、圧縮および選択的リストア機能をサポートする場合に使用できます。

  • -C: データベース作成コマンドを含む

    このオプションでは、リストア中にデータベースを作成するために必要な文が追加され、ターゲット環境での設定プロセスが合理化されます。

  • -j : パラレル・ジョブを有効にしてダンプを高速化します。

    これにより、ダンプ操作で複数のジョブを同時に実行できるため、大規模なデータセットに必要な全体的な時間が大幅に短縮されます。

  • -Z0: 圧縮なし(パフォーマンスの向上)

    圧縮を無効にすると、CPUオーバーヘッドを削減することでダンプパフォーマンスを向上させることができます。これは、速度が優先され、ストレージ制約が最小限の場合に有益です。

  • -v: 進行状況をモニターする冗長モード

    このオプションは、実行中に詳細な出力を提供し、ダンププロセスの早期に進行状況を追跡し、問題を特定しやすくします。

ステップ3: グローバル・ダンプ・ファイルの変更

ロールをリストアする前に:

次のガイダンスに基づいて、必要に応じて<all_roles>.sqlファイルを変更します。

ロール・ダンプ・ファイルから次のものを削除します。

  • oci_*で始まるロールのすべてのCREATE, ALTER ROLE,GRANT
  • サポートされていないロール属性(特にOCI PostgreSQLなどのマネージド・サービス)
  • 新しいバージョンのデータベースをプロビジョニングするときに再作成する必要があるため、初期OCI PostgreSQLデータベース設定中に作成された管理ユーザーに対するすべてのCREATEおよびALTER ROLE文。別の管理ユーザー名を使用する場合は、アップグレードしたOCI PostgreSQLデータベースの作成時に適切な管理ユーザーが指定されていることを確認してください。

さらに、ロール・ダンプ・ファイルを更新して、SUPERUSER権限が必要なコマンドを削除または変更します。これらは管理対象環境ではサポートされないためです。

次に例を示します。

オリジナル:

ALTER ROLE test WITH NOSUPERUSER INHERIT CREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'test';

変更日:

ALTER ROLE/USER test WITH CREATEROLE CREATEDB LOGIN PASSWORD 'test';

ステップ4: グローバル・オブジェクトのリストア

ターゲット・データベース・システム(後のバージョン)でロールをリストアします。

/usr/lib/postgresql/bin/psql -U <username> -d <databasename> -h <IP_of_Target_Database_System> -f <all_roles>.sql

このステップにより、次のことが保証されます。

  • すべてのユーザーおよびロールが作成されます。
  • データ・リストア前に権限を使用可能

ステップ5: データベースのリストア

toc.datダンプ・ファイルの次のものは無視します。

  • 名前がoci_*で始まるロールでは、すべてのCREATEALTER ROLEおよびGRANT文が失敗します。

次を使用して、ターゲット・データベース・システム上のデータベースをリストアします。

/usr/lib/postgresql/bin/pg_restore -v -h <IP_of_Target_Database_System> -U <username> -j <Num of parallel jobs> -C -d <databasename> sampledb_dir_format
  • -C: データベースを作成し、そのデータベースに接続してデータベースにリストアします。
  • -j: パラレル・リストアによる実行の高速化
  • -v: 進行状況を追跡するための詳細出力

このステップにより、次のことが保証されます。

  • 詳細な出力でERROR:メッセージを確認し、コマンドがシェル終了コード0で完了していることを確認します。oci_*ユーザーに関連するエラーは無視できます。
ノート

複数のデータベースがある環境では、完全で一貫性のあるアップグレード・プロセスを確実にするために、データベースごとに前述のコマンドを個別に実行することをお薦めします。

パフォーマンスに関する考慮事項

  • 使用可能なCPUに基づいて、より高い-j値を使用します。
  • ダンプ中に-Z0を使用すると、パフォーマンスが向上します。
  • 十分なディスクI/O容量を確保する
  • 詳細ログを使用してリストアの進行状況を監視する

リストア後の検証

リストアが完了したら、次のタスクを実行します。

  • 行数の検証

    このタスクは、すべてのデータが正常に移行されたこと、およびソース・データベースとターゲット・データベースの間に相違がないことを確認するのに役立ちます。

  • アプリケーション接続の確認

    このタスクにより、アプリケーションは、アップグレードされたデータベースを想定どおりに接続して操作できるようになります。

  • ロールと権限の検証

    このタスクは、ユーザーおよびロールが新しい環境で適切なアクセスおよび権限を持っていることを確認するのに役立ちます。

  • 各データベースに対して次のコマンドを実行します。
    VACUUM ANALYZE <database_name>;

    このコマンドは、問合せプランナで使用される内部統計の更新に役立ち、OCI PostgreSQLは現在のデータに基づいてより効率的な実行計画を生成できます。また、リストア後の全体的なパフォーマンスの最適化(特に、複雑な問合せを使用する大規模なデータベースまたはワークロードの場合)にも役立ちます。

pglogical

pglogical拡張により、複数のOracle Cloud Infrastructure (OCI) PostgreSQLデータベース・システム間の論理レプリケーションが可能になります。この拡張機能は、クロスバージョンPostgreSQLレプリケーションをサポートしているため、最小限のダウンタイムでデータベース・アップグレードを実行するための適切で堅牢なアプローチとなっています。ソース・システムとターゲット・システム間の論理レプリケーションを有効にすることで、アプリケーションの可用性を維持しながら、バージョン間でシームレスにデータを移行できます。

pglogicalは、次の状況で特に役立ちます。

  • メジャー・バージョンのアップグレード
  • 環境間移行

pglogicalでは、次の間でシームレスなデータ同期が可能です。

  • 異なるOCIリージョンおよび可用性ドメインにわたるPostgreSQLインスタンス
  • 異なるVirtual Cloud Networks (VCNs)にデプロイされたデータベース
  • 複数のクラウド・プロバイダにわたるマネージドPostgreSQLサービス
  • セルフマネージドPostgreSQLインスタンス(クラウドまたはオンプレミス)

この柔軟性により、pglogicalデータベースのアップグレード、移行およびハイブリッド・デプロイメントのための強力なソリューションになります。

ネットワーク接続の要件

  • 両方のデータベース・システムが同じVCN内にある場合、接続は自動的に使用可能になります。
  • If databases are in different VCNs within the same region, configure the Local Peering Gateway (LPG) to establish communication.
  • データベースが異なるリージョン内の異なるVCNsにある場合は、動的ルート・ゲートウェイ(DRG)を構成して通信を確立します。

ソースおよびターゲット・データベース・システムでのpglogical拡張の有効化

ソース(以前のバージョン)データベースとターゲット(後のバージョン)データベースの両方で次のステップを実行します。

  1. Oracle Cloudコンソールにサインインし、OCI PostgreSQLデータベース・システムに移動します。
  2. 構成ファイルにアクセスして、構成を変更します。
  3. 「構成のコピー」を選択し、必要なパラメータを更新します。「ユーザー変数(読取り/書込み)」で、次の手順を実行します。
    • wal_level = logical
    • track_commit_timestamp = 1
  4. 拡張の有効化: 「拡張機能の構成」で、pglogicalを選択し、構成を作成します
  5. データベース・システムにナビゲートし、「構成」「編集」を選択して、以前に作成した構成をデータベース・システムに適用します。

    データベース・システムの状態は、最初は更新中です。「アクティブ」になるまで待ってから続行します。

    この構成では、必要な設定および拡張を有効にすることで、両方の環境を論理レプリケーション用に準備し、アップグレード・プロセス中にpglogicalがソース・データベースとターゲット・データベース間で変更を確実に取得および同期できるようにします。

  6. データベース・システムがアクティブになったら、データベースに接続し、次の問合せを使用して有効な拡張機能を確認します。
    SHOW oci.admin_enabled_extensions;
  7. 次のコマンドを使用して、pglogical拡張を作成します。
    CREATE EXTENSION pglogical;

ソース・データベースの構成

管理ユーザー(OCI PostgreSQLデータベースの作成時に指定したユーザー)としてログインし、論理レプリケーションを有効にするために必要な権限を付与します。

alter role xxx with replication; 
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to xxx ; 
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx ; 
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx;

xxxは、データベース・システムのプロビジョニング中に作成されたサンプル・ユーザーです。

ソースでのpglogicalの設定(Publisher)

  1. ソース・データベースにパブリッシャ・ノードを作成します。
    SELECT pglogical.create_node(node_name := 'provider1', dsn := 'host=<source_database_fqdn> port=5432 user=xxx password=xxxxx dbname=pglogical_source');
    • node_name: ソース・データベースに作成するパブリッシャの名前を指定します。
    • host: ソース・データベースの完全修飾ドメイン名(FQDN)を入力します。
    • port_number: ソース・データベースが稼働しているポートを指定します。
    • database_name: パブリケーションを作成するデータベースを指定します。
  2. publicスキーマ内のすべての表をデフォルトのレプリケーション・セットに追加します。
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);

ターゲット・データベースの構成

管理ユーザー(OCI PostgreSQLデータベースの作成時に指定したユーザー)としてログインし、論理レプリケーションを有効にするために必要な権限を付与します。

alter role xxx with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to xxx ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx;

xxxは、データベース設定時に作成されるサンプル・ユーザーです。

ノート

管理ユーザーはOCI PostgreSQL 16以降からデフォルトでレプリケーション・ロールを継承するため、OCI PostgreSQLデータベース・バージョン16以降の管理ユーザーに対するalter role ...replicationコマンドは無視してください。

続行する前に、次のことを確認してください。

  • 必要なすべてのスキーマおよびオブジェクトがターゲットに存在します

    アイテムには、スキーマ、表、索引、拡張機能および必要なデータベース・オブジェクトが含まれます。これらを設定することで、依存関係の欠落によるエラーなしでレプリケーション操作またはリストア操作を続行できます。スキーマ・リストを比較し(たとえば、\dnおよび\dtをpsqlで使用)、必要な拡張がソースとターゲットの両方にインストールされていることを検証することで、存在を確認できます。

  • データベース構造がソースと一致する

    ターゲット・データベースは、スキーマ定義、オブジェクト名および全体的な構造に関して、ソースと密接に連携している必要があります。この一貫性は、スムーズなデータ移行をサポートし、同期中の競合や不整合の可能性を低減するのに役立ちます。スキーマ定義を確認するか(pg_dump --schema-onlyの使用など)、またはソース・システムとターゲット・システム間で表構造とオブジェクト数を比較して検証します。

ターゲットでのpglogicalの設定(サブスクライバ)

  1. ターゲット・データベースにサブスクライバ・ノードを作成します。
    SELECT pglogical.create_node(node_name := 'subscriber1', dsn := 'host=<target_database_fqdn> port=5432 user=xxx password=xxxxx dbname=pglogical_target');
    • node_name: ターゲット・データベースでサブスクライバの名前を定義します。
    • host: ターゲット・データベースの完全修飾ドメイン名(FQDN)を入力します。
    • port_number: ターゲット・データベースが稼働しているポートを入力します。
    • database_name: サブスクリプションが作成されるデータベースの名前を指定します
  2. バックグラウンド同期およびレプリケーション・プロセスを開始するためのサブスクリプションを作成します。
    SELECT pglogical.create_subscription(subscription_name := 'subscription1', provider_dsn := 'host=<source_database_fqdn> port=5432 user=xxx password=xxxxxx dbname=pglogical_source sslmode=require');
    • subscription_name: サブスクリプションの名前を指定します。
    • host: ソース・データベースのFQDNを指定します。
    • port_number: ターゲット・データベースが稼働しているポートを指定します。
    • database_name: ソース・データベースの名前を入力します。

レプリケーションの検証

  1. サブスクリプション・ステータス(ターゲット)の確認: 次の文を実行して、ターゲット・データベースのサブスクリプションのステータスを確認します。
    SELECT * FROM pglogical.show_subscription_status();
  2. レプリケーション・ステータス(ソース)の確認: 次の文を実行して、ソース・データベース上のレプリケーションのステータスを確認します。
    SELECT * FROM pg_stat_replication;

両方のチェックで、ラグまたは保留中の変更がないアクティブ・ステータスが示されている場合、この結果では、レプリケーションが完了し、ターゲット・データベースがソースと完全に同期していることが示されます。

詳細なステップおよび説明を含むpglogicalの詳細は、「pglogical拡張機能を使用したOCI Database with PostgreSQLのリージョン間の同期」を参照してください

まとめ

結論として、pg_dump/pg_restoreおよびpglogicalを使用したメジャー・バージョン・アップグレードでは、それぞれユース・ケースに応じて異なる利点があります。pg_dump/pg_restoreアプローチは、小規模なデータベースの場合、またはダウンタイムが許容される場合には簡単で信頼性が高くなりますが、大規模なデータセットの場合には時間がかかることがあります。これに対して、pglogicalでは、バージョン間でデータをレプリケートすることで、停止時間ほぼゼロのアップグレードが可能になり、大規模またはミッションクリティカルなシステムに適しています。

適切な方法を選択する方法は、データベース・サイズ、許容可能な停止時間、運用の複雑さなどの要因によって異なります。アプローチに関係なく、データの整合性を確保し、新しいOCI PostgreSQLバージョンにスムーズに移行するために、完全な計画、テストおよびアップグレード後の検証が重要です。