Postgresql 中文操作指南
55.4. Streaming Replication Protocol #
要启动流复制,前端在启动消息中发送 replication 参数。布尔值 true(或 on、yes、1)告诉后端进入物理复制 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 TRANSACTION、COMMIT PREPARED 和 ROLLBACK 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)
-
复制槽的类型,可能是 physical 或 NULL 。
-
-
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'
-
指示服务器使用指定方法压缩备份。当前,支持的方法有 gzip、lz4 和 zstd。
-
-
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
-
如果该选项指定的值为 yes 或 force-encode,则会创建一个备份清单并随备份一起发送。除了可能包含的任何 WAL 文件以外,该清单是备份中存在的所有文件的列表。它还存储每个文件的大小、上次修改时间和(可选)校验和。值 force-encode 强制将所有文件名进行十六进制编码;否则,只对文件名是非 UTF8 八位字节序列的文件执行此类编码。force-encode 主要用于测试目的,以确保读取备份清单的客户端可以处理这种情况。为保持与先前版本兼容,默认值为 MANIFEST 'no'。
-
-
MANIFEST_CHECKSUMS checksum_algorithm
-
指定应应用到备份清单中包含的每个文件的校验和算法。当前,可用的算法有 NONE、CRC32C、SHA224、SHA256、SHA384 和 SHA512。默认值为 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
-
已完成处理的当前表空间中的字节数。
-