可以在任何物理复制主节点上定义发布。定义发布的节点称为发布者。发布是由某个表或一组表生成的变更集合,也可以将其描述为变更集或复制集。每个发布仅存在于一个数据库中。
发布不同于模式,并且不影响表访问的方式。如有需要,可以将每个表添加到多个发布中。目前,发布只能包含表和模式.中的所有表。必须显式添加对象,除非为ALL TABLES
创建发布。
发布者可以选择将他们生成的变化限制在 INSERT
、UPDATE
、DELETE
和 TRUNCATE
的任意组合中,类似于由特定事件类型触发的触发器的激活方式。默认情况下,所有操作类型都会被复制。这些发布规范仅适用于 DML 操作;它们不会影响初始数据同步副本。(行过滤器对 TRUNCATE
没有影响。请参阅 章节 29.4)。
已发布的表必须配置有 副本标识,以便能够复制 UPDATE
和 DELETE
操作,以便可以在订户方识别要更新或删除的相应行。默认情况下,如果存在主键,则这是主键。还可以将另一个唯一索引(具有某些附加要求)设置为副本标识。如果表没有任何合适的键,则可以将其设置为副本标识 FULL
,这意味着整个行都变为键。当指定副本标识 FULL
时,可以在订户方使用索引来搜索行。候选索引必须是 btree 或哈希,而非局部,并且最左边的索引字段必须是没有表达式的列(而不是表达式),该列引用已发布的表列。对非唯一索引属性的这些限制遵循对主键强制执行的部分限制。如果没有此类合适的索引,则订户方的搜索可能会非常低效,因此副本标识 FULL
应该仅在没有其他可能方案时作为后备方案使用。如果在发布者方设置了非 FULL
的副本标识,则还必须在订户方设置包含相同或更少列的副本标识。请参阅 REPLICA IDENTITY
以了解有关如何设置副本标识的详细信息。如果将没有副本标识的表添加到复制 UPDATE
或 DELETE
操作的发布中,则后续 UPDATE
或 DELETE
操作将在发布者端导致错误。INSERT
操作可以继续进行,而不管是否存在副本标识。
每个发布都可以有多个订阅者。
发布是使用 CREATE PUBLICATION
命令创建的,并且随后可以使用相应的命令对其进行更改或删除。
可以使用 ALTER PUBLICATION
动态添加和删除各个表格。 ADD TABLE
和 DROP TABLE
操作都是事务性的;因此,事务提交后表格才会在正确的快照上开始或停止复制。