注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间的示例值。完成实验室时,请将这些值替换为特定于云环境的值。
使用 pglogical 扩展将 OCI 数据库与 PostgreSQL 跨区域同步
简介
pglogical 扩展支持通过 PostgreSQL 实例跨多个 Oracle Cloud Infrastructure (OCI) 数据库进行逻辑复制。它支持跨版本 PostgreSQL 复制,并促进在 OCI 中跨区域和本地可用性域部署的数据库之间进行数据同步。此外,它还允许在托管在多云提供商的托管 PostgreSQL 服务上的数据库与自托管社区 PostgreSQL 实例之间进行复制,无论这些实例是在云中还是内部部署中运行,都提供了高度灵活且可互操作的复制解决方案。
pglogical 利用发布 - 订阅模型,使逻辑流复制能够将对表、序列和其他对象的更改从发布者复制到订户。此扩展非常适合各种用例,包括:
-
完整数据库复制。
-
主要版本升级(有一定限制)。
-
方案、数据定义语言 (Data Definition Language,DDL)、序列和表数据的复制。
-
更改数据捕获 (CDC)。
-
从多个上游服务器进行数据聚合和合并。
限制
由于以下限制,pglogical 扩展可能不适用于某些用例:
-
不支持同时复制多个数据库。
-
无法复制
UNLOGGED
和TEMPORARY
表。 -
不支持数据库元数据迁移。
-
自动 DDL 复制不可用。
-
不支持在具有不同编码的数据库之间进行复制。
-
无法解码大型对象 (LOB) 更改,从而阻止其复制。如果可能,请考虑使用 bytea 数据类型存储大型二进制数据,而不是 LOB。
有关更多信息,请参见 Limitations and Restrictions 。
目标
- 在两个 OCI 区域之间的跨区域实施 pglogical 扩展,具体演示了阿什本和孟买之间的复制。此设置还可用于在单个 OCI 区域中进行区域内复制。
Prerequisites
-
访问 OCI 租户。
-
OCI 堡垒主机(OCI 计算映像)。
-
在每个区域中创建一个虚拟云网络 (Virtual Cloud Network,VCN)。
-
pglogical 扩展必须同时安装在源数据库和目标数据库上。
-
表结构一致性:提供者和订户上的表必须具有相同的名称,在同一方案中,并且具有相同的数据类型列。
-
Constraints Compatibility(约束兼容性):对于订户,
CHECK
和NOT NULL
约束必须与提供者相同或更宽松。 -
主关键字要求:表必须具有相同的
PRIMARY KEYs
。建议不要在主键之外添加其他UNIQUE
约束条件。
任务 1:在数据库之间建立通信
要跨区域连接到数据库系统,必须设置 VCN 对等连接。
要使用动态路由网关 (DRG) 创建 VCN 对等连接,请执行以下子任务:
任务 1.1:将 DRG 附加到 VCN
-
根据您的需要,在源区域和目标区域中创建 VCN。
-
根据您的需求在源和目标区域中创建动态路由网关 (DRG)。
-
要将 DRG 连接到 VCN,请在源区域中选择您的 DRG。单击 VCN 附加和创建虚拟云网络附加。
-
在创建 VCN 附件页中,输入附件名称并选择 VCN-A (源区域 VCN),然后单击创建 VCN 附件。
-
重复相同的步骤来附加目标 VCN。
有关更多信息,请参见 Dynamic Routing Gateways 。
任务 1.2:创建远程对等连接 (RPC)
-
创建源区域 RPC (
SOR-RPC
)。 -
转到
SOURCE DRG
详细信息页面,然后单击远程对等连接附件。 -
单击 Create remote peering connection(创建远程对等连接)。
-
在创建远程对等连接页中,输入连接名称并选择区间,然后单击创建远程对等连接。
-
要创建目标区域 RPC (
TAR-RPC
),请重复上述过程以创建目标区域 RPC。
任务 1.3:建立 RPC 连接
通过 SOR-RPC
连接建立从“源”区域到“目标”区域的连接。
-
转到
SOURCE DRG
详细信息页面,然后单击远程对等连接附件。 -
通过单击远程对等连接列中的连接名称来查看
SOR-RPC
的详细信息。 -
在连接详细信息页中,单击建立连接,输入连接名称,然后选择区间。
-
在建立连接页中,选择您的目标区域名称区域,然后输入目标 RPC 的 OCID (
TAR-RPC
)。建立连接后,RPC 的状态将更改为 PEERED 。因此,
TAR-RPC
对等连接状态也更改为 PEERED 。
任务 1.4:在 VCN 中配置路由表以将流量发送到 DRG 附加
-
在
Source-VCN
中配置路由表,以将流量发送到Target-VCN
专用子网 CIDR。 -
转到
Source-VCN
详细信息页,然后单击路由表。 -
在路由表列表下,单击 route table for private subnet-Source-VCN 。
-
在路由表页中,单击添加路由规则,然后根据您的要求输入路由规则信息。
-
要在
Target-VCN
中配置路由表以将流量发送到 Source-VCN 的专用子网 CIDR,请重复上述步骤,为 Source-VCN 的专用子网配置路由表。
任务 1.5:添加安全入站规则以允许通过 DRG 在 VCN 的专用子网之间通信
-
将入站规则添加到源 VCN 的专用子网 - 源 -VCN 安全列表,以允许来自
Target-VCN-private
子网到Source-VCN-private
子网的流量 -
转到
Source-VCN
详细信息页,然后单击安全列表和专用子网 - 源 -VCN 的安全列表。 -
在安全列表页中,单击添加入站规则,并根据您的要求输入入站规则信息。
-
要将入站规则添加到
Target-VCN
的专用子网 - 目标 -VCN 的安全列表,以允许从Source-VCN-private
子网到Target-VCN-private
子网的流量,请重复以上执行的相同步骤,为目标 -VCN 添加入站规则,但使用相应的入站规则。
任务 1.6:跨区域数据库连接测试和验证
连接到 Source-VM
以验证与目标数据库的连接,并同时验证源数据库与目标 VM 的连接,以确保双向通信。
任务 2:配置 A 记录条目
必须配置 A 记录条目以跨区域解析数据库系统的全限定域名 (Fully Qualified Domain Name,FQDN)。在本教程中,孟买区域用作目标区域。
-
切换到目标区域(孟买),在搜索栏中输入 DNS ,然后选择专用视图。
-
将显示当前区域的 VCN 列表。选择已配置 DRG 的 VCN。
-
将显示 DNS 区域列表,包括孟买数据库系统的 FQDN。
-
为远程数据库系统添加条目。
-
单击创建区域。
-
在区域名称中,输入其他区域 (Ashburn) 中数据库系统的 FQDN。
-
单击创建以添加新区域条目。
-
-
配置 A 记录条目。
-
打开新创建的区域,单击管理记录并选择添加记录。
-
输入以下信息。
-
名称:输入名称。
-
类型:选择 A (IPv4 Address) 。
-
TTL:输入 3600 秒(根据应用程序要求进行修改)。
-
RDATA 模式:选择基本。
-
地址:输入数据库系统在另一个区域中的主要端点 IP 地址。
-
-
-
依次单击保存更改和发布更改以应用配置。
通过此设置,数据库系统 B (Mumbai) 现在可以使用 FQDN 解析并连接到数据库系统 A (Ashburn),从而实现无缝的跨区域数据库通信。
任务 3:跨区域创建数据库系统
在 OCI 的各个区域中部署 PostgreSQL 数据库,以制定强大的灾难恢复 (Disaster Recovery,DR) 策略。有关在 OCI 中创建 PostgreSQL 数据库的更多信息,请参见 Creating a Database System 。
任务 4:启用跨区域的 pglogical 扩展
本教程通过将阿什本指定为源区域,将孟买指定为目标区域来演示 DR 的实施。
-
在阿什本区域中,登录到 OCI 控制台,导航到 PostgreSQL 数据库,选择数据库系统,并通过访问配置文件来修改配置设置。
-
您将被重定向到完整的配置文件。选择复制配置以继续,这将显示以下页。
-
根据您的规格输入所需的信息。然后,导航到用户变量(读/写),单击添加另一个变量,然后分别选择变量名称作为
wal_level
和track_commit_timestamp
,选择变量值作为logical
和1
。 -
在配置扩展中,选择
pglogical
作为 PostgreSQL 扩展。 -
单击创建以生成配置文件。
-
导航到您的数据库系统,在配置下选择编辑,并将以前创建的配置应用于您的数据库系统。
-
数据库系统将显示 Updating(更新)状态。等待它变为 Active ,然后继续。
-
激活后,登录到数据库系统并使用以下查询验证启用的扩展。
SHOW oci.admin_enabled_extensions;
-
使用以下命令创建 pglogical 扩展。
CREATE EXTENSION pglogical;
下面是命令的输出样例。
pglogical_source=> show oci.admin_enabled_extensions ; oci.admin_enabled_extensions ------------------------------ pglogical (1 row) pglogical_source=> create extension pglogical; CREATE EXTENSION
-
在另一个(孟买)区域数据库中重复相同的过程以启用 pglogical 扩展。
任务 5:配置源数据库
运行以下查询以向源数据库授予启用逻辑复制的权限。
alter role psql with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to psql ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql;
请注意,“psql”是在数据库设置过程中创建的示例用户。
任务 6:在源数据库中设置 pglogical Extension Replication
-
在源数据库上创建发布者节点。
SELECT pglogical.create_node(node_name := 'provider1',dsn :='host=primary.xxxxxxxxx.postgresql.us-ashburn-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxx dbname=pglogical_source');
node_name:
指定要在源数据库上创建的发布者的名称。host:
输入源数据库的全限定域名 (FQDN)。port_number:
提供运行源数据库的端口。database_name:
指定将在其中创建发布的数据库。
-
将公共方案中的所有表都包括在默认复制集中。
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
任务 7:配置目标数据库
运行以下查询以向目标数据库授予启用逻辑复制的权限。
alter role psql with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to psql ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql;
请注意,“psql”是在数据库设置过程中创建的示例用户。
在授予必要的权限后,复制目标数据库中的所有必需对象以匹配源数据库结构。
任务 8:在目标数据库中设置 pglogical 复制
-
在目标数据库上创建订户节点。
SELECT pglogical.create_node(node_name := 'subscriber1',dsn :='host=primary.xxxxxxx.postgresql.ap-mumbai-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxx dbname=pglogical_target');
node_name:
定义目标数据库上订户的名称。host:
输入目标数据库的全限定域名 (FQDN)。port_number:
输入运行目标数据库的端口。database_name:
提供要在其中创建订阅的数据库的名称。
-
在订户节点上创建订阅,该订阅将启动后台同步和复制流程。
SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=primary.xxxxxxxx.postgresql.us-ashburn-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxxx dbname=pglogical_source sslmode=verify-full sslrootcert=/etc/opt/postgresql/ca-bundle.pem'); SELECT pglogical.wait_for_subscription_sync_complete('subscription1');
subscription_name:
提供订阅的名称。host:
提供源数据库的 FQDN。port_number:
提供运行目标数据库的端口。database_name:
提供源数据库的名称。
注:请确保在订阅创建字符串中使用
sslmode=verify-full
和sslrootcert = /etc/opt/postgresql/ca-bundle.pem
,以防止任何连接失败。
任务 9:验证订阅状态
运行以下语句检查您的订阅在目标数据库上的状态。
select * from pglogical.show_subscription_status();
任务 10:检验数据复制是否正在运行
运行以下语句以检查源数据库上的复制状态。
SELECT * FROM pg_stat_replication;
任务 11:(可选)停止或启动复制
-
您可以在目标数据库上使用以下命令禁用订阅。
select pglogical.alter_subscription_disable('subscription_name');
-
您可以在目标数据库上使用以下命令启用订阅。
select pglogical.alter_subscription_enable('subscription_name');
注:在
subscription_name
中,输入在目标处创建的订阅的名称。
任务 12:(可选)删除订阅
要删除目标数据库上的订阅,请运行以下命令。
select pglogical.drop_subscription('subscription_name');
注:在
subscription_name
中,输入在目标处创建的订阅的名称。
疑难解答
-
如果出现以下错误,则表示需要在目标 VCN 中添加 A 记录。要解决此问题,请参阅任务 2。
ERROR: could not connect to the postgresql server: could not translate host name "primary.XXXXXXX.postgresql.xx-xxxxx-1.oci.oraclecloud.com" to address: Name or service not known
-
要防止任何认证失败,请在创建订阅时在字符串中指定
sslmode=verify-full and sslrootcert=/etc/opt/postgresql/ca-bundle.pem
。could not connect to the postgresql server: connection to server at "primary.XXXXXXX.postgresql.xx-xxxxx-1.oci.oraclecloud.com" , port 5432 failed: SSL error: certificate verify failed
后续步骤
本教程提供了在 OCI 数据库中跨区域实施 DR 解决方案的综合方法,其中 PostgreSQL 使用 pglogical 扩展。它涵盖了配置过程、数据复制以及常见问题的故障排除。
此外,此方法可以应用于 PostgreSQL 升级,确保最短停机时间,并在目标数据库与源完全同步后实现顺畅的应用程序切换。
确认
- 作者 - Kaviya Selvaraj(高级技术人员)
更多学习资源
通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Cross-Region Synchronization of OCI Database with PostgreSQL using the pglogical Extension
G31236-03
Copyright ©2025, Oracle and/or its affiliates.