pg_logical_slot_peek_binary_changes()
是一个系统函数,它返回指定逻辑复制槽中的一组指定更改,但不使用它们,这意味着可以再次检索同一组更改。每个更改的内容都作为 bytea
返回。
pg_logical_slot_peek_binary_changes()
在 PostgreSQL 9.4 中添加。
用法
pg_logical_slot_peek_binary_changes (slot_name
name
,upto_lsn
pg_lsn
,upto_nchanges
integer
, VARIADICoptions
text
[] ) →
setof record (lsn
pg_lsn
,xid
xid
,data
text
)
返回的更改集将从复制槽的当前 restart_lsn
值开始。
如果 upto_lsn
和 upto_nchanges
都为 NULL
,则将返回直到可用 WAL 结束的所有更改。
options
参数允许提供与逻辑复制槽关联的输出插件定义的选项。
要检索更改并推进复制槽,请使用 pg_logical_slot_get_binary_changes()
或 pg_logical_slot_get_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/492B078 (1 row)
创建一些 WAL 活动,这里通过将一行插入到现有表中
postgres=# INSERT INTO foo VALUES (1, 'foo'); INSERT 0 1
然后可以使用 pg_logical_slot_peek_binary_changes()
通过先前创建的逻辑复制槽重复查询此 WAL 活动
postgres=# SELECT * FROM pg_logical_slot_peek_binary_changes('test_slot_1', NULL, NULL, 'include-xids', '0'); lsn | xid | data -----------+-----+------------------------------------------------------------------------------------------------------------------ 0/492B078 | 718 | \x424547494e 0/492B078 | 718 | \x7461626c65207075626c69632e666f6f3a20494e534552543a2069645b696e74656765725d3a312076616c5b746578745d3a27666f6f27 0/492C6A8 | 718 | \x434f4d4d4954 (3 rows) postgres=# SELECT * FROM pg_logical_slot_peek_binary_changes('test_slot_1', NULL, NULL, 'include-xids', '0'); lsn | xid | data -----------+-----+------------------------------------------------------------------------------------------------------------------ 0/492B078 | 718 | \x424547494e 0/492B078 | 718 | \x7461626c65207075626c69632e666f6f3a20494e534552543a2069645b696e74656765725d3a312076616c5b746578745d3a27666f6f27 0/492C6A8 | 718 | \x434f4d4d4954 (3 rows)
如果随后使用例如 pg_logical_slot_get_binary_changes()
使用可用 WAL,或者复制槽被推进(并且没有其他 WAL 活动发生),则先前返回的数据将不再可用
postgres=# SELECT * FROM pg_replication_slot_advance('test_slot_1', '0/492C6A8'); slot_name | end_lsn -------------+----------- test_slot_1 | 0/492C6A8 (1 row) postgres=# SELECT * FROM pg_logical_slot_peek_binary_changes('test_slot_1', NULL, NULL, 'include-xids', '0'); lsn | xid | data -----+-----+------ (0 rows)
参考
- PostgreSQL 文档: 复制管理函数