各位新朋友~记得先点蓝字关注我哦~
逻辑复制是一种基于数据对象的复制标识(通常是主键)复制数据对象及其更改的方法。我们使用术语“逻辑”来与物理复制加以区分,后者使用准确的块地址以及逐字节的复制方式。
9.4之后,可以进行逻辑复制,但是要基于各种插件。pg10之后,自带逻辑复制。
01 应用场景和架构
1 可用于多个库(的表)融合到一个库或一到多
2 可用于不同主版本
3 可用于不同平台,如win到linux
逻辑复制采用 发布/订阅架构。可以一对多,或者多对一。

02 相关限制
1、数据库模式(schema)和DDL命令不会被复制。但支持支持TRUNCATE命令的复制
2、序列数据不被复制。
3、大对象不会被复制。没有办法可以解决这个问题,除非把数据存储在普通表中。
大对象可以在视图pg_largeobject中查看
4、复制只能从基表到基表。也就是说,发布端和订阅端上的表都必须是普通表,而不是视图、物化视图、分区根表或者外部表。如果是分区,可以一一对应地复制分区层次,但当前不能复制成一种不同的分区设置。尝试复制不是基表的表将会导致错误
03 搭建环境准备操作

#pg服务器版本为12.2
3.1
创建复制用户作为逻辑同步使用
---所有节点操作
如本次测试,共有2台服务器,分别在2台上,创建如下用户:
注意,一般不太建议是直接使用postgres用户,可以创建一个用户,如mc_logrepl.
赋予replication权限,注意,要同步的表需要赋予该用户select权限。为了测试方便,我们就直接使用postgres用户了
3.2
修改pg_hba.conf文件
---订阅端操作
主库
host all all 192.168.0.0/24 md5
host replication mc_logrepl 192.168.0.0/24 md5
第一行 #允许XX这个从服务器连接到主服务器
第二行 #允许使用replica用户来复制,第二个字段必须填上一步添加的用户
#psql
psql> select pg_reload_conf();
复制
3.3
修改postgresql.conf
---发布端操作
1. wal_level=logical #重启生效
2. max_replication_slots,默认10,每一个订阅需要消耗一个slot,每一个指定了slot的流式物理复制也要消耗一个slot。
3. max_wal_senders,默认32,每一个slot要使用一个wal sender,每一个流式物理复制也要使用一个wal sender。
4. max_worker_processes,默认8必须大于等于max_wal_senders加并行计算进程,或者其他插件需要fork的进程数。
#重启pg服务生效。
#只有listen_address改变需要重启,否则select pg_reload_conf() 即可。
pg_ctl stop –D $PGDATA
pg_ctl start –D $PGDATA
---订阅端操作
1. max_replication_slots,大于等于该实例总共需要创建的订阅数
2. max_logical_replication_workers,大于等于该实例总共需要创建的订阅数
3. max_worker_processes, 大于等于max_logical_replication_workers + 1 +
04 同步表结构、创建发布、订阅
4.1
创建publication
CREATE PUBLICATION name
[ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
| FOR ALL TABLES ]
[ WITH ( publication_parameter [= value] [, ... ] ) ];
复制
注意,有三种情况
create publication mc_pub1; 这样的发布在后面添加表之后,需要刷新订阅才可同步;
create publication mc_pub1 for table XX1,XX2;这样的发布在订阅创建之后可以直接同步到备端;新添表需要手动加到发布中。
create publication mc_pub1 for all tables; 这样的发布可以同步所有的表,并且以后该数据库下创建的新表会自动添加到同步中。注意,一开始的表会自动同步,之后创建的表还是要更新。
所以无论怎么样,新增表在订阅端都要进行刷新。
4.2
在订阅端创建想要同步的表
可以在不同的database下,但是表名和表结构要一致。
##注意,不需要做初始化数据同步,和oracle的ogg有很大区别
获取发布端的表创建语句,在订阅端创建。
获取建表语句:
pg_dump -t 'public.log_test' -s -f dump.sql postgres
-s表示 –schema_only 只导出表结构,不导出表数据。
4.3
创建 subscription
Syntax:
CREATE SUBSCRIPTION subscription_name
CONNECTION 'conninfo'
PUBLICATION publication_name [, ...]
[ WITH ( subscription_parameter [= value] [, ... ] ) ]
复制
例子如下:
create subscription sub1 connection 'host=192.168.242.38 port=5432 dbname=test user=postgres password=postgres' publication mc_pub1;
复制
###如果发布端wal_level参数没改,创建订阅会报如下错误。
ERROR: could not create replication slot "sub20": ERROR: logical decoding requires wal_level >= logical
复制
05 验证
---发布端:
test=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 12767
usesysid | 10
usename | postgres
application_name | sub1
client_addr | 192.168.242.39
client_hostname |
client_port | 45805
backend_start | 2020-04-22 17:42:38.207911+08
backend_xmin |
state | streaming
sent_lsn | 0/F06A7D0
write_lsn | 0/F06A7D0
flush_lsn | 0/F06A7D0
replay_lsn | 0/F06A7D0
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2020-04-22 18:46:19.914323+08
复制
---订阅端:
aaaa=# select * from pg_stat_subscription ;
-[ RECORD 1 ]---------+------------------------------
subid | 16421
subname | sub1
pid | 26526
relid |
received_lsn | 0/F06A6E8
last_msg_send_time | 2020-04-22 18:01:03.130734+08
last_msg_receipt_time | 2020-04-22 18:01:04.343345+08
latest_end_lsn | 0/F06A6E8
latest_end_time | 2020-04-22 18:01:03.130734+08
复制
如上,可以看到,逻辑订阅已经生效了!
好,至此,有关pg逻辑订阅的的简单介绍就到这里。下次再见!
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。

评论
