31.2. Subscription

  • subscription 是逻辑复制的下游。定义预订的节点称为 subscriber *。订阅定义到另一个数据库的连接以及它要订阅的一组出版物(一个或多个)。

订阅者数据库的行为与任何其他 PostgreSQL 实例相同,并且可以通过定义自己的发布而用作其他数据库的发布者。

如果需要,订户节点可以具有多个订阅。可以在单个发布者-订阅者对之间定义多个订阅,在这种情况下,必须注意确保订阅的发布对象不重叠。

每个订阅将通过一个复制插槽接收更改(请参阅Section 26.2.6)。对于先前存在的表数据的初始数据同步,可能需要其他临时复制插槽。

逻辑复制预订可以是同步复制的备用数据库(请参见Section 26.2.8)。备用名称默认为订阅名称。可以在订阅的连接信息中将备用名称指定为application_name

如果当前用户是超级用户,则订阅将由pg_dump转储。否则,将写警告并跳过订阅,因为非超级用户无法从pg_subscription目录读取所有订阅信息。

该订阅是使用CREATE SUBSCRIPTION添加的,可以随时使用ALTER SUBSCRIPTION命令停止/恢复,并可以使用DROP SUBSCRIPTION删除。

删除并重新创建订阅后,同步信息将丢失。这意味着此后必须重新同步数据。

模式定义不被复制,并且发布的表必须在订阅服务器上存在。仅常规表可能是复制的目标。例如,您不能复制到视图。

使用完全限定的表名在发布者和订阅者之间匹配表。不支持复制到订阅服务器上名称不同的表。

表的列也按名称匹配。订户表中的列 Sequences 不需要与发布者的相匹配。列的数据类型不需要匹配,只要可以将数据的文本表示形式转换为目标类型即可。例如,您可以从integer类型的列复制到bigint类型的列。目标表还可以具有发布表未提供的其他列。任何此类列都将使用目标表的定义中指定的默认值填充。

31 .2.1. 复制插槽 Management

如前所述,每个(活动)订阅都从远程(发布)端的复制插槽接收更改。通常,使用CREATE SUBSCRIPTION创建订阅时会自动创建远程复制插槽,而使用DROP SUBSCRIPTION删除订阅时会自动删除远程复制插槽。但是,在某些情况下,单独操作预订和基础复制插槽可能是有用或必要的。以下是一些方案:

  • 创建预订时,复制插槽已存在。在这种情况下,可以使用create_slot = false选项将订阅创建为与现有广告位相关联。

  • 创建订阅时,远程主机不可访问或状态不清楚。在这种情况下,可以使用connect = false选项创建订阅。这样就根本不会联系远程主机。这就是 pg_dump 使用的。然后必须先手动创建远程复制插槽,然后才能激活订阅。

  • 删除订阅时,应保留复制插槽。当订户数据库移至其他主机并从该主机激活时,这可能很有用。在这种情况下,请先尝试删除订阅,然后使用ALTER SUBSCRIPTION将插槽与订阅解除关联。

  • 删除订阅时,无法访问远程主机。在这种情况下,请先尝试删除订阅,然后使用ALTER SUBSCRIPTION将插槽与订阅解除关联。如果远程数据库实例不再存在,则无需采取进一步的措施。但是,如果远程数据库实例只是不可访问的,则应手动删除复制插槽;否则,必须手动删除复制插槽。否则它将 continue 保留 WAL,并可能最终导致磁盘装满。此类情况应仔细调查。