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,pgaudit,pglogical(1 row)
参数 wal_level 的值为 logical,如下图所示。
postgres=> show wal_level;wal_level-----------logical(1 row)

操作步骤
在发布端和订阅端实例确认可安装插件中是否有 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 DATABASEpostgres=> \\c amYou are now connected to database "am" as user "dbadmin".am=>
创建表格 t,并插入数据:
am=> create table t(a int primary key, b int);CREATE TABLEam=> insert into t(a,b)values(1,1),(2,2),(3,3);INSERT 0 3am=> select * from t;a | b---+---1 | 12 | 23 | 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)
在发布端创建发布节点
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。
am=> SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);replication_set_add_all_tables--------------------------------t(1 row)
在订阅端创建订阅节点
在订阅端对应的 database 中创建表格:
postgres=> \\c ampsql (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
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)
在订阅端创建订阅
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 | 12 | 23 | 3(3 rows)