支持的版本: 当前 (17)
开发版本: devel

pg_createsubscriber

pg_createsubscriber — 将物理副本转换为新的逻辑副本

概要

pg_createsubscriber [option...] { -d | --database }dbname { -D | --pgdata }datadir { -P | --publisher-server }connstr

描述

pg_createsubscriber 从物理备用服务器创建一个新的逻辑副本。指定数据库中的所有表都包含在逻辑复制设置中。为每个数据库创建一对发布和订阅对象。它必须在目标服务器上运行。

成功运行后,目标服务器的状态类似于新的逻辑复制设置。逻辑复制设置和 pg_createsubscriber 之间的主要区别在于数据同步的方式。pg_createsubscriber 不复制初始表数据。它只进行同步阶段,确保每个表都达到同步状态。

pg_createsubscriber 针对大型数据库系统,因为在逻辑复制设置中,大部分时间都花在进行初始数据复制上。此外,这种长时间同步数据的副作用通常会导致大量需要应用的更改(在初始数据复制期间产生),这会进一步增加逻辑副本可用的时间。对于较小的数据库,建议使用初始数据同步

选项

pg_createsubscriber 接受以下命令行参数

-d dbname
--database=dbname

要在其中创建订阅的数据库的名称。可以通过编写多个 -d 开关来选择多个数据库。

-D directory
--pgdata=directory

包含物理副本的集群目录的目标目录。

-n
--dry-run

执行所有操作,但不实际修改目标目录。

-p port
--subscriber-port=port

目标服务器监听连接的端口号。默认为在端口 50432 上运行目标服务器,以避免意外的客户端连接。

-P connstr
--publisher-server=connstr

到发布者的连接字符串。有关详细信息,请参阅第 32.1.1 节

-s dir
--socketdir=dir

用于目标服务器上 postmaster 套接字的目录。默认值为当前目录。

-t seconds
--recovery-timeout=seconds

等待恢复结束的最大秒数。设置为 0 将禁用。默认值为 0。

-U username
--subscriber-username=username

要在目标服务器上连接的用户名。默认为当前操作系统用户名。

-v
--verbose

启用详细模式。这将导致 pg_createsubscriber 将进度消息和有关每个步骤的详细信息输出到标准错误。重复该选项会导致额外的调试级别消息出现在标准错误上。

--config-file=filename

对目标数据目录使用指定的主服务器配置文件。pg_createsubscriber 内部使用 pg_ctl 命令来启动和停止目标服务器。如果 postgresql.conf 配置文件存储在数据目录之外,则允许指定实际的配置文件。

--publication=name

用于设置逻辑复制的发布名称。可以通过编写多个 --publication 开关来指定多个发布。发布名称的数量必须与指定的数据库数量匹配,否则将报告错误。多个发布名称开关的顺序必须与数据库开关的顺序匹配。如果未指定此选项,则会为发布名称分配一个生成的名称。

--replication-slot=name

用于设置逻辑复制的复制槽名称。可以通过编写多个 --replication-slot 开关来指定多个复制槽。复制槽名称的数量必须与指定的数据库数量匹配,否则将报告错误。多个复制槽名称开关的顺序必须与数据库开关的顺序匹配。如果未指定此选项,则会将订阅名称分配给复制槽名称。

--subscription=name

用于设置逻辑复制的订阅名称。可以通过编写多个 --subscription 开关来指定多个订阅。订阅名称的数量必须与指定的数据库数量匹配,否则将报告错误。多个订阅名称开关的顺序必须与数据库开关的顺序匹配。如果未指定此选项,则会为订阅名称分配一个生成的名称。

-V
--version

打印 pg_createsubscriber 版本并退出。

-?
--help

显示有关 pg_createsubscriber 命令行参数的帮助并退出。

注意

先决条件

有一些先决条件需要满足,pg_createsubscriber 才能将目标服务器转换为逻辑副本。如果未满足这些条件,将报告错误。源服务器和目标服务器必须与 pg_createsubscriber 具有相同的主版本。给定的目标数据目录必须与源数据目录具有相同的系统标识符。给定的目标数据目录的数据库用户必须具有创建订阅和使用pg_replication_origin_advance()的权限。

目标服务器必须用作物理备用服务器。目标服务器必须将max_replication_slotsmax_logical_replication_workers配置为大于或等于指定数据库数量的值。目标服务器必须将max_worker_processes配置为大于指定数据库数量的值。目标服务器必须接受本地连接。

源服务器必须接受来自目标服务器的连接。源服务器不能处于恢复状态。源服务器必须将wal_level设置为 logical。源服务器必须将max_replication_slots配置为大于或等于指定数据库数量加上现有复制槽的值。源服务器必须将max_wal_senders配置为大于或等于指定数据库数量和现有 WAL 发送进程的值。

警告

如果 pg_createsubscriber 在提升目标服务器后失败,则数据目录很可能处于无法恢复的状态。在这种情况下,建议创建新的备用服务器。

pg_createsubscriber 通常会在转换期间使用不同的连接设置启动目标服务器。因此,到目标服务器的连接应该失败。

由于逻辑复制不会复制 DDL 命令,因此在运行 pg_createsubscriber 时,应避免执行更改数据库架构的 DDL 命令。如果目标服务器已转换为逻辑副本,则 DDL 命令可能不会被复制,这可能会导致错误。

如果 pg_createsubscriber 在处理时失败,则会删除在源服务器上创建的对象(发布、复制槽)。如果目标服务器无法连接到源服务器,则删除可能会失败。在这种情况下,警告消息将通知剩余的对象。如果目标服务器正在运行,它将停止。

如果复制正在使用primary_slot_name,则在逻辑复制设置后会将其从源服务器中删除。

如果目标服务器是同步副本,则在运行 pg_createsubscriber 时,主服务器上的事务提交可能会等待复制。

pg_createsubscriber 设置逻辑复制时禁用了两阶段提交。这意味着任何准备好的事务将在 COMMIT PREPARED 时复制,而无需提前准备。设置完成后,您可以手动删除并重新创建启用了two_phase 选项的订阅。

pg_createsubscriber 使用 pg_resetwal 更改系统标识符。这可以避免目标服务器可能使用来自源服务器的 WAL 文件的情况。如果目标服务器有备用服务器,则复制将中断,应创建新的备用服务器。

工作原理

基本思想是从源服务器获取复制起点,并设置从该点开始的逻辑复制。

  1. 使用指定的命令行选项启动目标服务器。如果目标服务器已经在运行,pg_createsubscriber 将终止并显示错误。

  2. 检查是否可以转换目标服务器。源服务器上也有一些检查。如果未满足任何先决条件,pg_createsubscriber 将终止并显示错误。

  3. 在源服务器上为每个指定的数据库创建发布和复制槽。每个发布都使用FOR ALL TABLES创建。如果未指定publication-name选项,则其名称模式如下:pg_createsubscriber_%u_%x(参数:数据库 oid,随机 int)。如果未指定replication-slot-name,则复制槽的名称模式如下:pg_createsubscriber_%u_%x(参数:数据库 oid,随机 int)。这些复制槽将在后续步骤中被订阅使用。最后一个复制槽 LSN 用作 recovery_target_lsn 参数中的停止点,并被订阅用作复制起始点。它保证不会丢失任何事务。

  4. 将恢复参数写入目标数据目录并重启目标服务器。它指定一个 LSN(recovery_target_lsn),表示预写日志位置,恢复将进行到该位置。它还指定 promote 作为服务器在达到恢复目标后应采取的动作。添加其他恢复参数以避免恢复过程中出现意外行为,例如在达到一致状态后立即结束恢复(应将 WAL 应用到复制起始位置)和可能导致失败的多个恢复目标。一旦服务器结束备用模式并接受读写事务,此步骤即完成。如果设置了 --recovery-timeout 选项,则如果恢复未在给定的秒数内结束,pg_createsubscriber 将终止。

  5. 在目标服务器上为每个指定的数据库创建订阅。如果未指定 subscription-name,则订阅的名称模式如下:pg_createsubscriber_%u_%x(参数:数据库 oid,随机 int)。它不从源服务器复制现有数据。它不创建复制槽。相反,它使用在上一步中创建的复制槽。订阅已创建,但尚未启用。原因是必须在启动复制之前将复制进度设置为复制起始点。

  6. 删除目标服务器上因在复制起始位置之前创建而被复制的发布。它在订阅服务器上没有用处。

  7. 将每个订阅的复制进度设置为复制起始点。当目标服务器启动恢复过程时,它会追赶到复制起始点。这正是用作每个订阅的初始复制位置的确切 LSN。由于创建了订阅,因此获得了复制源名称。复制源名称和复制起始点在pg_replication_origin_advance()中用于设置初始复制位置。

  8. 为目标服务器上的每个指定数据库启用订阅。订阅开始从复制起始点应用事务。

  9. 如果备用服务器正在使用primary_slot_name,则从现在起不再使用它,因此请删除它。

  10. 如果备用服务器包含故障转移复制槽,则它们无法再同步,因此请删除它们。

  11. 更新目标服务器上的系统标识符。运行pg_resetwal来修改系统标识符。目标服务器将作为pg_resetwal的要求停止。

示例

要从 foo 的物理副本为数据库 hrfinance 创建逻辑副本

$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance

另请参阅

pg_basebackup

提交更正

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