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_slots 和 max_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 文件的情况。如果目标服务器有备用服务器,复制将中断,应该创建一个新的备用服务器。
基本思路是从源服务器获取一个复制起点,并设置从该起点开始的逻辑复制。
使用指定的命令行选项启动目标服务器。如果目标服务器已在运行,pg_createsubscriber 将终止并显示错误。
检查目标服务器是否可以转换。还会对源服务器进行一些检查。如果任何先决条件未满足,pg_createsubscriber 将终止并显示错误。
为源服务器上每个指定的数据库创建发布和复制槽。每个发布使用 FOR ALL TABLES
创建。如果未指定 publication-name
选项,则其名称模式如下:“pg_createsubscriber_%u_%x
”(参数:数据库 oid
,随机 int
)。如果未指定 replication-slot-name
,则复制槽的名称模式如下:“pg_createsubscriber_%u_%x
”(参数:数据库 oid
,随机 int
)。这些复制槽将在后续步骤中由订阅使用。最后一个复制槽 LSN 用作 recovery_target_lsn 参数的停止点,并由订阅用作复制起点。它保证不会丢失任何事务。
将恢复参数写入目标数据目录并重启目标服务器。它指定了预写日志位置的 LSN (recovery_target_lsn),恢复将进行到该位置。它还指定了 promote
作为服务器在达到恢复目标后应采取的操作。添加了额外的 恢复参数 以避免在恢复过程中出现意外行为,例如,一旦达到一致状态就结束恢复(WAL 应该应用到复制起点为止)以及多个恢复目标可能会导致故障。一旦服务器结束备用模式并接受读写事务,此步骤就完成。如果设置了 --recovery-timeout
选项,则如果恢复在给定的秒数内未结束,pg_createsubscriber 将终止。
为目标服务器上的每个指定数据库创建一个订阅。如果未指定 subscription-name
,则订阅的名称模式如下:“pg_createsubscriber_%u_%x
”(参数:数据库 oid
,随机 int
)。它不会从源服务器复制现有数据。它不会创建复制槽。相反,它使用之前步骤中创建的复制槽。订阅已创建,但尚未启用。原因是必须将复制进度设置为复制起点,然后才能启动复制。
删除目标服务器上复制的发布,因为这些发布是在复制起点之前创建的。它在订阅者上没有用。
将每个订阅的复制进度设置为复制起点。当目标服务器启动恢复过程时,它会赶上复制起点。这是用作每个订阅的初始复制位置的精确 LSN。复制源名称是获取的,因为订阅已创建。复制源名称和复制起点用于 pg_replication_origin_advance()
来设置初始复制位置。
为目标服务器上的每个指定数据库启用订阅。订阅开始从复制起点应用事务。
如果备用服务器正在使用 primary_slot_name,那么它从现在开始就无用了,所以删除它。
如果备用服务器包含 故障转移复制槽,那么它们就不能再同步了,所以删除它们。
更新目标服务器上的系统标识符。pg_resetwal 用于修改系统标识符。目标服务器将作为 pg_resetwal
要求停止。
要为数据库 hr
和 finance
创建一个逻辑副本,这些数据库来自 foo
上的物理副本
$
pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。