逻辑复制目前有以下限制或缺失功能。这些问题可能会在未来版本中解决。
数据库架构和 DDL 命令不会复制。可以使用 pg_dump --schema-only
手动复制初始架构。后续架构更改需要手动保持同步。(但是,请注意,两侧的架构不必完全相同。)当架构定义在活动数据库中更改时,逻辑复制非常稳定:当在发布者上更改架构并且复制的数据开始到达订阅者但与表架构不符时,复制会出错,直到架构更新。在许多情况下,可以通过首先对订阅者应用附加架构更改来避免间歇性错误。
序列数据不会复制。序列支持的序列或标识列中的数据当然会作为表的一部分进行复制,但序列本身仍会在订阅者上显示起始值。如果订阅者用作只读数据库,则通常不会出现问题。但是,如果打算对订阅者数据库进行某种切换或故障转移,则需要将序列更新为最新值,方法是复制发布者的当前数据(也许使用 pg_dump
)或从表本身确定足够高的值。
支持复制 TRUNCATE
命令,但在截断通过外键连接的表组时必须小心。在复制截断操作时,订阅者将截断发布者上截断的同一组表,这些表可以是显式指定的,也可以通过 CASCADE
隐式收集的,减去不属于订阅的表。如果所有受影响的表都属于同一订阅,则此操作将正常工作。但是,如果订阅者上要截断的某些表具有指向不属于同一(或任何)订阅的表的外键链接,则在订阅者上应用截断操作将失败。
大对象(请参阅 第 35 章)不会复制。除了将数据存储在普通表中之外,没有其他解决方法。
仅支持复制表,包括分区表。尝试复制其他类型的关系(例如视图、物化视图或外部表)将导致错误。
在分区表之间复制时,默认情况下,实际复制源自发布者上的叶分区,因此发布者上的分区也必须在订阅者上作为有效的目标表存在。(它们可以是叶分区本身,也可以进一步进行子分区,甚至可以是独立表。)发布还可以指定使用分区根表的标识和模式来复制更改,而不是实际进行更改的各个叶分区的标识和模式(请参阅 CREATE PUBLICATION
的 publish_via_partition_root
参数)。