lottu=# select * from pglogical.replication_set_table ; set_id | set_reloid | set_att_list | set_row_filter --------+------------+--------------+---------------- (0 rows)
方法1:
前面讲解创建复制集中;3.2.2中“将public架构中的所有表添加到default复制集中”
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
方法二:
将表添加到对应的复制集中;详细介绍可以查看前面文档。
pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text [],row_filter text)
两种方法都可以;我们采用第二种方法。
lottu=# select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu01',synchronize_data := true); replication_set_add_table --------------------------- t (1 row)
我们查看复制集
lottu=# select * from pglogical.replication_set_table ; set_id | set_reloid | set_att_list | set_row_filter -----------+-------------+--------------+---------------- 290045701 | tbl_lottu01 | | (1 row)
同时,数据也同步到 subscriber 节点。因为在第二种方法有 同步 的操作。若使用第一种方法;还需要在subscriber 节点同步表的操作。
#重新同步一个表 pglogical.alter_subscription_resynchronize_table(subscription_name name, relation regclass) #将所有的表都同步 pglogical.alter_subscription_synchronize(subscription_name name, truncate bool)
4、查看subscriber 节点查看表 tbl_lottu01 信息
lottu=# select * from pglogical.show_subscription_table('subscription1','tbl_lottu01'); nspname | relname | status ---------+-------------+-------------- public | tbl_lottu01 | synchronized (1 row) lottu=# select count(1) from tbl_lottu01; count ------- 10000 (1 row)
在复制集default中: update/delete/truncate 操作也是同步复制。不作演示
复制集INSERTUPDATEDELETETRUNCATEdefault √ √ √ √
default_insert_only √ × × ×
四、复制特性扩展 4.1、延迟复制
pglogical.create_subscription(subscription_name name, provider_dsn text, replication_sets text[], synchronize_structure boolean, synchronize_data boolean, forward_origins text[], apply_delay interval)
参数:
subscription_name - 订阅的名称,必须是唯一的
provider_dsn - 提供者的连接字符串
replication_sets - 要订阅的复制集数组,这些必须已存在,默认为“{default,default_insert_only,ddl_sql}”
synchronize_structure - 指定是否将提供者与订阅者之间的结构同步,默认为false
synchronize_data - 指定是否将数据从提供者同步到订阅者,默认为true
forward_origins - 要转发的原始名称数组,当前只支持的值是空数组,意味着不转发任何不是源自提供者节点的更改,或“{all}”这意味着复制所有更改,无论它们的来源是什么,默认是全部}”
apply_delay - 延迟复制多少,默认为0秒
示例:数据表结构同步;且延迟复制1分钟
SELECT pglogical.create_subscription( subscription_name := 'subscription1', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu', synchronize_structure := true, apply_delay := '00:01:00'::interval );
4.2、对源端进行 行/列 过滤过滤机制需要 PostgreSQL 9.5 +
pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text [],row_filter text)
参数:
set_name - 现有复制集的名称
relation - 要添加到集合中的表的名称或OID
synchronize_data - 如果为true,则表数据将在订阅给定复制集的所有订户上同步,默认为false
columns - 要复制的列的列表。通常,当应复制所有列时,这将设置为NULL,这是默认值
row_filter - 行过滤表达式,默认为NULL(无过滤),有关详细信息,请参阅(行过滤)。警告:在使用有效行筛选器同步数据时要小心。使用synchronize_data=true有效row_filter就像对表的一次性操作。使用修改后再次执行它将row_filter不会将数据同步到订户。订阅者可能需要pglogical.alter_subscription_resynchronize_table()来修复它。
**