2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

19.6. 复制 #

这些设置控制内置的流复制功能(参见第 26.2.5 节)以及内置的逻辑复制功能(参见第 29 章)的行为。

对于流复制,服务器将是主服务器或备用服务器。主服务器可以发送数据,而备用服务器始终是复制数据的接收者。当使用级联复制(参见第 26.2.7 节)时,备用服务器也可以是发送者,同时也是接收者。参数主要用于发送服务器和备用服务器,尽管某些参数仅在主服务器上有意义。如果需要,集群中的设置可能会因群集而异,而不会出现问题。

对于逻辑复制发布者(执行CREATE PUBLICATION 的服务器)将数据复制到订阅者(执行CREATE SUBSCRIPTION 的服务器)。服务器也可以同时作为发布者和订阅者。注意,以下部分将发布者称为“发送者”。有关逻辑复制配置设置的更多详细信息,请参阅第 29.12 节

19.6.1. 发送服务器 #

这些参数可以设置在任何要向一个或多个备用服务器发送复制数据的服务器上。主服务器始终是发送服务器,因此这些参数必须始终在主服务器上设置。这些参数的角色和含义在备用服务器成为主服务器后不会改变。

max_wal_sendersinteger #

指定来自备用服务器或流式基础备份客户端的最大并发连接数(即,同时运行的 WAL 发送进程的最大数量)。默认值为 10。值为 0 表示复制已禁用。流式客户端的突然断开连接可能会在超时之前留下一个孤立的连接槽,因此此参数应设置为略高于预期客户端的最大数量,以便断开连接的客户端可以立即重新连接。此参数只能在服务器启动时设置。另外,wal_level 必须设置为 replica 或更高版本才能允许备用服务器进行连接。

运行备用服务器时,必须将此参数设置为与主服务器相同或更高的值。否则,将不允许在备用服务器上执行查询。

max_replication_slotsinteger #

指定服务器支持的最大复制槽数(参见第 26.2.6 节)。默认值为 10。此参数只能在服务器启动时设置。将其设置为小于当前存在的复制槽数的任何值都将阻止服务器启动。另外,wal_level 必须设置为 replica 或更高版本才能允许使用复制槽。

wal_keep_sizeinteger #

指定 pg_wal 目录中保存的过去 WAL 文件的最小大小,以防备用服务器需要获取它们进行流复制。如果连接到发送服务器的备用服务器落后超过 wal_keep_size MB,发送服务器可能会删除备用服务器仍需要的 WAL 段,在这种情况下,复制连接将终止。下游连接最终也会因此失败。(但是,如果使用了 WAL 归档,备用服务器可以从归档中恢复。)

这仅设置 pg_wal 中保留的段的最小大小;系统可能需要保留更多段以用于 WAL 归档或从检查点恢复。如果 wal_keep_size 为零(默认值),系统不会保留任何额外的段供备用服务器使用,因此备用服务器可用的旧 WAL 段的数量取决于前一个检查点的位置和 WAL 归档的状态。如果未指定单位,则此值被视为兆字节。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

max_slot_wal_keep_sizeinteger #

指定在检查点时,复制槽允许在 pg_wal 目录中保留的 WAL 文件的最大大小。如果 max_slot_wal_keep_size 为 -1(默认值),复制槽可以保留无限数量的 WAL 文件。否则,如果复制槽的 restart_lsn 落后于当前 LSN 的大小超过给定大小,则使用该槽的备用服务器可能无法继续复制,因为必需的 WAL 文件已被删除。您可以在 pg_replication_slots 中查看复制槽的 WAL 可用性。如果未指定单位,则此值被视为兆字节。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

idle_replication_slot_timeoutinteger #

使已保持非活动状态(未被复制连接使用)超过此持续时间的复制槽无效。如果未指定单位,则此值被视为秒。值为零(默认值)将禁用空闲超时无效机制。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

由于空闲超时导致的槽无效发生在检查点期间。因为检查点每 checkpoint_timeout 间隔发生一次,所以从 idle_replication_slot_timeout 超过到下一个检查点触发槽无效之间可能存在一些延迟。为避免这种延迟,用户可以强制进行检查点以及时使不活动的槽无效。槽不活动时间使用槽的 pg_replication_slots.inactive_since 值计算。

请注意,空闲超时无效机制不适用于不保留 WAL 的槽,也不适用于正在从主服务器同步的备用服务器上的槽(即,pg_replication_slots.synced 值为 true 的备用槽)。已同步的槽始终被视为不活动,因为它们不执行逻辑解码以生成更改。

wal_sender_timeoutinteger #

终止不活动时间超过此持续时间的复制连接。这对于发送服务器检测备用服务器崩溃或网络中断非常有用。如果未指定单位,则此值被视为毫秒。默认值为 60 秒。值为零禁用超时机制。

当集群分布在多个地理位置时,为每个位置使用不同的值可以为集群管理带来更大的灵活性。对于具有低延迟网络连接的备用服务器,较小的值有助于更快地检测到故障;对于位于高延迟网络连接的远程位置的备用服务器,较大的值有助于更好地判断其健康状况。

track_commit_timestampboolean #

记录事务的提交时间。此参数只能在 postgresql.conf 文件或服务器命令行中设置。默认值为 off

synchronized_standby_slotsstring #

逻辑 WAL 发送进程将等待的流复制备用服务器槽名称的逗号分隔列表。逻辑 WAL 发送进程仅在指定的复制槽确认接收 WAL 后才会将解码后的更改发送给插件。这确保了逻辑复制故障转移槽在更改被接收并刷新到相应的物理备用服务器之前不会消耗更改。如果逻辑复制连接旨在故障转移到物理备用服务器,则备用服务器的物理复制槽应在此处列出。请注意,如果 synchronized_standby_slots 中指定的槽不存在或无效,逻辑复制将不会继续。此外,使用逻辑故障转移槽的复制管理函数 pg_replication_slot_advancepg_logical_slot_get_changespg_logical_slot_peek_changes 将阻塞,直到所有指定的物理槽 synchronized_standby_slots 都确认收到 WAL。

对应于 synchronized_standby_slots 中物理复制槽的备用服务器必须配置 sync_replication_slots = true,以便它们可以从主服务器接收逻辑故障转移槽更改。

19.6.2. 主服务器 #

这些参数可以设置在要向一个或多个备用服务器发送复制数据的主服务器上。请注意,除了这些参数之外,主服务器上的 wal_level 必须设置正确,并且还可以选择启用 WAL 归档(参见第 19.5.3 节)。这些参数在备用服务器上的值无关紧要,尽管您可能希望在那里设置它们,以备备用服务器成为主服务器的可能性。

synchronous_standby_namesstring #

指定支持同步复制的备用服务器列表,如第 26.2.8 节中所述。将有一个或多个活动的同步备用服务器;在这些备用服务器确认接收到其数据后,等待提交的事务将被允许继续。同步备用服务器将是那些名称出现在此列表中的服务器,并且它们当前已连接并正在实时流式传输数据(如在 pg_stat_replication 视图中状态为 streaming 所示)。指定多个同步备用服务器可以实现非常高的可用性和数据丢失防护。

用于此目的的备用服务器名称是备用服务器的 application_name 设置,如备用服务器的连接信息中所设置。对于物理复制备用服务器,应在 primary_conninfo 设置中进行设置;默认是 cluster_name 的设置(如果已设置),否则为 walreceiver。对于逻辑复制,可以在订阅的连接信息中进行设置,默认为订阅名称。对于其他复制流消费者,请查阅其文档。

此参数指定备用服务器列表,使用以下任一语法:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

其中 num_sync 是事务需要等待回复的同步备用服务器数量,而 standby_name 是备用服务器的名称。num_sync 必须是大于零的整数值。FIRSTANY 指定了从列表中服务器中选择同步备用服务器的方法。

关键字 FIRST 加上 num_sync,指定基于优先级的同步复制,并使事务提交等待,直到其 WAL 记录被复制到从备用服务器 s1s2s3s4 中选择的 num_sync 个同步备用服务器。列表中名称出现较早的备用服务器具有更高的优先级,并将被视为同步。此列表中稍后出现的其他备用服务器代表潜在的同步备用服务器。如果当前任何同步备用服务器因任何原因断开连接,它将立即被下一个优先级最高的备用服务器替换。关键字 FIRST 是可选的。

关键字 ANY 加上 num_sync,指定基于法定人数的同步复制,并使事务提交等待,直到其 WAL 记录被复制到至少 num_sync 个列出的备用服务器。ANY 3 (s1, s2, s3, s4) 的示例将导致每次提交在收到 s1s2s3s4 中任何三个备用服务器的回复后即可继续。

FIRSTANY 忽略大小写。如果这些关键字作为备用服务器的名称使用,则其 standby_name 必须用双引号括起来。

第三种语法在PostgreSQL 9.6 版本之前使用,并且仍然支持。它与第一种语法相同,只是 FIRSTnum_sync 等于 1。例如,FIRST 1 (s1, s2)s1, s2 具有相同的含义:s1s2 中的一个被选为同步备用服务器。

特殊条目 * 匹配任何备用服务器名称。

没有机制来强制备用服务器名称的唯一性。如果存在重复项,则其中一个匹配的备用服务器将被认为具有更高的优先级,尽管具体是哪一个是不确定的。

注意

每个 standby_name 应采用有效的 SQL 标识符的形式,除非它是 *。如有必要,可以使用双引号。但请注意,standby_name 与备用应用程序名称的比较是忽略大小写的,无论是否使用双引号。

如果未在此处指定同步备用服务器名称,则不启用同步复制,事务提交将不会等待复制。这是默认配置。即使启用了同步复制,也可以通过将 synchronous_commit 参数设置为 localoff 来配置单个事务不等待复制。

此参数只能在 postgresql.conf 文件或服务器命令行中设置。

19.6.3. 备用服务器 #

这些设置控制要接收复制数据的备用服务器的行为。它们在主服务器上的值无关紧要。

primary_conninfostring #

指定备用服务器用于连接发送服务器的连接字符串。此字符串的格式如第 32.1.1 节中所述。如果此字符串中未指定任何选项,则将检查相应的环境变量(参见第 32.15 节)。如果环境变量也没有设置,则使用默认值。

连接字符串应指定发送服务器的主机名(或地址),以及端口号(如果与备用服务器的默认端口号不同)。还要指定一个与发送服务器上具有适当权限的角色对应的用户名(参见第 26.2.5.1 节)。如果发送方要求密码认证,则还需要提供密码。可以在 primary_conninfo 字符串或备用服务器上的单独 ~/.pgpass 文件中提供密码(数据库名称使用 replication)。

对于复制槽同步(参见第 47.2.3 节),还必须在 primary_conninfo 字符串中指定有效的 dbname。这仅用于槽同步。它会被流复制忽略。

此参数只能在 postgresql.conf 文件或服务器命令行中设置。如果 WAL 接收器进程正在运行时更改此参数,则会向该进程发送关闭信号,并期望其使用新设置重新启动(除非 primary_conninfo 为空字符串)。如果服务器未处于备用模式,则此设置无效。

primary_slot_namestring #

可选地指定一个现有的复制槽,在通过流复制连接到发送服务器时使用,以控制上游节点上的资源移除(参见第 26.2.6 节)。此参数只能在 postgresql.conf 文件或服务器命令行中设置。如果 WAL 接收器进程正在运行时更改此参数,则会向该进程发送关闭信号,并期望其使用新设置重新启动。如果 primary_conninfo 未设置或服务器未处于备用模式,则此设置无效。

hot_standbyboolean #

指定在恢复期间是否可以连接和运行查询(如第 26.4 节中所述)。默认值为 on。此参数只能在服务器启动时设置。它仅在归档恢复或备用模式下有效。

max_standby_archive_delayinteger #

当热备用处于活动状态时,此参数决定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间(如第 26.4.2 节中所述)。max_standby_archive_delay 适用于 WAL 数据从 WAL 归档读取时(因此不是最新的)。如果未指定单位,则此值被视为毫秒。默认值为 30 秒。值为 -1 允许备用服务器无限期等待冲突查询完成。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,max_standby_archive_delay 与查询在取消前可以运行的最大时间不同;而是应用于一个 WAL 段的数据的最大允许总时间。因此,如果一个查询在 WAL 段早期导致了显著延迟,后续的冲突查询将只有很短的宽限期。

max_standby_streaming_delayinteger #

当热备用处于活动状态时,此参数决定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间(如第 26.4.2 节中所述)。max_standby_streaming_delay 适用于通过流复制接收 WAL 数据时。如果未指定单位,则此值被视为毫秒。默认值为 30 秒。值为 -1 允许备用服务器无限期等待冲突查询完成。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,max_standby_streaming_delay 与查询在取消前可以运行的最大时间不同;而是 WAL 数据从主服务器接收后允许应用的最大总时间。因此,如果一个查询导致了显著延迟,后续的冲突查询将有很短的宽限期,直到备用服务器再次赶上。

wal_receiver_create_temp_slotboolean #

指定在未配置永久复制槽(使用 primary_slot_name)时,WAL 接收器进程是否应在远程实例上创建临时复制槽。默认值为 off。此参数只能在 postgresql.conf 文件或服务器命令行中设置。如果 WAL 接收器进程正在运行时更改此参数,则会向该进程发送关闭信号,并期望其使用新设置重新启动。

wal_receiver_status_intervalinteger #

指定备用服务器上的 WAL 接收器进程向主服务器或上游备用服务器发送复制进度信息的最小频率,这些信息可以在 pg_stat_replication 视图中使用。备用服务器将报告其已写入的最后一个写入预写日志位置、已刷新到磁盘的最后一个位置以及已应用的最后一个位置。此参数的值是报告之间的最大时间间隔。更新将在写入或刷新位置更改时发送,或者如果设置为非零值,则按照此参数指定的频率发送。还有其他情况会发送更新而不考虑此参数;例如,在现有 WAL 处理完成时,或当 synchronous_commit 设置为 remote_apply 时。因此,应用位置可能略微落后于真实位置。如果未指定单位,则此值被视为秒。默认值为 10 秒。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

hot_standby_feedbackboolean #

指定热备用是否将当前在备用服务器上执行的查询的反馈发送到主服务器或上游备用服务器。此参数可用于消除由清理记录引起的查询取消,但可能导致主服务器上的数据库膨胀,具体取决于某些工作负载。反馈消息的发送频率不会超过每 wal_receiver_status_interval。默认值为 off。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

如果使用级联复制,则反馈会向上游传递,直到最终到达主服务器。备用服务器除了将收到的反馈传递给上游外,不会做其他任何使用。如果级联复制正在使用,则反馈会向上游传递,直到最终到达主服务器。备用服务器除了将收到的反馈传递给上游外,不会做其他任何使用。

请注意,如果备用服务器上的时钟向前或向后移动,反馈消息可能不会在所需的时间间隔内发送。在极端情况下,这可能导致主服务器上死行移除的风险长时间存在,因为反馈机制基于时间戳。

wal_receiver_timeoutinteger #

终止不活动时间超过此持续时间的复制连接。这对于接收备用服务器检测主节点崩溃或网络中断非常有用。如果未指定单位,则此值被视为毫秒。默认值为 60 秒。值为零禁用超时机制。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

wal_retrieve_retry_intervalinteger #

指定备用服务器在 WAL 数据不可用(来自流复制、本地 pg_wal 或 WAL 归档)后,在再次尝试检索 WAL 数据之前等待的时间。如果未指定单位,则此值被视为毫秒。默认值为 5 秒。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

此参数对于需要控制等待新 WAL 数据可用时间的恢复节点配置很有用。例如,在归档恢复中,可以通过减小此参数的值来提高恢复对新 WAL 文件的检测响应速度。在 WAL 活动较低的系统上,增加此值可以减少访问 WAL 归档的请求次数,这在计费次数计入基础设施访问次数的云环境中尤其有用。

在逻辑复制中,此参数也限制了失败的复制应用工作进程或表同步工作进程的重新生成频率。

recovery_min_apply_delayinteger #

默认情况下,备用服务器会尽快恢复来自发送服务器的 WAL 记录。拥有一个延迟复制的数据副本可能很有用,这提供了纠正数据丢失错误的机会。此参数允许您按指定的时间量延迟恢复。例如,如果将此参数设置为 5min,则备用服务器将在系统时间比主服务器报告的提交时间晚至少五分钟时,才回放每个事务提交。如果未指定单位,则此值被视为毫秒。默认值为零,不增加延迟。

复制延迟可能超过此参数的值,在这种情况下不会添加延迟。请注意,延迟是在主服务器上写入的 WAL 时间戳和备用服务器上的当前时间之间计算的。由于网络延迟或级联复制配置导致的传输延迟可能会显著减小实际等待时间。如果主服务器和备用服务器的系统时钟不同步,这可能会导致恢复比预期更早地应用记录;但这并不是一个主要问题,因为此参数的有用设置远大于服务器之间的典型时间偏差。

延迟仅发生在事务提交的 WAL 记录上。其他记录会尽快回放,这不成问题,因为 MVCC 可见性规则确保在应用相应的提交记录之前,它们的效果不会显现。

延迟发生在恢复中的数据库达到一致状态后,直到备用服务器被提升或触发。之后,备用服务器将结束恢复,不再等待。

WAL 记录必须保存在备用服务器上,直到它们准备好被应用。因此,更长的延迟将导致 WAL 文件累积更多,从而增加备用服务器 pg_wal 目录的磁盘空间需求。

此参数用于流复制部署;但是,如果指定了该参数,则除了崩溃恢复外,在所有情况下都会受到尊重。hot_standby_feedback 会因使用此功能而延迟,这可能导致主服务器膨胀;请谨慎一起使用。

警告

同步复制受此设置的影响,当 synchronous_commit 设置为 remote_apply 时;每个 COMMIT 都需要等待应用。

此参数只能在 postgresql.conf 文件或服务器命令行中设置。

sync_replication_slotsboolean #

它使物理备用服务器能够从主服务器同步逻辑故障转移槽,以便逻辑订阅者可以在故障转移后从新主服务器恢复复制。

默认情况下它是禁用的。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

19.6.4. 订阅者 #

这些设置控制逻辑复制订阅者的行为。它们在发布者上的值无关紧要。有关更多详细信息,请参阅第 29.12 节

max_active_replication_originsinteger #

指定同时可以跟踪多少个复制源(参见第 48 章),有效限制了服务器上可以创建的逻辑复制订阅的数量。将其设置为低于当前跟踪的复制源数量(反映在 pg_replication_origin_status 中)将阻止服务器启动。它默认为 10。此参数只能在服务器启动时设置。max_active_replication_origins 必须至少设置为要添加到订阅者的订阅数量,再加上一些用于表同步的预留。

max_logical_replication_workersinteger #

指定逻辑复制工作进程的最大数量。这包括主应用工作进程、并行应用工作进程和表同步工作进程。

逻辑复制工作进程从 max_worker_processes 定义的池中获取。

默认值为 4。此参数只能在服务器启动时设置。

max_sync_workers_per_subscriptioninteger #

每个订阅的最大同步工作进程数。此参数控制订阅初始化期间或添加新表时初始数据复制的并行度。

目前,每个表只能有一个同步工作进程。

同步工作进程从 max_logical_replication_workers 定义的池中获取。

默认值为 2。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

max_parallel_apply_workers_per_subscriptioninteger #

每个订阅的最大并行应用工作进程数。此参数控制订阅参数 streaming = parallel 的进行中事务流的并行度。

并行应用工作进程从 max_logical_replication_workers 定义的池中获取。

默认值为 2。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

提交更正

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