pg_logical_slot_get_changes()
是一个系统函数,用于返回指定逻辑复制槽中的一组指定更改。
pg_logical_slot_get_changes()
在 PostgreSQL 9.4 中添加。
用法
pg_logical_slot_get_changes (slot_name
name
,upto_lsn
pg_lsn
,upto_nchanges
integer
, VARIADICoptions
text
[] ) →
setof record (lsn
pg_lsn
,xid
xid
,data
text
)
返回的更改集将从之前已使用更改的点开始。
如果 upto_lsn
和 upto_nchanges
都是 NULL
,则将返回直到可用 WAL 结束的所有更改。
options
参数允许提供与逻辑复制槽关联的输出插件定义的选项。
要检索更改而不使用它们,请使用 pg_logical_slot_peek_changes()
。
变更历史
- PostgreSQL 9.4
- 添加 (提交 b89e1510)
示例
使用指定为插件的 test_decoding
创建一个逻辑复制槽
postgres=# SELECT * FROM pg_create_logical_replication_slot('test_slot_1', 'test_decoding'); slot_name | lsn -------------+----------- test_slot_1 | 0/3000758 (1 row)
创建一些WAL活动,这里通过将一行插入到现有表中来实现
postgres=# INSERT INTO foo VALUES (1, clock_timestamp()); INSERT 0 1
然后可以通过先前创建的逻辑复制槽使用 pg_logical_slot_get_changes()
查询此WAL活动
postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot_1', NULL, NULL, 'include-xids', '0'); lsn | xid | data -----------+-----+----------------------------------------------------------------------------------- 0/3023580 | 726 | BEGIN 0/3023580 | 726 | table public.foo: INSERT: id[integer]:1 val[text]:'2021-08-09 10:00:38.622597+01' 0/3023610 | 726 | COMMIT (3 rows)
由于输出插件现在已使用更改,因此后续对 pg_logical_slot_get_changes()
的调用(假设没有写入其他WAL)将返回一个空结果集
postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot_1', NULL, NULL, 'include-xids', '0'); lsn | xid | data -----+-----+------ (0 rows)
尝试从物理复制槽检索更改
postgres=# SELECT * FROM pg_logical_slot_get_changes('physical_slot_1', NULL, NULL, 'include-xids', '0'); ERROR: cannot use physical replication slot for logical decoding
参考文献
- PostgreSQL 文档: 复制管理函数