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