如何使用逻辑复制来升级我的 Aurora PostgreSQL 兼容数据库集群?
我想使用逻辑复制来升级我的 Amazon Aurora PostgreSQL 兼容版数据库 (DB) 集群。
简短描述
要使用逻辑复制来升级与 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 命令行界面 (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
