論理レプリケーションを使用して Aurora PostgreSQL 互換 DB クラスターをアップグレードする方法を教えてください。
論理レプリケーションを使用して Amazon Aurora PostgreSQL 互換エディションデータベース (DB) クラスターをアップグレードしたいと考えています。
簡単な説明
論理レプリケーションを使用して Aurora PostgreSQL 互換 DB クラスターのバージョンをアップグレードするには、元のソースクラスターと新しいターゲットクラスター間のレプリケーションを設定します。その後、データ変更を徐々に移行し、アプリケーションを新しいクラスターに切り替えます。
解決策
ソースクラスターを準備する
次の手順を実行します。
-
カスタム DB クラスターパラメータグループの rds.logical_replication パラメータを 1 に設定します。
-
次のクエリを実行し、wal_level が logical に設定されており、rds.logical_replication が on であることを確認します。
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) -
次のコマンドを実行して、データベースにパブリケーションを作成します。
CREATE PUBLICATION my_publication FOR ALL TABLES;注: my_publication を実際のパブリケーション名に置き換えてください。
-
次のクエリを実行して、パブリケーションから情報を取得します。
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) -
次のコマンドを実行して、データベースにレプリケーションスロットを作成します。
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 を実際のレプリケーションスロット名に置き換えてください。
-
次のコマンドを実行して、現在 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 を新しいメジャーバージョンにアップグレードする」の「クラスターを新しいメジャーバージョンにアップグレードするには」を参照してください。
レプリケーション用にクローンを準備する
次の手順を実行します。
-
アップグレード後にクローンが使用可能になったら、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 をデータベース名に置き換えます。
-
次のクエリを実行して、作成したレプリケーションオリジンを取得します。
SELECT * FROM pg_replication_origin;pg_replication_origin の出力例:
roident | roname ---------+---------- 1 | pg_32783 (1 row) -
次のクエリを実行して、論理レプリケーションのサブスクリプションに関する情報を取得します。
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) -
次のコマンドを実行して、レプリケーションのログシーケンスにおける開始ポイントを指定します。
SELECT pg_replication_origin_advance('roname', 'log_sequence_number');注: roname を pg_replication_origin ビューで返された識別子に置き換えてください。log_sequence_number をログシーケンス番号に置き換えてください。
出力例:pg_replication_origin_advance ------------------------------ (1 row) -
次のコマンドを実行して論理レプリケーションを有効にします。
ALTER SUBSCRIPTION my_subscription ENABLE;注: my_subscription をサブスクリプション名に置き換えてください。
出力例:ALTER SUBSCRIPTION -
次のコマンドを実行して、レプリケーションが機能することを確認します。
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) -
(オプション) 次のコマンドを実行してレプリケーションラグをモニタリングします。
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 にレプリケートする)
