31.2. 订阅
订阅是逻辑复制的下游端。定义订阅的节点被称为 订阅者。 订阅定义了与另一个数据库的连接以及它想要订阅的一组发布(一个或多个)。
订阅者数据库的行为与任何其他PostgreSQL实例的行为相同, 并且可以通过定义自己的发布来用作其他数据库的发布者。
如果需要,一个订阅者节点可以有多个订阅。在单个发布者-订阅者对之间可以定义多个订阅, 这种情况下,必须小心确保订阅的发布对象不重复。
每个订阅都将通过一个复制槽接收更改(请参阅第 26.2.6 节)。 对于预先存在的表数据的初始数据同步可能需要额外的临时复制槽。
逻辑复制订阅可以作为同步复制的备用数据库(请参见第 26.2.8 节)。 备用名称默认是订阅名称。可以在订阅的连接信息中指定一个替代名称为 application_name
。
如果当前用户是超级用户,则通过pg_dump
转储订阅。 否则会发出警告,并且会跳过订阅,因为非超级用户无法读取 pg_subscription
目录中的所有订阅信息。
订阅是使用CREATE SUBSCRIPTION添加的, 并且可以随时使用ALTER SUBSCRIPTION命令停止/恢复, 使用DROP SUBSCRIPTION删除。
当订阅被删除并重新创建时,同步信息将丢失。这意味着之后的数据必须重新同步。
架构定义不会被复制,并且已发布的表格必须存在于订阅者上。 只有常规表可以是复制的目标。例如,您不能复制到视图。
发布者和订阅者之间的表使用完全限定的表名匹配。不支持复制到订阅者上不同名称的表。
一个表的列也是按名字匹配的。目标表中不同的列顺序是允许的, 但是列类型必须匹配。目标表可以有发布的表未提供的附加列。 那些将被填充他们的默认值。
31.2.1. 复制槽管理
如前所述,每个(活动)订阅都从远程(发布)端的复制槽接收更改。 通常,使用CREATE SUBSCRIPTION
创建订阅时会自动创建远程复制槽,使用DROP SUBSCRIPTION
删除订阅时会自动删除该槽。但是,在某些情况下, 单独操作订阅和底层复制槽是有用的或必要的。以下是一些情况:
-
创建订阅时,复制槽已经存在。在这种情况下, 订阅可以使用
create_slot = false
选项与现有槽关联来创建。 -
创建订阅时,远程主机无法访问或处于不清晰的状态。在这种情况下, 可以使用
connect = false
选项创建订阅。 这样将不连接远程主机。这是pg_dump使用的内容。 远程复制槽必须在订阅激活之前手动创建。 -
在删除订阅时,应该保留复制槽。在订阅者的数据库被移动到不同的主机, 并在那里激活时,这可能是有用的。在这种情况下,尝试删除订阅之前, 使用
ALTER SUBSCRIPTION
解除槽与订阅的关联。 -
在删除订阅时,远程主机不可访问。在这种情况下,尝试删除订阅之前, 使用
ALTER SUBSCRIPTION
解除槽与订阅的关联。 如果远程数据库实例不再存在,则不需要进一步的操作。但是, 如果远程数据库实例只是不可访问,则应手动删除复制槽; 否则会继续保留WAL,最终可能导致磁盘空间不足。这种情况应该仔细调查。