IBM Cloud Docs
将 Databases for EnterpriseDB 配置为逻辑复制目的地

将 Databases for EnterpriseDB 配置为逻辑复制目的地

Databases for EnterpriseDB 已弃用。 从 2025 年 6 月 16 日起,您将无法部署新的实例。 现有实例的支持服务将持续到2025年10月15日。 届时仍存在的任何实例将被删除。 更多信息,请参阅 Databases for EnterpriseDB 的弃用

IBM Cloud® Databases for EnterpriseDB 支持从外部 PostgreSQL 实例到部署的 逻辑复制。 您可以将外部 PostgreSQL 设置为发布者,将您的 Databases for EnterpriseDB 部署设置为订阅者,并将数据从外部数据库复制到您的部署中。

配置发布者

外部 PostgreSQL 实例是发布器,需要进行配置,以便 Databases for EnterpriseDB 部署能够连接并正确调入数据。

  1. 每个被选中复制的表都需要包含 Primary Key 或设置了 REPLICA IDENTITY
  2. 您的外部(发布者)PostgreSQL 需要有一个具有 PostgreSQL 权限 REPLICATION 的复制用户,并且该用户需要具有您希望复制的数据库的权限。
  3. 您复制的 PostgreSQL 需要启用 TLS/SSL

PostgreSQL 文档 中概述了逻辑复制的一些固有限制和约束。 在决定逻辑复制是否适合您的用例之前,您应该查看这些内容。

配置用户

要配置 Databases for EnterpriseDB 部署,并确保正确复制数据、

  1. 您需要在部署中创建一个与您打算复制的数据库同名的数据库。
  2. 逻辑复制在表级别上运行,因此在开始逻辑复制流程之前,需要在订阅者中创建您选择发布的每一个表。 (您可以使用 pg_dump 来提供帮助) 订阅者的表格不必与发布者的表格完全相同。 不过,订阅者的表必须至少包含发布者表中的每一列。 订阅者中的其他列不得具有 NOT NULL 或其他限制条件。 如果它们这样做,复制就会失败。

注意本地 PostgreSQL 订阅命令需要超级用户权限,而 Databases for EnterpriseDB 部署中没有超级用户权限。 相反,您的部署包含一组功能,可用于设置和管理订阅的逻辑复制。

只有 Databases for EnterpriseDB 提供的管理员用户才有权限运行以下复制命令,以便从外部 PostgreSQL 发布者订阅和复制内容。

用户功能

create_subscription

Arguments:
    subscription_name   Unique name to create the subscription channel with
    host_ip             Publisher hostname or public IP address
    port                Port number publisher is running on
    username            `admin` user created on the publisher
    password            Password of the `admin` user on the publisher
    db_name             The name of the database to be replicated
    publisher_name      The name of publisher channel on the publisher

Usage:
    exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','password','admin','exampledb','my_publication');

delete_subscription

Arguments:
    subscription_name   Name the subscription channel to delete
    db_name             The name of the replicated database

Usage:
exampledb=> SELECT delete_subscription('subs1', 'exampledb');

list_subscriptions

Arguments:
    None

Usage:
    exampledb=> SELECT * FROM list_subscriptions();

disable_subscription

Arguments:
    subscription_name   Name the subscription channel to disable
    db_name             The name of the replicated database

Usage:
    exampledb=> SELECT disable_subscription('subs1','exampledb');

enable_subscription

Arguments:
    subscription_name   Name the subscription channel to enable
    db_name             The name of the replicated database

Usage:
    exampledb=> SELECT enable_subscription('subs1','exampledb');

refresh_subscription

该函数用于在发布者进行更改(如添加或删除表)后刷新订阅者的订阅。

Arguments:
    subscription_name   Name the subscription channel to refresh
    db_name             The name of the replicated database

Usage:
    exampledb=> SELECT refresh_subscription('subs1','exampledb');

在发布者上设置逻辑复制

要将外部PostgreSQL配置为发布器、

  • 编辑本地 pg_hba.conf 并添加以下内容

    hostssl    replication            replicator         0.0.0.0/0      md5
    hostssl    all                    replicator         0.0.0.0/0      md5
    

    复制器 "字段是您使用 PostgreSQL 特权 REPLICATION 设置的用户。

  • 使用所需的 逻辑复制配置 编辑本地 postgresql.conf。 将 wal_level 设置为“逻辑”,并将 listen_addresses='*' 设置为接受来自任何主机的连接。

    listen_addresses='*'
    wal_level = logical                   
    
  • 重启 PostgreSQL 服务器。

现在可以在数据库上定义一个发布者,并添加要复制到订阅者的表。

  • 使用复制用户登录要发布的数据库。
        psql -U replicator -d exampledb
    
  • 创建发布渠道。
        exampledb=> CREATE PUBLICATION my_publication;
    
  • 为出版商添加表格。
       exampledb=> ALTER PUBLICATION my_publication ADD TABLE my_table;
    

在用户上设置逻辑复制

要将您的 Databases for EnterpriseDB 部署配置为订阅者、

  • 使用 admin 用户登录为复制创建的数据库。
    psql -U admin -d exampledb
    
  • 运行以下查询,调用 create_subscription 函数并创建订阅者频道。
        exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','admin','password','exampledb','my_publication');
    

监视复制

您可以通过在发布者和订阅者中的任意一个上运行以下查询来监控逻辑复制的状态。

    exampledb=> SELECT * FROM pg_stat_replication;