逻辑复制目前存在以下限制或缺少的功能。这些问题可能会在将来的版本中得到解决。
数据库模式和 DDL 命令不会被复制。初始模式可以通过手动使用 pg_dump --schema-only
来复制。后续模式更改需要手动同步。(但请注意,发布者和订阅者两侧的模式并不需要完全相同。)逻辑复制在实时数据库中模式定义发生变化时非常可靠:当发布者上的模式发生变化,并开始将数据复制到订阅者,但这些数据与表模式不匹配时,复制将出错,直到模式更新。在许多情况下,可以通过先对订阅者应用增量模式更改来避免间歇性错误。
序列数据不会被复制。序列支持的串行或标识列中的数据当然会作为表的一部分被复制,但序列本身仍然会在订阅者上显示起始值。如果订阅者用作只读数据库,则通常不会出现问题。但是,如果打算将订阅者数据库进行某种切换或故障转移,则需要将序列更新到最新值,可以通过以下两种方式之一:从发布者复制当前数据(可能使用 pg_dump
),或者从表本身确定一个足够高的值。
支持复制 TRUNCATE
命令,但使用外键连接的表组进行截断时必须小心。在复制截断操作时,订阅者将截断与发布者上截断的相同表组(显式指定或通过 CASCADE
隐式收集),减去不在订阅范围内的表。如果所有受影响的表都属于同一个订阅,则此操作将正常工作。但是,如果订阅者上要截断的一些表与不在同一个(或任何)订阅范围内的表具有外键链接,则在订阅者上应用截断操作将失败。
大型对象(参见 第 33 章)不会被复制。除了将数据存储在普通表中,没有其他解决方法。
复制仅受表支持,包括分区表。尝试复制其他类型的关系(如视图、物化视图或外部表)会导致错误。
在分区表之间进行复制时,实际复制默认情况下会从发布者上的叶分区开始,因此发布者上的分区也必须在订阅者上作为有效的目标表存在。(它们可以是叶分区本身,也可以是进一步子分区,甚至可以是独立表。)发布者也可以指定使用分区根表的标识和模式来复制更改,而不是使用实际发生更改的单个叶分区(参见 publish_via_partition_root
参数的 CREATE PUBLICATION
)。
在已发布的表上使用 REPLICA IDENTITY FULL
时,需要注意的是,如果表包含具有数据类型(如点或框)的属性,而这些属性没有 B 树或哈希的默认操作符类,则 UPDATE
和 DELETE
操作无法应用于订阅者。但是,可以通过确保表具有主键或为其定义的副本标识来克服此限制。
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。