スキップしてコンテンツを表示

論理レプリケーションを使用して Aurora PostgreSQL 互換 DB クラスターをアップグレードする方法を教えてください。

所要時間3分
0

論理レプリケーションを使用して Amazon Aurora PostgreSQL 互換エディションデータベース (DB) クラスターをアップグレードしたいと考えています。

簡単な説明

論理レプリケーションを使用して Aurora PostgreSQL 互換 DB クラスターのバージョンをアップグレードするには、元のソースクラスターと新しいターゲットクラスター間のレプリケーションを設定します。その後、データ変更を徐々に移行し、アプリケーションを新しいクラスターに切り替えます。

解決策

ソースクラスターを準備する

次の手順を実行します。

  1. カスタム DB クラスターパラメータグループの rds.logical_replication パラメータを 1 に設定します。

  2. 次のクエリを実行し、wal_levellogical に設定されており、rds.logical_replicationon であることを確認します。

    SELECT name,setting FROM pg_settings WHERE name IN ('wal_level','rds.logical_replication');

    出力例:

    name                    | setting
    ------------------------+---------
    rds.logical_replication | on
    wal_level              | logical
    (2 rows)
  3. 次のコマンドを実行して、データベースにパブリケーションを作成します。

    CREATE PUBLICATION my_publication FOR ALL TABLES;

    注: my_publication を実際のパブリケーション名に置き換えてください。

  4. 次のクエリを実行して、パブリケーションから情報を取得します。

    SELECT * FROM pg_publication;

    出力例:

     oid   | pubname        | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot
    -------+----------------+----------+--------------+-----------+-----------+-----------+-------------+------------
     20493 | my_publication | 16400    | t            | t         | t         | t         | t           | f
    (1 row)
  5. 次のコマンドを実行して、データベースにレプリケーションスロットを作成します。

    SELECT pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');

    pg_create_logical_replication_slot の出力例:

     pg_create_logical_replication_slot
    ------------------------------------
     (my_replication_slot,0/6EC7260)
    (1 row)

    注: my_replication_slot を実際のレプリケーションスロット名に置き換えてください。

  6. 次のコマンドを実行して、現在 DB クラスターにあるレプリケーションスロットのリストとそのステータスを取得します。

    SELECT * FROM pg_replication_slots;

    pg_replication_slots の出力例:

     slot_name            | plugin   | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase
    ---------------------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+-----------
     my_replication_slot | pgoutput | logical   | 16401  | test     | f         | f      |            |      | 308479       | 0/6EC7208  | 0/6EC7260          | reserved   |               | f
    (1 row)

ソースクラスターのクローンを作成する

Amazon Relational Database Service (Amazon RDS) コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、ソースの Aurora PostgreSQL 互換 DB クラスターのクローンを作成します。

アップグレード用にクローンを準備する

詳細については、「Aurora PostgreSQL を新しいメジャーバージョンにアップグレードする」の「クローンをアップグレード用に準備するには」を参照してください。

クラスターを新しいバージョンにアップグレードする

詳細については、「Aurora PostgreSQL を新しいメジャーバージョンにアップグレードする」の「クラスターを新しいメジャーバージョンにアップグレードするには」を参照してください。

レプリケーション用にクローンを準備する

次の手順を実行します。

  1. アップグレード後にクローンが使用可能になったら、psql を使用してクラスターに接続し、次のコマンドを実行してサブスクリプションを作成します。

    CREATE SUBSCRIPTION my_subscription
    CONNECTION 'postgres://admin_user_name:admin_user_password@source_instance_URL/database'
    PUBLICATION my_publication
    WITH (copy_data = false,
          create_slot = false,
          enabled = false,
          connect = true,
          slot_name = 'my_replication_slot');

    注: admin_user_name をソースクラスターのユーザー名に、admin_user_password をソースクラスターのパスワードに置き換えます。また、source_instance_URL をソースクラスターエンドポイントに、database をデータベース名に置き換えます。

  2. 次のクエリを実行して、作成したレプリケーションオリジンを取得します。

    SELECT * FROM pg_replication_origin;

    pg_replication_origin の出力例:

     roident | roname
    ---------+----------
     1       | pg_32783
    (1 row)
  3. 次のクエリを実行して、論理レプリケーションのサブスクリプションに関する情報を取得します。

    SELECT * FROM pg_subscription;

    pg_subscription の出力例:

     oid   | subdbid | subskiplsn | subname          | subowner | subenabled | subbinary | substream | subtwophasestate | subdisableonerr | subpasswordrequired | subrunasowner | subconninfo                                                                              | subslotname           | subsynccommit | subpublications    | suborigin
    -------+---------+------------+-----------------+----------+------------+-----------+-----------+------------------+-----------------+---------------------+---------------+------------------------------------------------------------------------------------------------+---------------------+---------------+------------------+-----------
     32783 | 16401   | 0/0        | my_subscription | 16400    | f          | f         | f         | d                | f               | t                   | f             | postgres://admin_user_name:admin_user_password@source_instance_URL/database                  | my_replication_slot   | off           | {my_publication}  | any
    (1 row)
  4. 次のコマンドを実行して、レプリケーションのログシーケンスにおける開始ポイントを指定します。

    SELECT pg_replication_origin_advance('roname', 'log_sequence_number');

    注: ronamepg_replication_origin ビューで返された識別子に置き換えてください。log_sequence_number をログシーケンス番号に置き換えてください。
    出力例:

     pg_replication_origin_advance
    ------------------------------
    
    (1 row)
  5. 次のコマンドを実行して論理レプリケーションを有効にします。

    ALTER SUBSCRIPTION my_subscription ENABLE;

    注: my_subscription をサブスクリプション名に置き換えてください。
    出力例:

    ALTER SUBSCRIPTION
  6. 次のコマンドを実行して、レプリケーションが機能することを確認します。

    SELECT now() AS CURRENT_TIME,
           slot_name,
           active,
           active_pid,
           pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS diff_size,
           pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS diff_bytes
    FROM pg_replication_slots
    WHERE slot_type = 'logical';

    出力例:

         current_time      |      slot_name       | active | active_pid | diff_size | diff_bytes
    ----------------------+---------------------+--------+------------+-----------+------------
     2024-01-20 10:30:45 | my_replication_slot | t      | 12345      | 16 MB     | 16777216
    (1 row)
  7. (オプション) 次のコマンドを実行してレプリケーションラグをモニタリングします。

    SELECT now() AS CURRENT_TIME,
           slot_name,
           active,
           active_pid,
           pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS diff_size,
           pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS diff_bytes
    FROM pg_replication_slots
    WHERE slot_type = 'logical';

    出力例:

    -[ RECORD 1 ]+------------------------------
    current_time | 2025-10-05 22:07:16.077928+00
    slot_name    | my_replication_slot
    active       | t
    active_pid   | 5392
    diff_size    | 0 bytes
    diff_bytes   | 0

    注: 上記の値が 0 に達すると、レプリカはソース DB インスタンスと一致したことになります。

アップグレード後のタスクを実行する

詳細については、「アップグレード後のタスクの実行」を参照してください。

関連情報

Amazon RDS for PostgreSQL DB インスタンス間で論理レプリケーションを使用してテーブルを複製する方法を教えてください

Using logical replication to replicate managed Amazon RDS for PostgreSQL and Amazon Aurora to self-managed PostgreSQL (論理レプリケーションを使用して、マネージド Amazon RDS for PostgreSQL と Amazon Aurora をセルフマネージド PostgreSQL にレプリケートする)

AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ