如何使用邏輯複寫來升級我的 Aurora PostgreSQL 相容版資料庫執行個體叢集?
我想使用邏輯複寫來升級我的 Amazon Aurora PostgreSQL 相容版本資料庫叢集。
簡短說明
若要使用邏輯複寫來升級 Aurora PostgreSQL 相容版資料庫叢集的版本,請在原始來源叢集與新的目標叢集之間設定複寫。然後,逐步遷移資料變更,並將應用程式切換到新叢集。
解決方法
準備來源叢集
完成以下步驟:
-
在您的自訂資料庫叢集參數群組中,將 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 替換為您的複寫插槽名稱。
-
執行以下命令,取得目前位於資料庫叢集中的複寫插槽清單及其狀態:
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 Command Line Interface (AWS CLI) 來建立來源 Aurora PostgreSQL 相容版資料庫叢集的複本。
準備複本以進行升級
如需更多資訊,請參閱將 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 時,複本就會與來源資料庫執行個體一致。
執行升級後任務
如需更多資訊,請參閱執行升級後任務。
相關資訊
如何使用邏輯複寫,在我的 Amazon RDS for PostgreSQL 資料庫執行個體之間複寫資料表?
使用邏輯複寫,將受管的 Amazon RDS for PostgreSQL 和 Amazon Aurora 複寫到自行管理的 PostgreSQL
相關內容
- 已提問 3 年前
