支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

53.4. 流式复制协议 #

要启动流式复制,前端在启动消息中发送 replication 参数。布尔值 true(或 onyes1)告诉后端进入物理复制 walsender 模式,在该模式下,可以发出下面显示的一小部分复制命令,而不是 SQL 语句。

database 作为 replication 参数的值传递,指示后端进入逻辑复制 walsender 模式,连接到 dbname 参数中指定的数据库。在逻辑复制 walsender 模式下,可以发出下面显示的复制命令以及正常的 SQL 命令。

在物理复制或逻辑复制 walsender 模式下,只能使用简单查询协议。

为了测试复制命令,您可以使用 psql 或任何其他使用 libpq 的工具,使用包含 replication 选项的连接字符串建立复制连接,例如:

psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"

但是,使用 pg_receivewal(用于物理复制)或 pg_recvlogical(用于逻辑复制)通常更有用。

当启用 log_replication_commands 时,复制命令会记录在服务器日志中。

复制模式中接受的命令有

IDENTIFY_SYSTEM #

请求服务器标识自身。服务器返回一个单行的结果集,其中包含四个字段

systemid (text)

标识群集的唯一系统标识符。这可以用于检查用于初始化备用的基本备份是否来自同一群集。

timeline (int8)

当前时间线 ID。也可用于检查备用服务器是否与主服务器一致。

xlogpos (text)

当前 WAL 刷新位置。可用于获取预写式日志中可以开始流式传输的已知位置。

dbname (text)

连接到的数据库或 null。

SHOW name #

请求服务器发送运行时参数的当前设置。这类似于 SQL 命令 SHOW

name

运行时参数的名称。可用参数在 第 19 章 中进行了说明。

TIMELINE_HISTORY tli #

请求服务器发送时间线 tli 的时间线历史文件。服务器返回一个单行的结果集,其中包含两个字段。虽然这些字段标记为 text,但它们实际上返回原始字节,不进行编码转换

filename (text)

时间线历史文件的文件名,例如 00000002.history

content (text)

时间线历史文件的内容。

CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL | LOGICAL output_plugin } [ ( option [, ...] ) ] #

创建物理或逻辑复制槽。有关复制槽的更多信息,请参阅 第 26.2.6 节

slot_name

要创建的槽的名称。必须是有效的复制槽名称(请参阅 第 26.2.6.1 节)。

output_plugin

用于逻辑解码的输出插件的名称(请参阅 第 47.6 节)。

TEMPORARY

指定此复制槽是临时的。临时槽不会保存到磁盘,并且会在错误发生或会话结束后自动删除。

支持以下选项

TWO_PHASE [ boolean ]

如果为 true,则此逻辑复制槽支持对两阶段提交进行解码。使用此选项,将解码并传输与两阶段提交相关的命令,例如 PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED。将在 PREPARE TRANSACTION 时解码和传输事务。默认值为 false。

RESERVE_WAL [ boolean ]

如果为 true,则此物理复制槽会立即保留WAL。否则,WAL仅在流式复制客户端连接时才会保留。默认值为 false。

SNAPSHOT { 'export' | 'use' | 'nothing' }

决定如何处理在逻辑槽初始化期间创建的快照。'export' 是默认值,将导出快照以在其他会话中使用。此选项不能在事务内部使用。'use' 将使用快照来执行当前命令的事务。此选项必须在事务中使用,并且 CREATE_REPLICATION_SLOT 必须是该事务中运行的第一个命令。最后,'nothing' 将像往常一样仅将快照用于逻辑解码,而不会执行任何其他操作。

FAILOVER [ boolean ]

如果为 true,则启用该槽以同步到备用服务器,以便在故障转移后可以恢复逻辑复制。默认值为 false。

在响应此命令时,服务器将发送一个包含以下字段的单行结果集

slot_name (text)

新创建的复制槽的名称。

consistent_point (text)

该槽变得一致时的 WAL 位置。这是此复制槽上可以开始流式传输的最早位置。

snapshot_name (text)

该命令导出的快照的标识符。快照在对该连接执行新命令或关闭复制连接之前有效。如果创建的槽是物理的,则为 Null。

output_plugin (text)

新创建的复制槽使用的输出插件的名称。如果创建的槽是物理的,则为 Null。

CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT | TWO_PHASE ] } #

为了与旧版本兼容,仍然支持 CREATE_REPLICATION_SLOT 命令的此替代语法。

ALTER_REPLICATION_SLOT slot_name ( option [, ...] ) #

更改复制槽的定义。有关复制槽的更多信息,请参阅 第 26.2.6 节。此命令目前仅支持逻辑复制槽。

slot_name

要更改的槽的名称。必须是有效的复制槽名称(请参阅 第 26.2.6.1 节)。

支持以下选项

FAILOVER [ boolean ]

如果为 true,则启用该槽以同步到备用服务器,以便在故障转移后可以恢复逻辑复制。

READ_REPLICATION_SLOT slot_name #

读取与复制槽关联的某些信息。如果复制槽不存在,则返回包含 NULL 值的元组。此命令目前仅支持物理复制槽。

在响应此命令时,服务器将返回一个包含以下字段的单行结果集

slot_type (text)

复制槽的类型,可以是 physicalNULL

restart_lsn (text)

复制槽的 restart_lsn

restart_tli (int8)

restart_lsn 关联的时间线 ID,遵循当前时间线历史。

START_REPLICATION [ SLOT slot_name ] [ PHYSICAL ] XXX/XXX [ TIMELINE tli ] #

指示服务器开始流式传输 WAL,从 WAL 位置 XXX/XXX 开始。如果指定了 TIMELINE 选项,则在时间线 tli 上开始流式传输;否则,选择服务器的当前时间线。如果请求的 WAL 部分已经被回收,服务器可以回复错误。如果成功,服务器将回复 CopyBothResponse 消息,然后开始向前端流式传输 WAL。

如果通过 slot_name 提供了槽的名称,它将随着复制的进行而更新,以便服务器知道备用服务器仍然需要哪些 WAL 段,以及如果 hot_standby_feedback 开启时哪些事务仍然需要。

如果客户端请求的时间线不是最新的,但属于服务器的历史记录的一部分,服务器将从请求的起始点开始,在该时间线上流式传输所有 WAL,直到服务器切换到另一个时间线的点。如果客户端请求在旧时间线的末尾进行流式传输,服务器将完全跳过 COPY 模式。

在流式传输完不是最新时间线上的所有 WAL 后,服务器将通过退出 COPY 模式来结束流式传输。当客户端也退出 COPY 模式以确认这一点时,服务器将发送一个包含一行两列的结果集,指示此服务器历史记录中的下一个时间线。第一列是下一个时间线的 ID(类型为 int8),第二列是发生切换的 WAL 位置(类型为 text)。通常,切换位置是流式传输的 WAL 的末尾,但在某些极端情况下,服务器可能会从旧时间线发送一些它自己在提升之前没有重放过的 WAL。最后,服务器发送两条 CommandComplete 消息(一条结束 CopyData,另一条结束 START_REPLICATION 本身),并准备好接受新命令。

WAL 数据作为一系列 CopyData 消息发送;有关详细信息,请参阅 第 53.6 节第 53.7 节。(这允许其他信息混合在一起;特别是,如果服务器在开始流式传输后遇到故障,它可以发送 ErrorResponse 消息。)从服务器到客户端的每个 CopyData 消息的有效负载包含以下格式之一的消息

XLogData (B) #
Byte1('w')

将消息标识为 WAL 数据。

Int64

此消息中 WAL 数据的起始点。

Int64

服务器上 WAL 的当前结束位置。

Int64

传输时服务器的系统时钟,以 2000-01-01 午夜以来的微秒数表示。

Byten

WAL 数据流的一部分。

单个 WAL 记录永远不会跨两个 XLogData 消息拆分。当 WAL 记录跨越 WAL 页边界,因此已经使用延续记录拆分时,可以在页边界拆分。换句话说,第一个主 WAL 记录及其延续记录可以在不同的 XLogData 消息中发送。

主服务器保持活动消息 (B) #
Byte1('k')

将消息标识为发送方保持活动消息。

Int64

服务器上 WAL 的当前结束位置。

Int64

传输时服务器的系统时钟,以 2000-01-01 午夜以来的微秒数表示。

Byte1

1 表示客户端应尽快回复此消息,以避免超时断开连接。否则为 0。

接收进程可以随时使用以下消息格式之一(也在 CopyData 消息的有效负载中)将回复发送回发送方

备用服务器状态更新 (F) #
Byte1('r')

将消息标识为接收方状态更新。

Int64

备用服务器中接收并写入磁盘的最后一个 WAL 字节 + 1 的位置。

Int64

备用服务器中刷新到磁盘的最后一个 WAL 字节 + 1 的位置。

Int64

备用服务器中应用的最后一个 WAL 字节 + 1 的位置。

Int64

传输时客户端的系统时钟,以 2000-01-01 午夜以来的微秒数表示。

Byte1

如果为 1,则客户端请求服务器立即回复此消息。这可以用来 ping 服务器,以测试连接是否仍然正常。

热备用反馈消息 (F) #
Byte1('h')

将消息标识为热备用反馈消息。

Int64

传输时客户端的系统时钟,以 2000-01-01 午夜以来的微秒数表示。

Int32

备用服务器的当前全局 xmin,不包括任何复制槽的 catalog_xmin。如果此值和下面的 catalog_xmin 均为 0,则将其视为通知,表示此连接上不再发送热备用反馈。稍后发送的非零消息可能会重新启动反馈机制。

Int32

备用服务器上全局 xmin xid 的 epoch。

Int32

备用服务器上任何复制槽的最低 catalog_xmin。如果备用服务器上不存在 catalog_xmin 或正在禁用热备用反馈,则设置为 0。

Int32

备用服务器上 catalog_xmin xid 的 epoch。

START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] #

指示服务器开始流式传输逻辑复制的 WAL,从 WAL 位置 XXX/XXX 或槽的 confirmed_flush_lsn 开始(请参阅第 52.19 节),取较大者。此行为使客户端更容易避免在没有要处理的数据时更新其本地 LSN 状态。但是,从与请求不同的 LSN 开始可能无法捕获某些类型的客户端错误;因此,客户端可能希望在发出 START_REPLICATION 之前检查 confirmed_flush_lsn 是否与其期望值匹配。

如果槽不存在,服务器可以回复错误。如果成功,服务器将回复 CopyBothResponse 消息,然后开始向前端流式传输 WAL。

CopyBothResponse 消息中的消息格式与为 START_REPLICATION ... PHYSICAL 记录的格式相同,包括两条 CommandComplete 消息。

与所选槽关联的输出插件用于处理流式传输的输出。

SLOT slot_name

从中流式传输更改的槽的名称。此参数是必需的,并且必须对应于在 LOGICAL 模式下使用 CREATE_REPLICATION_SLOT 创建的现有逻辑复制槽。

XXX/XXX

开始流式传输的 WAL 位置。

option_name

传递给槽的逻辑解码输出插件的选项名称。有关标准 (pgoutput) 插件接受的选项,请参阅第 53.5 节

option_value

与指定选项关联的可选值,形式为字符串常量。

DROP_REPLICATION_SLOT slot_name [ WAIT ] #

删除复制槽,释放任何保留的服务器端资源。如果该槽是一个在 walsender 连接的数据库之外的数据库中创建的逻辑槽,则此命令将失败。

slot_name

要删除的槽的名称。

WAIT

此选项使命令在槽处于活动状态时等待,直到它变为非活动状态,而不是引发错误的默认行为。

UPLOAD_MANIFEST #

上传备份清单,为进行增量备份做准备。

BASE_BACKUP [ ( option [, ...] ) ] #

指示服务器开始流式传输基本备份。系统将在启动备份之前自动进入备份模式,并在备份完成时退出备份模式。接受以下选项

LABEL 'label'

设置备份的标签。如果未指定,将使用 base backup 的备份标签。标签的引用规则与启用 standard_conforming_strings 的标准 SQL 字符串相同。

TARGET 'target'

告诉服务器将备份发送到哪里。如果目标是 client(默认值),则备份数据将发送到客户端。如果目标是 server,则备份数据将写入由 TARGET_DETAIL 选项指定的路径名的服务器。如果目标是 blackhole,则备份数据不会发送到任何地方;它只是被丢弃。

server 目标需要超级用户权限或被授予 pg_write_server_files 角色。

TARGET_DETAIL 'detail'

提供有关备份目标的附加信息。

目前,此选项只能在备份目标为 server 时使用。它指定应将备份写入的服务器目录。

PROGRESS [ boolean ]

如果设置为 true,则请求生成进度报告所需的信息。这将返回每个表空间的头部中的近似大小,可用于计算流的完成进度。这是通过在传输开始之前枚举所有文件大小来计算的,因此可能会对性能产生负面影响。特别是,可能需要更长时间才能开始流式传输第一个数据。由于数据库文件在备份期间可能会发生变化,因此大小只是近似值,并且在近似时间和发送实际文件之间可能会增大或缩小。默认值为 false。

CHECKPOINT { 'fast' | 'spread' }

设置在基本备份开始时要执行的检查点类型。默认值为 spread

WAL [ boolean ]

如果设置为 true,则在备份中包含必要的 WAL 段。这将包含基本目录 tar 文件的 pg_wal 目录中备份开始和停止之间的所有文件。默认值为 false。

WAIT [ boolean ]

如果设置为 true,则备份将等待直到最后一个必需的 WAL 段已归档,或者如果未启用 WAL 归档,则发出警告。如果为 false,则备份既不会等待也不会发出警告,而是由客户端负责确保所需的日志可用。默认值为 true。

COMPRESSION 'method'

指示服务器使用指定的方法压缩备份。目前,支持的方法为 gziplz4zstd

COMPRESSION_DETAIL detail

指定所选压缩方法的详细信息。这应仅与 COMPRESSION 选项结合使用。如果该值为整数,则指定压缩级别。否则,它应该是一个以逗号分隔的项列表,每个项的形式为 keywordkeyword=value。目前,支持的关键字为 levellongworkers

level 关键字设置压缩级别。对于 gzip,压缩级别应为介于 19 之间的整数(默认值 Z_DEFAULT_COMPRESSION-1),对于 lz4,压缩级别应为介于 1 和 12 之间的整数(默认值 0 表示快速压缩模式),对于 zstd,压缩级别应为介于 ZSTD_minCLevel() (通常为 -131072) 和 ZSTD_maxCLevel() (通常为 22)之间的整数(默认值 ZSTD_CLEVEL_DEFAULT3)。

long 关键字启用长距离匹配模式,以提高压缩率,但会增加内存使用量。长距离模式仅支持 zstd

workers 关键字设置应为并行压缩使用的线程数。并行压缩仅支持 zstd

MAX_RATE rate

限制(节流)每单位时间从服务器传输到客户端的最大数据量。预期的单位是千字节/秒。如果指定此选项,则该值必须等于零,或者必须在 32 kB 到 1 GB(含)的范围内。如果传递零或未指定该选项,则不限制传输。

TABLESPACE_MAP [ boolean ]

如果为 true,则在名为 tablespace_map 的文件中包含有关目录 pg_tblspc 中存在的符号链接的信息。表空间映射文件包括每个符号链接名称(因为它存在于目录 pg_tblspc/ 中)以及该符号链接的完整路径。默认值为 false。

VERIFY_CHECKSUMS [ boolean ]

如果为 true,则在启用校验和的情况下,在基本备份期间验证校验和。如果为 false,则跳过此操作。默认值为 true。

MANIFEST manifest_option

当此选项指定的值为 yesforce-encode 时,将创建备份清单并与备份一起发送。清单是备份中存在的每个文件的列表,但不包括可能包含的任何 WAL 文件。它还存储每个文件的大小、上次修改时间,以及可选的校验和。force-encode 的值强制所有文件名进行十六进制编码;否则,仅对名称为非 UTF8 八位字节序列的文件执行此类型编码。force-encode 主要用于测试目的,以确保读取备份清单的客户端可以处理这种情况。为了与以前的版本兼容,默认值为 MANIFEST 'no'

MANIFEST_CHECKSUMS checksum_algorithm

指定应应用于备份清单中包含的每个文件的校验和算法。当前可用的算法为 NONECRC32CSHA224SHA256SHA384SHA512。默认值为 CRC32C

INCREMENTAL

请求增量备份。必须先执行 UPLOAD_MANIFEST 命令,然后才能使用此选项运行基本备份。

当备份开始时,服务器将首先发送两个普通的结果集,然后发送一个或多个 CopyOutResponse 结果。

第一个普通结果集包含备份的起始位置,以单行两列的形式。第一列包含以 XLogRecPtr 格式给出的起始位置,第二列包含对应的时间线 ID。

第二个普通结果集为每个表空间有一行。此行中的字段为

spcoid (oid)

表空间的 OID,如果它是基本目录,则为 null。

spclocation (text)

表空间目录的完整路径,如果它是基本目录,则为 null。

size (int8)

如果已请求进度报告,则为表空间的大概大小(以千字节(1024 字节)为单位);否则为 null。

在第二个常规结果集之后,将发送 CopyOutResponse。每个 CopyData 消息的有效负载将包含以下格式之一的消息

新存档 (B)
字节1('n')

将消息标识为指示新存档的开始。主数据目录将有一个存档,每个额外的表空间将有一个存档;每个存档将使用 tar 格式(遵循 POSIX 1003.1-2008 标准中指定的ustar 交换格式)。

字符串

此存档的文件名。

字符串

对于主数据目录,为空字符串。对于其他表空间,为从中创建此存档的目录的完整路径。

清单 (B)
字节1('m')

将消息标识为指示备份清单的开始。

存档或清单数据 (B)
字节1('d')

将消息标识为包含存档或清单数据。

Byten

数据字节。

进度报告 (B)
字节1('p')

将消息标识为进度报告。

Int64

已完成处理的当前表空间中的字节数。

在发送 CopyOutResponse 或所有此类响应后,将发送最终的普通结果集,其中包含备份的 WAL 结束位置,格式与起始位置相同。

数据目录和每个表空间的 tar 存档将包含目录中的所有文件,无论它们是 PostgreSQL 文件还是添加到同一目录的其他文件。唯一排除的文件是

  • postmaster.pid

  • postmaster.opts

  • pg_internal.init(在多个目录中找到)

  • 在 PostgreSQL 服务器运行期间创建的各种临时文件和目录,例如任何以 pgsql_tmp 开头的文件或目录和临时关系。

  • 未记录的关系,除了在恢复时重建(空)未记录关系所需的 init 分支。

  • pg_wal,包括子目录。如果备份运行时包含 WAL 文件,则将包含 pg_wal 的合成版本,但它只包含备份工作所需的文件,而不包含其余内容。

  • pg_dynshmempg_notifypg_replslotpg_serialpg_snapshotspg_stat_tmppg_subtrans 将被复制为空目录(即使它们是符号链接)。

  • 将跳过常规文件和目录以外的文件,例如符号链接(上面列出的目录除外)以及特殊设备和操作系统文件。(pg_tblspc 中的符号链接将保留。)

如果服务器上的底层文件系统支持,则会设置所有者、组和文件模式。

在上述所有命令中,当指定 boolean 类型的参数时,可以省略 value 部分,这等效于指定 TRUE

提交更正

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