任何物理复制主服务器都可以定义一个发布。定义发布节点的节点被称为发布者。发布是指从表或一组表中生成的一组更改,也可以描述为更改集或复制集。每个发布只存在于一个数据库中。
发布与模式不同,并且不影响表如何被访问。如果需要,每个表都可以添加到多个发布中。目前,发布只能包含表和模式中的所有表。对象必须显式添加,除非发布是为ALL TABLES
创建的。
发布可以选择将其生成的更改限制为INSERT
、UPDATE
、DELETE
和TRUNCATE
的任意组合,这与触发器如何由特定事件类型触发类似。默认情况下,所有操作类型都会被复制。这些发布规范仅适用于 DML 操作;它们不影响初始数据同步复制。(行过滤器对TRUNCATE
无效。参见第 29.4 节)。
每个发布都可以有多个订阅者。
发布使用 CREATE PUBLICATION
命令创建,之后可以使用相应的命令进行修改或删除。
可以使用 ALTER PUBLICATION
动态添加和删除单个表。ADD TABLE
和 DROP TABLE
操作都是事务性的,因此一旦事务提交,表将在正确的快照点开始或停止复制。
为了能够复制 UPDATE
和 DELETE
操作,被发布的表必须配置副本标识,以便在订阅者端能够识别要更新或删除的相应行。
默认情况下,这是主键(如果存在)。也可以设置另一个唯一索引(带有某些附加要求)作为副本标识。如果表没有任何合适的键,则可以将其设置为副本标识 FULL
,这意味着整行都成为键。当指定副本标识 FULL
时,可以在订阅者端使用索引来搜索行。候选索引必须是 btree 或 hash 类型,非部分索引,并且最左边的索引字段必须是一个列(而不是表达式),该列引用被发布表的列。这些对非唯一索引属性的限制遵循了对主键强制执行的一些限制。如果不存在这样的合适索引,订阅者端的搜索可能会非常低效,因此副本标识 FULL
仅应作为备选方案,在没有其他解决方案可能时使用。
如果在发布者端设置了除 FULL
以外的副本标识,则订阅者端也必须设置相同或更少列的副本标识。
副本标识定义为 NOTHING
、没有主键的 DEFAULT
或已删除索引的 USING INDEX
的表,在包含在复制这些操作的发布中时,不支持 UPDATE
或 DELETE
操作。尝试执行此类操作将在发布者端导致错误。
INSERT
操作可以正常进行,而无需考虑任何副本标识。
有关如何设置副本标识的详细信息,请参阅 ALTER TABLE...REPLICA IDENTITY
。
如果您在文档中看到任何不正确的内容、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。