PG的逻辑复制
逻辑复制与物理复制
物理复制只能是备库,直接复制的是WAL日志
而逻辑复制需要逻辑解码的过程。
它分为两种,一种是逻辑解码客户端,一种是发布订阅模式
注意 发布订阅模式,适用于一个PG,复制到另一个PG,这之间不可能复制WAL日志。需要解码、处理事务边界、表的选取、等等。这些都在CREATE PUBLICATION / CREATE SUBSCRIPTION搞完了。但它的使用场景很局限,就是一个PG。
而在JDBC中实现的,debezium中使用的是逻辑解码客户端
基本概念:
1、发布 CREATE PUBLICATION
2、订阅 CREATE SUBSCRIPTION
3、逻辑复制槽 replication_slots
4、表的复制标识 ALTER TABLE your_table_name REPLICA IDENTITY FULL
5、插件类型
逻辑复制基本流程

pgoutput vs decoderbufs
设计目标
pgoutput 的设计目标,是服务于发布/订阅 这套原生逻辑复制体系。它必须知道 要发布哪些表。
decoderbufs 的设计目标,是服务于类似debezium这种第三方式工具,用于CDC或者其它统计工具的。
官方推荐
debezium 官方现在更推荐 pgoutput。因为很多云厂商不让安装三方插件,decoderbufs就不好用了。
提前过滤
使用pgoutput还有一个好处,是可以通过发布,来提前过滤一部分数据。而这个功能,在vb上需要通过add-tables参数来实现。
而这个提前过滤的功能,也越来越强,可以过滤列,可以 过滤行(加where语句)
逻辑复制槽管理
-- 增
SELECT * FROM pg_create_logical_replication_slot('zhimo_slot', 'test_decoding');
-- 删
SELECT pg_drop_replication_slot('slot_name');
-- 查
SELECT * FROM pg_replication_slots WHERE slot_type = 'logical';
-- 用 消费逻辑解码消息
postgres=# SELECT * FROM pg_logical_slot_get_changes('zhimo_slot', NULL, NULL);
lsn | xid | data
-----------+-----+----------------------------------------
0/2014CD0 | 761 | BEGIN 761
0/2014CD0 | 761 | table public.t1: INSERT: id[integer]:1
0/2014D40 | 761 | COMMIT 761
(3 rows)
复制标识
表发生了一次DDL或者DML,这个消息能否发出去,首先是这个表的复制标识。ALTER TABLE。。。 REPLICA IDENTITY
ALTER TABLE your_table_name REPLICA IDENTITY FULL;
ALTER TABLE your_table_name REPLICA IDENTITY DEFAULT;
![[企业微信截图_17870548852417.png]]
支持DDL开关
create publication mypub for all tables with (ddl='all');
必须指定所有表,参数为ddl='all' 这个命令目的不是创建publication,而是打开一个DDL开头。
因为PG原生,不管是pgoutput还是decoderbufs都不支持DDL。
VB定制了这个开关,就可以把DDL发送过来。
创建发布
CREATE PUBLICATION mypub FOR ALL TABLES;
SELECT * FROM pg_publication;
debezium在创建创建复制槽之前,如果是pgoutput,如果没有创建publication,可以自动创建。(是否创建、用什么名字,还需要参数控制)
![[Pasted image 20260909111509.png]]
数据库流复制状态查看
select * from pg_stat_replication;
浙公网安备 33010602011771号