环境:pg14,源端(发布者)5432,目标端(订阅者)5430
配置要求:逻辑复制要求设置一些配置选项。
在发布者端,wal_level必须被设置为logical,而max_replication_slots中设置的值必须至少是预期要连接的订阅数加上保留给表同步的连接数。max_wal_senders应该至少被设置为max_replication_slots加上同时连接的物理复制体的数量。
订阅者必须配置max_replication_slots。它必须设置为至少是订阅者数,加上一些用于表同步的预留。max_logical_replication_workers必须至少被设置为订阅数加上保留给表同步的连接数。此外,可能需要调整max_worker_processes以容纳复制工作者,至少为(max_logical_replication_workers + 1)。注意,一些扩展和并行查询也会从max_worker_processes中取得工作者槽。
1、修改发布者postgres.conf文件
vim postgres.conf wal_level = logical max_wal_senders = 100
复制
2、发布者节点创建用户,赋权
zsglpt-# \c zsglpt1 您现在已经连接到数据库 "zsglpt1",用户 "postgres". zsglpt1=# create user repl with replication password 'repl' ; CREATE ROLE zsglpt1=# alter user repl set default_transaction_read_only=on ; ALTER ROLE --default_transaction_read_only全局设置为on,强制所有连接禁止写入数据库。default_transaction_read_only是一个可重新加载的参数,因此无需重新启动实例即可使用它 zsglpt1=# grant usage on schema schema1 to repl ; GRANT --对于模式,允许访问包含在指定模式中的对象(假设也满足对象自己的权限要求)。本质上,这允许被授权者在模式中“查找”对象。 zsglpt1=# grant select on all tables in schema schema1 to repl ; GRANT --允许访问schema1下的说有表 zsglpt1=# alter default privileges in schema schema1 grant select on tables to repl ; ALTER DEFAULT PRIVILEGES --为你后续在模式schema1中创建的所有表(和视图)授予 SELECT 特权
复制
3、修改发布者节点pg_hba.conf
vim pg_hba.conf host all repl 订阅者IP/32 md5
复制
4、重启发布者节点PG
su - postgres -c "pg_ctl restart"
复制
5、发布者节点创建发布
create publication pub1 for table bm_tables, bm_szsm ;
复制
6、订阅者节点修改posetgres.conf
vim postgres.conf max_replication_slots=8 max_logical_replication_workers=10 max_worker_processes=8 .\bin\pg_ctl.exe -D data_logic\ restart
复制
6、订阅者节点
create subscription pub1 connection 'host=发布者IP port=5432 dbname=postgres user=repl password=repl' publication pub1; alter subscription pub1 refresh publication;
复制
7、查询
select * from pg_pubilcation;#发布 select * from pg_pubilcation_tables;#发布哪些表 select * from pg_subscription; #订阅 select *,srrelid::regclass from pg_subscription_rel; #订阅哪些表 select * from pg_stat_subscription;#复制进度 drop subscription pub1;#删除订阅
复制
8、添加表
alter publication pub1 add table test.tab1;#从节点需要刷新才能看到新添加表 alter subscription pub1 refresh publication; #刷新订阅
复制
安全要求
能够修改订阅者侧模式的用户可以作为超级用户执行任意代码。将这些表上的所有权和TRIGGER特权限制为超级用户信任的角色。 此外,如果不受信任的用户可以创建表,则只使用显式列出表的发布。 也就是说,只有当超级用户信任允许在发布者或订阅者上创建非临时表的所有用户时,才创建FOR ALL TABLES的订阅。
用于复制连接的角色必须具有REPLICATION属性(或者是超级用户)。 如果角色缺少SUPERUSER 和 BYPASSRLS,发布者的行安全策略可以执行。 如果角色不信任全部表所有者,则在连接字符串中包含options=-crow_security=off;如果表所有者随后添加行安全策略,则该设置将导致复制中断,而不是执行该策略。 角色的访问权限必须在pg_hba.conf中配置,并且必须具有LOGIN属性。
为了能够拷贝初始表数据,用于复制连接的角色必须在被发布的表上具有SELECT特权(或者是一个超级用户)。
要创建发布,用户必须在数据库中有CREATE特权。
要把表加入到一个发布,用户必须在该表上有拥有权。要创建一个自动发布所有表的发布,用户必须是一个超级用户。
要创建订阅,用户必须是一个超级用户。
订阅的应用过程将在本地数据库上以超级用户的特权运行。
特权检查仅在复制连接开始时被执行一次。在从发布者读到每一个更改记录时不会重新检查特权,在每一个更改被应用时也不会重新检查特权。