将 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 部署能够连接并正确调入数据。
- 每个被选中复制的表都需要包含 Primary Key 或设置了
REPLICA IDENTITY
。 - 您的外部(发布者)PostgreSQL 需要有一个具有 PostgreSQL 权限
REPLICATION
的复制用户,并且该用户需要具有您希望复制的数据库的权限。 - 您复制的 PostgreSQL 需要启用 TLS/SSL。
PostgreSQL 文档 中概述了逻辑复制的一些固有限制和约束。 在决定逻辑复制是否适合您的用例之前,您应该查看这些内容。
配置用户
要配置 Databases for EnterpriseDB 部署,并确保正确复制数据、
- 您需要在部署中创建一个与您打算复制的数据库同名的数据库。
- 逻辑复制在表级别上运行,因此在开始逻辑复制流程之前,需要在订阅者中创建您选择发布的每一个表。 (您可以使用
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;