受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

Chapter 29. 逻辑复制

逻辑复制是一种基于数据对象及其复制标识(通常是主键)来复制数据对象及其变更的方法。这里使用“逻辑”一词,是为了与物理复制相区别;物理复制使用精确的块地址,并按字节逐一复制。PostgreSQL 可以同时支持这两种机制,见 Chapter 26。逻辑复制允许对数据复制和安全性进行细粒度控制。

逻辑复制采用发布订阅模型,一个或多个订阅者订阅某个发布者节点上的一个或多个发布。订阅者从其订阅的发布中拉取数据,随后还可以重新发布这些数据,以实现级联复制或更复杂的配置。

表的逻辑复制通常开始于在发布者数据库中为数据建立快照,并将其复制到订阅者。完成后,发布者上的变更会在发生时实时发送给订阅者。订阅者会按与发布者相同的顺序应用这些数据,因此对于单个订阅中的发布,可以保证事务一致性。这种数据复制方法有时也称为事务性复制。

逻辑复制的典型用法是:

  • 当单个数据库或数据库的某个子集发生变更时,将增量变更发送给订阅者。

  • 当单个变更到达订阅端时触发触发器。

  • 将多个数据库汇总到单个数据库中(例如用于分析)。

  • 在PostgreSQL的不同主版本之间进行复制。

  • 在不同平台上(例如Linux到Windows)的PostgreSQL实例之间进行复制。

  • 向不同用户组开放对复制数据的访问。

  • 在多个数据库间共享数据库的一个子集。

订阅端数据库的行为与任何其他 PostgreSQL 实例相同,并且可以通过定义自己的发布,作为其他数据库的发布者。当应用把订阅端视为只读时,单个订阅不会产生冲突。另一方面,如果应用或其他订阅者对同一组表执行了其他写操作,就可能发生冲突。

29.1. 发布 #

发布可以定义在任何物理复制主库上。定义发布的节点称为发布者。发布是一组由某个表或一组表产生的变更,也可称为变更集或复制集。每个发布只存在于一个数据库中。

发布与模式不同,不影响表的访问方式。每个表在需要时都可以加入多个发布。发布目前只能包含表。除非创建发布时使用ALL TABLES,否则对象必须显式添加。

发布可以选择将要产生的变更限制为INSERTUPDATEDELETETRUNCATE的任意组合,类似于触发器按特定事件类型触发。默认会复制所有操作类型。

已发布的表必须配置了复制标识,才能复制UPDATEDELETE操作,以便在订阅端能够识别要更新或删除的对应行。默认情况下,使用主键(如果有的话)。也可以将另一个唯一索引(有一些额外要求)设置为复制标识。如果表没有任何合适的键,则可以将其复制标识设置为full,这意味着整行都成为键。但这样做效率很低,只应在无其他方案时作为后备使用。如果在发布端设置了full以外的复制标识,则订阅端也必须设置包含相同或更少列的复制标识。关于如何设置复制标识的详细信息,见REPLICA IDENTITY。如果一个没有复制标识的表被添加到了可复制UPDATEDELETE操作的发布中,后续的UPDATEDELETE操作将在发布端产生错误。无论复制标识如何,INSERT操作都可以正常进行。

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

发布使用CREATE PUBLICATION命令创建,随后可以使用相应命令进行修改或删除。

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

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。