跳至内容

如何使用逻辑复制来升级我的 Aurora PostgreSQL 兼容数据库集群?

3 分钟阅读
0

我想使用逻辑复制来升级我的 Amazon Aurora PostgreSQL 兼容版数据库 (DB) 集群。

简短描述

要使用逻辑复制来升级与 Aurora PostgreSQL 兼容的数据库集群版本,请在原始源集群和新目标集群之间设置复制。然后,逐步迁移数据更改,并将应用程序切换到新集群。

解决方法

准备源集群

完成以下步骤:

  1. 在自定义数据库集群参数组中将 rds.logical_replication 参数设置为 1。

  2. 运行以下查询以验证 wal_level 是否为 logicalrds.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)
  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. 运行以下命令,获取当前数据库集群中的复制槽列表及其状态:

    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 升级到新的主要版本中的将集群升级到新的主要版本

准备克隆以进行复制

完成以下步骤:

  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');

    **注意:**将 roname 替换为 pg_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 时,表示副本与源数据库实例相匹配。

执行升级后任务

有关更多信息,请参阅执行升级后任务

相关信息

如何使用逻辑复制在 Amazon RDS for PostgreSQL 数据库实例之间复制表?

使用逻辑复制将托管式 Amazon RDS for PostgreSQL 和 Amazon Aurora 复制到自托管式 PostgreSQL

AWS 官方已更新 6 个月前