逻辑复制订阅停在 i 状态:检查表同步 worker 是否有名额
逻辑复制订阅停在 i 状态且日志报 worker slots 不足,核对订阅端 apply 与表同步 worker 预算、总 worker 容量和重启生效条件。
CREATE SUBSCRIPTION 已成功,发布端也能看到复制连接,但订阅端的表一直停在 i 状态,目标表没有开始复制数据。若日志同时出现下面的警告,优先检查订阅端的逻辑复制 worker 预算:
WARNING: out of logical replication worker slots
HINT: You might need to increase max_logical_replication_workers.
订阅的 apply worker 已启动,并不表示负责初始数据复制的 table synchronization worker 也能启动。现有订阅可能已经用完预算,新订阅因此只有 apply worker,没有剩余名额开展表同步。
先区分初始化与正在复制数据
在订阅端目标数据库,用有相应目录和统计查询权限的维护账户检查状态。example_sub 是订阅名占位值:
SELECT s.subname, r.srrelid::regclass AS table_name, r.srsubstate
FROM pg_subscription AS s
JOIN pg_subscription_rel AS r ON r.srsubid = s.oid
WHERE s.subname = 'example_sub';
SELECT subname, pid, relid::regclass AS table_name,
received_lsn, latest_end_lsn
FROM pg_stat_subscription
WHERE subname = 'example_sub';
i 表示初始化,d 表示正在复制数据,f、s 是后续同步阶段,r 表示进入正常复制。表停在 d 时,需要查看复制任务是否还在推进;不能直接套用“同步 worker 启动不了”的判断。
把这些结果与同一时段的订阅端日志对应起来:有 apply 启动记录、没有相应表同步启动记录,并反复出现 worker slots 不足,才支持这条排查路径。只有 i 状态,或某个 LSN 暂时不变,不足以确定根因。
订阅数量不是 worker 数量的全部
max_logical_replication_workers 的预算包含 apply 和表同步 worker。支持并启用了并行 apply 的版本,还要计入这类 worker。举例说,上限为 4、已有 3 个订阅各占一个 apply worker,新订阅再占一个,初始表同步就可能没有空余名额。这是说明容量关系的示例,实际数量应结合任务与版本确认。
在订阅端检查下面几项,查询同时给出设置的生效方式:
SELECT name, setting, context, pending_restart
FROM pg_settings
WHERE name IN (
'max_logical_replication_workers',
'max_sync_workers_per_subscription',
'max_worker_processes',
'max_parallel_apply_workers_per_subscription',
'max_active_replication_origins'
)
ORDER BY name;
后两项依版本而定,旧服务器没有相应设置时不会返回对应行。不能因为当前文档列出了某项,就把它当作所有 PostgreSQL 版本都有的参数。
max_sync_workers_per_subscription 控制单个订阅初始复制的并发度;增加它不会突破全局 worker 限制。max_worker_processes 又是更外层的容量,部分扩展与并行查询也会使用它,所以不能只增加逻辑复制上限而忽略总预算。
按容量调整,不反复删除订阅
确认这类日志后,按现有订阅、预计初始同步并发和其他后台任务安排名额。保存原配置,核对实例启动参数与配置覆盖关系。max_logical_replication_workers 和 max_worker_processes 需要服务器重启才生效,安排维护窗口;重载配置后看到文件已经修改,不代表新预算已经启用。
发布端另有复制槽和 WAL sender 的容量要求,表初始同步也需要余量。订阅端 worker 警告与发布端连接或复制槽错误应分别处理;不要把其中一边的上限当成另一边的修复。WAL sender 连接限制可对照物理备份使用复制连接时的容量检查。
反复删除、重建订阅不能增加 worker 名额,还可能改变同步状态与复制槽处理。先保留现有状态与日志,不用重建操作代替容量核对。
调整生效后,确认表同步 worker 能启动、表状态逐步进入 r,并按业务检查初始数据和后续已提交变更。警告消失但表仍未推进,应继续查新的明确错误,例如权限、表结构或复制槽问题;不能只凭订阅连接存在宣布同步完成。
回退容量设置前,重新核对仍在运行的订阅和任务。恢复旧上限可能再次造成同样的初始化等待,也不会撤销此前已同步的数据。


