文档中心>实践教程>云数据库 PostgreSQL>使用 pglogical 进行逻辑复制

使用 pglogical 进行逻辑复制

最近更新时间:2025-05-08 19:14:32

我的收藏
pglogical 是 PostgreSQL 的逻辑复制扩展插件,使用“发布/订阅”的数据模型进行数据复制。该模型包含“发布端”和“订阅端”,发布端用于定义和发布指定的数据,订阅端可以选择订阅,从而接收并使用数据变更。pglogical 允许用户只复制特定的数据内容,减少了不必要的数据传输和处理,使选择性复制更加高效。
pglogical 的复制可应用于多种场景,包括:
数据库大版本升级。
完整的数据库复制。
利用复制集,选择性地筛选表、行、列。
可从多个上游服务器,用于数据的聚集和合并。

前提条件

说明:
如您需要使用 pglogical 插件,请您 提交工单 联系我们添加 shared_preload_libraries 参数。修改 shared_preload_libraries 参数会重启实例,请确保业务有重连机制。
云数据库 PostgreSQL 支持同一地域下的同一实例或者不同实例间配置 pglogical 逻辑复制。
当前只有内核版本在 v11.22_r1.21、v12.20_r1.24、v13.16_r1.19、v14.13_r1.26、v15.6_r1.13、v16.4_r1.7 及以上且大版本为11~16的云数据库 PostgreSQL 实例才支持 pglogical 插件。
请您确认 shared_preload_libraries 参数中包含 pglogical,如下图所示:
postgres=> show shared_preload_libraries;
shared_preload_libraries
-------------------------------------------------------------------------------------------------------------------------
-------------
pg_stat_statements,pg_stat_log,wal2json,decoderbufs,decoder_raw,pg_hint_plan,rds_server_handler,tencentdb_pwdcheck,pgaud
it,pglogical
(1 row)
参数 wal_level 的值为 logical,如下图所示。
postgres=> show wal_level;
wal_level
-----------
logical
(1 row)
如您需要修改 wal_level 参数,请您进入 云数据库 PostgreSQL 控制台参数设置页面,修改参数:


操作步骤

在发布端和订阅端实例确认可安装插件中是否有 pglogical:
postgres=> select * from pg_available_extensions where name='pglogical';
name | default_version | installed_version | comment
-----------+-----------------+-------------------+--------------------------------
pglogical | 2.4.4 | | PostgreSQL Logical Replication
(1 row)

安装插件

新建 database,名称为 am,并切换至 am:
postgres=> create database am;
CREATE DATABASE
postgres=> \\c am
You are now connected to database "am" as user "dbadmin".
am=>
创建表格 t,并插入数据:
am=> create table t(a int primary key, b int);
CREATE TABLE
am=> insert into t(a,b)values(1,1),(2,2),(3,3);
INSERT 0 3
am=> select * from t;
a | b
---+---
1 | 1
2 | 2
3 | 3
(3 rows)
发布端订阅端实例都要执行以下命令,创建 pglogical 插件:
am=> create extension pglogical;
CREATE EXTENSION
可使用以下命令查询是否安装成功:
am=> select * from pg_extension where extname='pglogical';
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+-----------+----------+--------------+----------------+------------+-----------+--------------
16424 | pglogical | 16387 | 16423 | f | 2.4.4 | |
(1 row)

在发布端创建发布节点

创建发布节点, dns 中参数请参考 跨库访问。这里的参数均填写发布端所在实例信息。
am=> SELECT pglogical.create_node(node_name := 'provider1',dsn := 'host=10.*.*.* port=5432 dbname=am user=**** password=**** instanceid=postgres-****** uin=********');
create_node
-------------
2976894835
(1 row)

配置复制集

如下示例是配置复制集中的一种,使用 pglogical_republication_set_add_all_tables 函数,将指定 schema 下的所有表添加到指定的复制集中。’default’指复制集的名称,可自定义,此处使用默认的复制集名称;’public’指要发布的表所在的 schema 名称,此处为 public。
更多参数请参考 pglogical 官方文档
am=> SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
replication_set_add_all_tables
--------------------------------
t
(1 row)

在订阅端创建订阅节点

在订阅端对应的 database 中创建表格:
postgres=> \\c am
psql (14.11, server 15.6)
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
You are now connected to database "am" as user "dbadmin".
am=> create table t(a int primary key, b int);
CREATE TABLE
在订阅端创建节点,dns 中参数请参考 跨库访问。这里的参数均填写订阅端所在实例信息。
am=> SELECT pglogical.create_node(node_name := 'subscriber1',dsn := 'host=10.*.*.* port=5432 dbname=am user=**** password=**** instanceid=postgres-***** uin=*******');
create_node
-------------
330520249
(1 row)

在订阅端创建订阅

在订阅端创建节点,dns 中参数请参考 跨库访问。这里的参数均填写发布端所在实例信息。
am=> SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=10.*.*.* port=5432 dbname=am user=**** password=**** instanceid=postgres-**** uin=*******');
create_subscription
---------------------
1763399739
(1 row)
在订阅端查询表,校验目标端数据。若查询结果与发布端数据一致,则逻辑复制成功:
am=> select * from t;
a | b
---+---
1 | 1
2 | 2
3 | 3
(3 rows)