Postgresql 中文操作指南

55.4. Streaming Replication Protocol #

要启动流复制,前端在启动消息中发送 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 #

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

  • SHOW name #

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

  • TIMELINE_HISTORY tli #

    • 请求服务器上传时间线历史文件,以获取时间段_tli_。服务器会返回一个只含有一行的结果集,包含两个字段。尽管字段标为_text_,但实际上返回字节,没有编码转换:

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

    • 创建物理或逻辑复制槽。请参阅 Section 27.2.6 以了解更多有关复制槽的信息。

    • 支持以下选项:

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

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

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

  • READ_REPLICATION_SLOT slot_name #

    • 读取与副本槽相关的某些信息。如果复制槽不存在,则返回一个具有 NULL 个值的元组。此命令当前仅受物理复制槽支持。

    • 为了响应此命令,服务器将返回一个仅包含一行的结果集,其中包括以下字段:

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

    • 指示服务器从 XXX/XXX 开始流式传输 WAL。如果指定 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 消息发送。(这允许混合其他信息;特别是如果服务器在开始流式传输后遇到故障,它可以发送 ErrorResponse 消息。)服务器到客户端的每个 CopyData 消息的负载都包含一个使用以下格式之一的消息:

    • 接收进程可以使用以下消息格式(也包含在 CopyData 消息的负载中)随时向发送者发送回复:

  • START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, …​] ) ] #

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

    • 服务器可能会回复错误,例如如果槽不存在的情况下。成功时,服务器会回复 CopyBothResponse 消息,然后开始流式传输 WAL 到前端。

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

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

  • DROP_REPLICATION_SLOT slot_name [ WAIT ] #

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

  • BASE_BACKUP [ ( option [, …​] ) ] #

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

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

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

    • 第二个普通的结果集包含每张表空间一行。此行中的字段有:

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

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

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

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

  • systemid (text)

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

  • timeline (int8)

    • 当前时间线 ID。也可用于检查备用是否与主副本一致。

  • xlogpos (text)

    • 当前 WAL 刷新位置。可用于获取预写日志中启动流传输的已知位置。

  • dbname (text)

    • 连接的数据库或 null。

  • name

    • 运行时参数的名称。 Chapter 20 中记录了可用参数。

  • filename (text)

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

  • content (text)

    • 时间线历史文件的内容。

  • slot_name

    • 要创建的槽的名称。必须是一个有效的复制槽名称(参见 Section 27.2.6.1)。

  • output_plugin

    • 用于逻辑解码的输出插件名称(参见 Section 49.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' 将照常仅仅对快照使用逻辑解码,但不会对快照执行任何其他操作。

  • slot_name (text)

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

  • consistent_point (text)

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

  • snapshot_name (text)

    • 该命令导出的快照的标识符。快照有效,直到针对此连接执行一个新命令或复制连接已关闭为止。如果创建的槽是物理槽,则该快照为 Null。

  • output_plugin (text)

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

  • slot_type (text)

    • 复制槽的类型,可能是 physicalNULL

  • restart_lsn (text)

    • The replication slot’s restart_lsn.

  • restart_tli (int8)

    • 当前时间线上历史记录中,与 restart_lsn 关联的时间线 ID。

  • XLogData (B) #

  • 主备存活消息 (B) #

  • Byte1('w')

    • 标识消息为 WAL 数据。

  • Int64

    • 此消息中 WAL 数据的开始点。

  • Int64

    • 服务器上 WAL 的当前结尾。

  • Int64

    • 传输时服务器的系统时钟,以 2000-01-01 午夜以来的微秒为单位。

  • Byte_n_

    • WAL 数据流的一部分。

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

  • Byte1('k')

    • 标识消息为发送者保持活动。

  • Int64

    • 服务器上 WAL 的当前结尾。

  • Int64

    • 传输时服务器的系统时钟,以 2000-01-01 午夜以来的微秒为单位。

  • Byte1

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

  • 备用状态更新 (F) #

  • 热备用反馈消息 (F) #

  • Byte1('r')

    • 标识消息为接收者状态更新。

  • Int64

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

  • Int64

    • 备库中已刷新到磁盘的最后一个 WAL 字节 + 1 的位置。

  • Int64

    • 备库中已应用的最后一个 WAL 字节 + 1 的位置。

  • Int64

    • 传输时客户端的系统时钟,以 2000-01-01 午夜以来的微秒为单位。

  • Byte1

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

  • Byte1('h')

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

  • Int64

    • 传输时客户端的系统时钟,以 2000-01-01 午夜以来的微秒为单位。

  • Int32

    • 备用的当前全局 xmin,不包含任何复制槽的 catalog_xmin。如果此值和后面的 catalog_xmin 均为 0,则将其视为一个通知,即不再在此连接上发送热备用反馈。后来的非零消息可能会重新启动反馈机制。

  • Int32

    • 备库上全局 xmin xid 的纪元。

  • Int32

    • 备库上所有复制槽的最低 catalog_xmin。如果备库上不存在 catalog_xmin 或已禁用热备反馈,则将其设为 0。

  • Int32

    • 备库上 catalog_xmin xid 的纪元。

  • SLOT slot_name

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

  • XXX/XXX

    • 开始流传输的 WAL 位置。

  • option_name

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

  • option_value

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

  • slot_name

    • 要删除的槽的名称。

  • WAIT

    • 此选项导致该命令在槽位变为非活动之前等待槽位处于活动状态,而不是引发错误的默认行为。

  • 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_选项结合使用。如果该值是一个整数,则它指定压缩级别。否则,它应该是一个用逗号分隔的项列表,每个项都采用_keyword_或_keyword=value_的形式。当前,受支持的关键字有_level_、long_和_workers

    • level 关键字设置压缩级别。对于 gzip,压缩级别应为_1_和_9_之间的整数(默认_Z_DEFAULT_COMPRESSION_或_-1_),对于_lz4_,压缩级别应为 1 和 12 之间的整数(快速压缩模式的默认值为_0_),对于_zstd_,压缩级别应为_ZSTD_minCLevel()(通常为-131072_)和_ZSTD_maxCLevel()(通常为_22)之间的整数(默认值为_ZSTD_CLEVEL_DEFAULT_或 3)。

    • long 关键字启用长距离匹配模式,以提高压缩比,但会以占用更多内存为代价。仅为 _zstd_支持长距离模式。

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

  • MAX_RATE rate

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

  • TABLESPACE_MAP [ _boolean ]_

    • 如果为 true,请将目录_pg_tblspc_中存在的符号链接信息包含在名为_tablespace_map_的文件中。表空间映射文件包括目录_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

  • spcoid (oid)

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

  • spclocation (text)

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

  • size (int8)

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

  • new archive (B)

  • manifest (B)

  • 存档或清单数据(B)

  • progress report (B)

  • Byte1('n')

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

  • String

    • 此存档的文件名。

  • String

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

  • Byte1('m')

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

  • Byte1('d')

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

  • Byte_n_

    • Data bytes.

  • Byte1('p')

    • 标识为进度报告的消息。

  • Int64

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