在pglogical 2 支持DDL同步的逻辑复制中介绍了如何配置简单的逻辑复制和实现DDL同步。今天继续介绍pglogical 2另一个功能,将指定数据库中的模式(一个或多个)、表结构和表数据如何同步到订阅者,这个功能对跨版本升级简直就是神器。
首先我们要介绍一下synchronize_structure参数,该参数指定是否将模式和表结构从提供者同步到订阅者,默认 false,如果参数改为true,要确保订阅者中不能有提供者数据库中的任何数据库对象信息,下面进行具体操作。
订阅节点
首先创建数据库pglog_database:
[pg12@k8s1 ~]$ psql -h 127.0.0.1psql (12.6)Type "help" for help.postgres=# create database pglog_database;CREATE DATABASEpostgres=# \q[pg12@k8s1 ~]$
在pglog_database数据库中创建public.test表、pglog_schema模式、和pglog_schema.test表并写入数据。
postgres=# create database pglog_database;CREATE DATABASEpostgres=# \q[pg12@k8s1 ~]$ psql -h 127.0.0.1 -d pglog_databasepsql (12.6)Type "help" for help.pglog_database=# create table test(id int primary key);CREATE TABLEpglog_database=# insert into test values(1);INSERT 0 1pglog_database=# create schema pglog_schema;CREATE SCHEMApglog_database=# set search_path = pglog_schema ;SETpglog_database=# create table test(id int primary key,name varchar);CREATE TABLEpglog_database=# insert into test values (1,'tom');INSERT 0 1pglog_database=#
创建pglogical扩展和提供节点、复制集(两个模式public和pglog_schema):
[pg12@k8s1 ~]$ psql -h 127.0.0.1 -d pglog_databasepsql (12.6)Type "help" for help.pglog_database=# create extension pglogical;CREATE EXTENSIONpglog_database=# select pglogical.create_node(node_name := 'provider1',dsn := 'host=10.110.13.101 port=11016 dbname=pglog_database');create_node-------------2976894835(1 row)pglog_database=# select pglogical.replication_set_add_all_tables('default',ARRAY['public','pglog_schema']);replication_set_add_all_tables--------------------------------t(1 row)pglog_database=#
订阅节点
创建数据库pglog_database和pglogical扩展:
postgres=# create database pglog_database;CREATE DATABASEpostgres=# \q[pg12@k8s2 pgdata]$ psql -h 127.0.0.1 pglog_databasepsql (12.6)Type "help" for help.pglog_database=# create extension pglogical;CREATE EXTENSIONpglog_database=#
创建订阅节点和订阅:
pglog_database=# select pglogical.create_node(node_name := 'subscriber1', dsn := 'host=10.110.13.102 port=11016 dbname=pglog_database');create_node-------------330520249(1 row)pglog_database=# select pglogical.create_subscription(subscription_name := 'subscription1',synchronize_structure := true,provider_dsn := 'host=10.110.13.101 port=11016 dbname=pglog_database');create_subscription---------------------1763399739(1 row)pglog_database=# select pglogical.show_subscription_status();show_subscription_status--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(subscription1,replicating,provider1,"host=10.110.13.101 port=11016 dbname=pglog_database",pgl_pglog_database_provider1_subscription1,"{default,default_insert_only,ddl_sql}",{all})(1 row)pglog_database=#
查看订阅节点,,表结构、模式和表数据均已同步到订阅节点:
pglog_database=# \dtList of relationsSchema | Name | Type | Owner--------+------+-------+-------public | test | table | pg12(1 row)pglog_database=# set search_path = pglog_schema ;SETpglog_database=# \dtList of relationsSchema | Name | Type | Owner--------------+------+-------+-------pglog_schema | test | table | pg12(1 row)pglog_database=# select * from test;id | name----+------1 | tom(1 row)pglog_database=#
测试
在提供者节点添加数据,然后到订阅节点查看:
pglog_database=# set search_path = pglog_schema ; SETpglog_database=# insert into test values(2,'lucy');INSERT 0 1pglog_database=#
pglog_database=# select pglogical.show_subscription_status();show_subscription_status--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(subscription1,replicating,provider1,"host=10.110.13.101 port=11016 dbname=pglog_database",pgl_pglog_database_provider1_subscription1,"{default,default_insert_only,ddl_sql}",{all})(1 row)pglog_database=# set search_path = pglog_schema ;SETpglog_database=# select * from test;id | name----+------1 | tom2 | lucy(2 rows)pglog_database=#
可以看到订阅节点数据已同步。
需要注意的是,模式和表结构只在创建订阅者时同步一次,如果需要订阅后同步DDL,仍须使用replicate_ddl_command函数。
文章转载自PostgreSQL数据库工作学习随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




