PostgreSQL逻辑复制各srsubstate状态下节点重启的影响问询
PostgreSQL逻辑复制:
pg_subscription_rel不同状态下节点重启的影响 先明确srsubstate各状态定义
i:初始化中(正在执行表的全量初始数据复制)d:数据同步中(全量复制完成,正在追赶订阅创建后到全量结束期间的增量变更)s:同步完成待启动(初始同步+增量追赶全部完成,等待进入正常复制)r:正常复制中(持续接收并应用发布端的增量更新)
各状态下重启发布者/订阅者的具体影响
1. 状态i(初始化中)
- 订阅者重启:重启后会重新触发该表的全量初始复制,因为此时未完成初始复制,订阅端没有留存足够的进度标记来恢复中断的复制流程。
- 发布者重启:发布端重启会导致订阅端的初始复制进程中断,连接恢复后同样会重新执行全量复制。
2. 状态d(数据同步中)
- 订阅者重启:重启后从上次中断的LSN(日志序列号)位置继续追赶增量变更,无需重新全量复制。此时全量复制已完成,订阅端已记录全量完成时的LSN,可基于此断点恢复。
- 发布者重启:发布端重启后,订阅端同步进程短暂中断,连接恢复后从已记录的LSN位置继续追赶增量,无需重新全量复制。
3. 状态s(同步完成待启动)
- 订阅者重启:重启后直接进入
r状态,开始正常复制增量,不会触发全量复制。初始同步和增量追赶都已完成,订阅端留存完整进度信息。 - 发布者重启:发布端重启不影响订阅端状态,连接恢复后订阅端正常进入
r状态开始复制,无需重新同步。
4. 状态r(正常复制中)
- 订阅者重启:重启后自动重连发布端,从断开时的LSN位置继续应用增量,不会重新复制全量数据。
- 发布者重启:发布端重启后,订阅端连接恢复后从最后记录的LSN位置继续接收增量,无需重新同步。
对猜测的验证
你的猜测大部分正确,仅一处修正:
s或r状态下,任意节点重启确实不会触发全量数据重复制,符合你的判断。- 但
d状态下,无论哪端重启都不需要重新全量复制,仅从断点继续追赶增量;只有i状态下重启才会重新执行全量复制。
内容的提问来源于stack exchange,提问作者Paymahn Moghadasian
相关产品推荐
相关产品推荐

