版本:
目录导航

29.1. 发布 #

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

publication与模式不同,不影响表的访问。每个表可以添加到多个publication中(如果需要)。 publication目前只能包含模式中的所有表。对象必须显式添加,除非为ALL TABLES创建了一个publication。

publication可以选择将它们产生的更改限制为INSERT、UPDATE、 DELETE和TRUNCATE的任意组合,类似于触发器如何由特定事件类型触发。 默认情况下,所有操作类型都会被复制。这些出版规范仅适用于DML操作;它们不影响初始数据同步副本。 (行过滤器对TRUNCATE没有影响。请参见第 29.4 节)。

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

publication通过使用CREATE PUBLICATION命令创建,并且可以在之后使用相应的命令进行修改或删除。

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

29.1.1. 副本标识 #

发布的表必须配置一个副本标识 才能复制UPDATE和DELETE操作, 以便在订阅者端能够识别出适当的行进行更新或删除。

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

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

定义为 NOTHING、没有主键的 DEFAULT, 或者使用已删除索引的 USING INDEX 的表, 在包含这些操作的发布中无法支持 UPDATE 或 DELETE 操作。尝试此类操作将在发布者上导致错误。

INSERT 操作可以在任何副本标识下进行。

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