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

29.1. 发布 #

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

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

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

已发布的表必须配置 副本标识才能复制 UPDATEDELETE 操作,以便在订阅者端识别出要更新或删除的适当行。默认情况下,这是主键(如果有)。另一个唯一索引(具有某些额外要求)也可以被设置为副本标识。如果表没有合适的键,那么它可以设置为副本标识 FULL,这意味着整行将成为键。当指定副本标识 FULL 时,可以在订阅者端使用索引来搜索行。候选索引必须是 btree 或哈希,非部分索引,并且最左侧的索引字段必须是引用已发布表列的列(而不是表达式)。对非唯一索引属性的这些限制遵循对主键执行的一些限制。如果不存在这样的合适索引,则在订阅者端进行搜索可能会非常低效,因此只有在没有其他解决方案的情况下才应该使用副本标识 FULL。如果在发布者端设置了除 FULL 之外的副本标识,那么在订阅者端也必须设置包含相同或更少列的副本标识。有关如何设置副本标识的详细信息,请参见 REPLICA IDENTITY。如果将没有副本标识的表添加到复制 UPDATEDELETE 操作的发布中,则后续的 UPDATEDELETE 操作将在发布者端导致错误。无论任何副本标识如何,INSERT 操作都可以继续进行。

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

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

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

提交更正

如果您在文档中发现任何错误,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。