pg_logical_slot_peek_binary_changes() 是一个系统函数,它返回指定的逻辑复制槽中的指定更改集合,而不会消耗它们,这意味着同一组更改可以被再次检索。返回的每个更改的内容都以 bytea 的形式给出。
pg_logical_slot_peek_binary_changes() 函数已在 PostgreSQL 9.4 中添加。
用法
pg_logical_slot_peek_binary_changes (slot_namename,upto_lsnpg_lsn,upto_nchangesinteger, VARIADICoptionstext[] ) →
setof record (lsnpg_lsn,xidxid,datatext)
返回的更改集将从复制槽的当前 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)
如果可用的 WAL 被消耗,例如使用 pg_logical_slot_get_binary_changes(),或者复制槽被推进(且没有其他 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 文档: 复制管理函数
