pglogical 的复制可应用于多种场景,包括:
·数据库大版本升级。
·完整的数据库复制。
·利用复制集,选择性地筛选表、行、列。
·可从多个上游服务器,用于数据的聚集和合并。
前提条件
注意:说明:
进入 云数据库 PostgreSQL 控制台 的参数设置页面,修改参数 shared_preload_libraries 和 wal_level。
在 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 | 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 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
在订阅端创建节点,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)