# 53.4.流复制协议

要启动流式复制,前端会发送复制启动消息中的参数。的布尔值符合事实的(或在…上,,1.)通知后端进入物理复制模式,在该模式下,可以发出一小组复制命令,如下图所示,而不是SQL语句。

经过数据库作为复制参数指示后端进入逻辑复制模式,连接到中指定的数据库库名参数在逻辑复制模式下,可以发出如下所示的复制命令以及正常的SQL命令。

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

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

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

然而,使用它通常更有用pg_收到(用于物理复制)或pg_循环学(用于逻辑复制)。

复制命令会记录在服务器日志中日志_复制_命令已启用。

复制模式下可接受的命令包括:

识别系统

请求服务器识别自身。服务器回复的结果集为一行,包含四个字段:

系统ID (文本)

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

时间线 (int4)

当前时间线ID。检查备用时间线是否与主时间线一致也很有用。

xlogpos (文本)

当前位置。用于在预写日志中获取流媒体可以开始的已知位置。

库名 (文本)

数据库已连接到或为空。

显示 名称

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

名称

运行时参数的名称。可用参数记录在第20章.

时间线与历史 tli

请求服务器通过时间线历史文件发送时间线*tli*.Server使用包含两个字段的单行结果集进行回复。而字段标记为文本,它们有效地返回原始字节,而不进行编码转换:

文件名 (文本)

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

所容纳之物 (文本)

时间线历史文件的内容。

创建\u复制\u插槽 插槽名称 [ 短暂的 ] { 身体的 [ 保留区_] | 必然的 输出插件 [ 导出快照_ |NOEXPORT快照_ |使用快照` _] }

创建物理或逻辑复制插槽。看见第27.2.6节有关复制插槽的更多信息。

插槽名称

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

输出插件

用于逻辑解码的输出插件的名称(参见第49.6节).

短暂的

指定此复制插槽为临时插槽。临时插槽不会保存到磁盘,在出现错误或会话结束时会自动删除。

保留区

指定此物理复制插槽立即停止。否则,WAL仅在从流式复制客户端连接时保留。

导出快照
NOEXPORT_快照
使用快照

决定如何处理逻辑插槽初始化期间创建的快照。导出快照默认情况下,将导出快照以在其他会话中使用。此选项不能在事务内部使用。使用快照将为执行命令的当前事务使用快照。此选项必须在交易中使用,并且创建\u复制\u插槽必须是该事务中运行的第一个命令。最后NOEXPORT_快照将只使用快照进行正常的逻辑解码,但不会对其执行任何其他操作。

作为对该命令的响应,服务器将发送一个包含以下字段的单行结果集:

插槽名称 (文本)

新创建的复制插槽的名称。

一致点 (文本)

插槽变得一致的位置。这是在此复制插槽上可以开始流式处理的最早位置。

快照名称 (文本)

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

输出插件 (文本)

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

开始复制 [ 狭槽 插槽名称 ][ physical ] XXX/XXX [ 时间线 tli ]

指示服务器从WAL位置开始流式传输WAL*XXX/XXX如果时间线选项,则流媒体从时间轴开始tli*; 否则,将选择服务器的当前时间线。服务器可以回复错误,例如,如果请求的WAL部分已被回收。成功后,服务器会以CopyBothResponse消息进行响应,然后开始将WAL流式传输到前端。

如果插槽的名称是通过*插槽名称*,它将随着复制的进行而更新,以便服务器知道哪些WA段,以及热备份反馈是备用服务器仍然需要的事务。

如果客户端请求的时间线不是最新的,而是服务器历史记录的一部分,则服务器将从请求的起始点到服务器切换到另一个时间线的时间线上的所有WA流。如果客户端恰好在旧时间线的末尾请求流式传输,服务器将完全跳过复制模式。

在非最新的时间线上流式传输所有WA后,服务器将通过退出复制模式结束流式传输。当客户端通过退出复制模式确认这一点时,服务器将发送一个结果集,其中包含一行两列,指示该服务器历史记录中的下一个时间线。第一列是下一个时间线的ID(类型int8),第二列是发生切换的位置(类型文本).通常,切换位置是流式传输的WAL的结尾,但在某些情况下,服务器可以从旧的时间线发送一些WAL,这些WAL在升级之前没有自己重播过。最后,服务器发送两条CommandComplete消息(一条结束CopyData,另一条结束开始复制并准备接受新命令。

WAL数据作为一系列CopyData消息发送。(这允许混合其他信息;尤其是,如果服务器在开始传输后遇到故障,它可以发送错误响应消息。)从服务器到客户端的每条CopyData消息的有效负载包含以下格式之一的消息:

XLogData(B)

字节1('w')

将消息标识为WAL数据。

Int64

此消息中WAL数据的起点。

Int64

服务器上WAL的当前端。

Int64

服务器在传输时的系统时钟,从2000-01-01午夜起为微秒。

字节*n*

WAL数据流的一部分。

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

主保留消息(B)

字节1('k')

将邮件标识为发件人keepalive。

Int64

服务器上WAL的当前端。

Int64

服务器在传输时的系统时钟,从2000-01-01午夜起为微秒。

字节1

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

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

待机状态更新(F)

字节1('r')

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

Int64

在待机状态下接收并写入磁盘的最后一个WA字节+1的位置。

Int64

上次刷新到备用磁盘的WA字节+1的位置。

Int64

在待机状态下应用的最后一个WA字节+1的位置。

Int64

传输时客户端的系统时钟,自2000-01-01午夜起为微秒。

字节1

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

热备用反馈信息(F)

字节1('h')

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

Int64

传输时客户端的系统时钟,自2000-01-01午夜起为微秒。

Int32

备用设备的当前全局xmin,不包括目录_xmin从任何复制插槽中删除。如果此值和以下目录_xmin are 0这将被视为一个通知,表示在此连接上将不再发送热备用反馈。稍后的非零消息可能会重新启动反馈机制。

Int32

待机状态下全球xmin xid的纪元。

Int32

最低目录_备份上任何复制插槽的xmin。如果没有目录,则设置为0_xmin存在于待机状态,或者如果热待机反馈被禁用。

Int32

目录时代_xmin xid处于待机状态。

START_REPLICATION 投币口 槽名 逻辑的 XXX/XXX[ (选项名称 [ 选项值 ][, ...]) ]

指示服务器开始流式传输 WAL 以进行逻辑复制,从 WAL 位置开始*XXX/XXX*.服务器可以回复错误,例如,如果 WAL 的请求部分已被回收。成功后,服务器用 CopyBothResponse 消息响应,然后开始将 WAL 流式传输到前端。

CopyBothResponse 消息中的消息与记录的格式相同START_REPLICATION ...物理,包括两个 CommandComplete 消息。

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

投币口 槽名

要进行流式传输的槽的名称。此参数是必需的,并且必须对应于创建的现有逻辑复制槽CREATE_REPLICATION_SLOT逻辑的模式。

XXX/XXX

开始流式传输的 WAL 位置。

选项名称

传递给插槽的逻辑解码插件的选项名称。

选项值

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

DROP_REPLICATION_SLOT 槽名 [ 等待 ]

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

槽名

要删除的插槽的名称。

等待

如果插槽处于活动状态,此选项会导致命令等待,直到它变为非活动状态,而不是引发错误的默认行为。

基本备份 [ 标签 '标签' ][ progress ] [ 快速地 ][ wal ] [ 现在等待 ][ max_rate rate ] [ 表空间_MAP ][ noverify_checksums ] [ 显现 manifest_option ][ manifest_checksums checksum_algorithm ]

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

标签 '标签'

设置备份的标签。如果未指定,则备份标签为基础备份将会被使用。标签的引用规则与标准 SQL 字符串相同标准_符合的_字符串打开。

进步

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

快速地

请求快速检查点。

沃尔

在备份中包含必要的 WAL 段。这将包括启动和停止备份之间的所有文件pg_wal基目录 tar 文件的目录。

现在等待

默认情况下,备份将等到最后一个所需的 WAL 段已归档,或者如果未启用日志归档,则会发出警告。指定现在等待禁用等待和警告,让客户端负责确保所需的日志可用。

MAX_RATE 速度

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

表空间_MAP

包括有关目录中存在的符号链接的信息pg_tblspc在一个名为表空间映射.表空间映射文件包括目录中存在的每个符号链接名称pg_tblspc/以及该符号链接的完整路径。

NOVERIFY_CHECKSUMS

默认情况下,如果启用了校验和,则会在基本备份期间对其进行验证。指定NOVERIFY_CHECKSUMS禁用此验证。

显现 manifest_option

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

MANIFEST_CHECKSUMS 校验和算法

指定应应用于备份清单中包含的每个文件的校验和算法。目前可用的算法有没有任何,CRC32C,SHA224,SHA256,SHA3​​84, 和SHA512.默认是CRC32C.

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

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

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

蜘蛛侠(样的)

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

分布(文本)

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

尺寸(整数8)

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

在第二个常规结果集之后,将发送一个或多个 CopyOutResponse 结果,一个用于主数据目录,一个用于除除pg_defaultpg_global.CopyOutResponse 结果中的数据将是表空间内容的 tar 格式(遵循 POSIX 1003.1-2008 标准中指定的“ustar 交换格式”)转储,但标准中指定的两个尾随零块被省略。tar 数据完成后,如果请求了备份清单,则会发送另一个 CopyOutResponse 结果,其中包含当前基本备份的清单数据。在任何情况下,都会发送一个最终的普通结果集,其中包含备份的 WAL 结束位置,格式与开始位置相同。

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

  • 邮递员.pid

  • postmaster.opts

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

  • PostgreSQL 服务器运行过程中创建的各种临时文件和目录,例如任何以pgsql_tmp和暂时的关系。

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

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

  • pg_dynshmem,pg_notify,pg_replslot,pg_serial,pg_snapshots,pg_stat_tmp, 和pg_subtrans被复制为空目录(即使它们是符号链接)。

  • 跳过常规文件和目录以外的文件,例如符号链接(上面列出的目录除外)和特殊设备文件。(符号链接在pg_tblspc被维护。)

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