如何确定影响指定表的最后一个LSN?(逻辑复制场景)
PostgreSQL逻辑复制:发布LSN跟踪与表映射技巧
一、每个发布的LSN跟踪方式
- PostgreSQL会通过复制槽间接跟踪发布的LSN进度。你可以查询
pg_replication_slots系统视图:- 其中
confirmed_flush_lsn字段代表订阅端已确认接收的LSN位置; - PostgreSQL 13及以上版本中,
publication_names字段直接关联了复制槽对应的发布,这样就能把槽的LSN和发布绑定起来。
- 其中
- 另外
pg_stat_replication视图里的flush_lsn能反映当前复制连接的LSN位置,但这是针对整个连接的,不是单发布的。如果你的订阅只关联一个发布,这个值也能代表该发布的进度。
二、LSN映射回对应表的技巧
- 用pg_waldump解析WAL:执行
pg_waldump --format=json <WAL文件名>,输出的JSON里会有relation字段(表的OID),再通过pg_class表转换为表名:
每条变更还会附带对应的LSN,以此完成关联。SELECT relname FROM pg_class WHERE oid = '表OID'; - 逻辑解码插件关联:用
test_decoding这类插件创建复制槽,然后调用pg_logical_slot_get_changes函数获取变更,结果里会直接给出relation(表名或OID)和对应的LSN,示例:SELECT lsn, relation, data FROM pg_logical_slot_get_changes('your_slot_name', NULL, NULL); - 自定义触发器记录(可选):如果需要实时记录每个表的变更LSN,可以给目标表添加触发器,在变更时把当前LSN(
pg_current_wal_lsn())和表信息写入日志表。但这种方法会增加性能开销,按需使用。
三、其他可用统计信息
- 订阅端可以查询
pg_stat_subscription,里面包含接收的变更数、最后同步的LSN、同步延迟等数据; - 发布端除了你已经在用的
pg_publication_tables,pg_publication视图能查看发布的配置信息,结合复制槽的LSN数据就能拼凑出发布的进度情况。
内容的提问来源于stack exchange,提问作者Dima Tisnek
相关产品推荐
相关产品推荐

