2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

29.1. 发布 #

任何物理复制主服务器都可以定义一个发布。定义发布节点的节点被称为发布者。发布是指从表或一组表中生成的一组更改,也可以描述为更改集或复制集。每个发布只存在于一个数据库中。

发布与模式不同,并且不影响表如何被访问。如果需要,每个表都可以添加到多个发布中。目前,发布只能包含表和模式中的所有表。对象必须显式添加,除非发布是为ALL TABLES创建的。

发布可以选择将其生成的更改限制为INSERTUPDATEDELETETRUNCATE的任意组合,这与触发器如何由特定事件类型触发类似。默认情况下,所有操作类型都会被复制。这些发布规范仅适用于 DML 操作;它们不影响初始数据同步复制。(行过滤器对TRUNCATE无效。参见第 29.4 节)。

每个发布都可以有多个订阅者。

发布使用 CREATE PUBLICATION 命令创建,之后可以使用相应的命令进行修改或删除。

可以使用 ALTER PUBLICATION 动态添加和删除单个表。ADD TABLEDROP TABLE 操作都是事务性的,因此一旦事务提交,表将在正确的快照点开始或停止复制。

29.1.1. 副本标识 #

为了能够复制 UPDATEDELETE 操作,被发布的表必须配置副本标识,以便在订阅者端能够识别要更新或删除的相应行。

默认情况下,这是主键(如果存在)。也可以设置另一个唯一索引(带有某些附加要求)作为副本标识。如果表没有任何合适的键,则可以将其设置为副本标识 FULL,这意味着整行都成为键。当指定副本标识 FULL 时,可以在订阅者端使用索引来搜索行。候选索引必须是 btree 或 hash 类型,非部分索引,并且最左边的索引字段必须是一个列(而不是表达式),该列引用被发布表的列。这些对非唯一索引属性的限制遵循了对主键强制执行的一些限制。如果不存在这样的合适索引,订阅者端的搜索可能会非常低效,因此副本标识 FULL 仅应作为备选方案,在没有其他解决方案可能时使用。

如果在发布者端设置了除 FULL 以外的副本标识,则订阅者端也必须设置相同或更少列的副本标识。

副本标识定义为 NOTHING、没有主键的 DEFAULT 或已删除索引的 USING INDEX 的表,在包含在复制这些操作的发布中时,不支持 UPDATEDELETE 操作。尝试执行此类操作将在发布者端导致错误。

INSERT 操作可以正常进行,而无需考虑任何副本标识。

有关如何设置副本标识的详细信息,请参阅 ALTER TABLE...REPLICA IDENTITY

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。