# 第 50 章复制进度跟踪

复制源旨在更轻松地实现逻辑复制解决方案逻辑解码.它们为两个常见问题提供了解决方案:

  • 如何安全地跟踪复制进度

  • 如何根据行的来源更改复制行为;例如,为了防止双向复制设置中的循环

    复制源只有两个属性,一个名称和一个 OID。这个名字应该用来指代跨系统的起源,是自由格式的文本.应该以一种方式使用它,使不同复制解决方案创建的复制源之间的冲突不太可能发生;例如,通过在复制解决方案的名称前面加上前缀。OID 仅用于避免在空间效率很重要的情况下必须存储长版本。它不应该跨系统共享。

    可以使用该函数创建复制源pg_replication_origin_create();放弃使用pg_replication_origin_drop();并在pg_replication_origin系统目录。

    构建复制解决方案的一个重要部分是以安全的方式跟踪重播进度。当应用程序或整个集群死亡时,需要能够找出数据已成功复制的位置。对此的简单解决方案,例如为每个重放事务更新表中的一行,存在运行时开销和数据库膨胀等问题。

    使用复制源基础结构,可以将会话标记为从远程节点重播(使用pg_复制_起源_会话_设置()功能)。此外,每个源事务的LSN和提交时间戳可以使用pg_复制_原点_xact_设置()。如果这样做,复制过程将以崩溃安全的方式持续。可以在中看到所有复制源的重播进度pg_复制_来源_状态看法单个来源的进度,例如恢复复制时,可以使用pg_复制_来源_进度()任何来源或pg_复制_起源_会话_进度()用于当前会话中配置的源。

    在比从一个系统复制到另一个系统更复杂的复制拓扑中,另一个问题可能是很难避免再次复制重放的行。这可能会导致复制周期和效率低下。复制源提供了一种可选的机制来识别和防止这种情况。当使用上一段中引用的函数进行配置时,每个更改和事务都会传递给输出插件回调(请参阅第49.6节)由会话生成的数据将被标记为生成会话的复制源。这允许在输出插件中对它们进行不同的处理,例如,忽略除本地源行以外的所有行。此外按来源过滤回调可用于根据源过滤逻辑解码更改流。虽然灵活性较低,但通过该回调进行过滤比在输出插件中进行过滤要高效得多。