You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres逻辑复制卡在LSN,如何获取pg_replication_origin_advance所需的下一个LSN?

AWS RDS Postgres 13 订阅卡LSN及复制槽增大问题解决步骤

一、获取关键LSN信息

先在订阅端执行以下查询,明确各节点LSN状态:

  1. 查看订阅的复制原点当前卡住的LSN:
SELECT roident, roname, rolsn FROM pg_replication_origin;

返回的rolsn就是你提到的卡住的33533/7D2841D8。

  1. 查看订阅端已接收的最新LSN:
SELECT subname, received_lsn FROM pg_stat_subscription;

这里的received_lsn就是你需要的下一个目标LSN——因为你提到这个值一直在推进,说明订阅端已经接收完成这部分日志,可以安全跳过到这个位置。

二、执行LSN跳过操作

1. 停止订阅

ALTER SUBSCRIPTION 你的订阅名称 DISABLE;

替换你的订阅名称为实际订阅的名称。

2. 调用pg_replication_origin_advance跳过卡住的LSN

用第一步查到的roident(复制原点ID)和received_lsn(已接收的最新LSN)执行:

SELECT pg_replication_origin_advance(
    (SELECT roident FROM pg_replication_origin WHERE roname = '你的订阅名称'),
    '查到的received_lsn值' -- 例如'33533/80000000'
);

注意:必须确保目标LSN是订阅端已接收完成的,不能指定比received_lsn更大的值,否则会引发数据不一致。

3. 重新启用订阅

ALTER SUBSCRIPTION 你的订阅名称 ENABLE;

三、验证修复效果

  1. 主节点查看复制槽大小是否回落:
SELECT slot_name,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS slot_size
FROM pg_replication_slots WHERE slot_type = 'logical';
  1. 订阅端查看应用进度是否恢复:
SELECT subname, received_lsn, applied_lsn FROM pg_stat_subscription;

确认applied_lsn开始追赶上received_lsn。

四、后续排查建议

  • 通过AWS CloudWatch查看Postgres日志,搜索logical replication worker相关条目,定位卡住事务的具体错误原因。
  • 核对订阅端与主节点的表结构,确保主键、唯一约束等完全一致,结构不匹配是逻辑复制卡住的常见原因。

内容的提问来源于stack exchange,提问作者mj_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:39:53