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