pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
要发起流式复制,前端在启动消息中发送 replication 参数。布尔值 true 告知后端进入 walsender 模式,在该模式下可以发出一小组复制命令,而不是 SQL 语句。walsender 模式只能使用简单查询协议。传入值 database 会指示 walsender 连接到 dbname 参数指定的数据库,从而允许此连接用于从该数据库进行逻辑复制。
为了测试复制命令,可以通过psql或其他使用libpq的工具建立复制连接,连接字符串中应包含replication选项,例如:
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
不过,通常更有用的做法是使用 pg_receivexlog(用于物理复制)或 pg_recvlogical(用于逻辑复制)。
walsender 模式接受以下命令:
请求服务器标识自身。服务器返回一个只有一行的结果集,包含四个字段:
标识数据库集簇的唯一系统标识符。可用于检查初始化备库的基础备份是否来自同一个数据库集簇。
当前时间线 ID。也可用于检查备库是否与主库一致。
当前 xlog 刷盘位置。可用于获取事务日志中一个已知的位置,以便从该处开始流式传输。
所连接的数据库,或 null。
tli 请求服务器发送时间线 tli 的时间线历史文件。服务器返回一个只有一行的结果集,包含两个字段:
时间线历史文件的文件名,例如,00000002.history。
时间线历史文件的内容。
slot_name { PHYSICAL | LOGICAL output_plugin } 创建一个物理或逻辑复制槽。查看第 25.2.6 节了解更多关于复制槽的信息。
slot_name要创建的复制槽名称。必须是合法的复制槽名称(参见第 25.2.6.1 节)。
output_plugin用于逻辑解码的输出插件名称(参见 第 46.6 节)。
SLOT slot_name] [PHYSICAL] XXX/XXX [TIMELINE tli] 指示服务器开始流式传输 WAL,从 WAL 位置 XXX/XXX 开始。 如果指定了TIMELINE选项,则流式传输将从时间线tli开始; 否则,将选择服务器当前的时间线。如果请求的WAL部分已经被回收,服务器可能会回复错误。 成功时,服务器将用CopyBothResponse消息回复,然后开始向前端流式传输WAL。
如果通过slot_name提供了复制槽名称, 那么在复制进行期间会更新该复制槽,以便服务器知道哪些 WAL 段, 以及在启用了 hot_standby_feedback 时,哪些事务 仍然被备库所需要。
如果客户端请求的时间线不是最新时间线,但属于服务器的历史,服务器会从请求的起点开始,流式传输该时间线上的所有 WAL,直到服务器切换到另一条时间线的位置。如果客户端请求的流式传输起点恰好位于旧时间线的末尾,服务器会立即返回 CommandComplete,而不进入 COPY 模式。
在非最新时间线上流式传输完全部 WAL 后,服务器会通过退出 COPY 模式来结束流式传输。当客户端也通过退出 COPY 模式来确认时,服务器会发送一个包含一行两列的结果集,指示该服务器历史中的下一条时间线。第一列是下一条时间线的 ID,第二列是发生切换的 XLOG 位置。通常,切换位置就是所流式传输 WAL 的末尾,但也存在一些边界情况,服务器可能会先发送一些自己在提升前尚未重放的旧时间线 WAL。最后,服务器发送 CommandComplete 消息,然后准备接受新的命令。
WAL 数据通过一系列 CopyData 消息发送。(这样可以混合发送其他信息;尤其是服务器在开始流式传输后遇到故障时,可以发送 ErrorResponse 消息。)服务器发给客户端的每条 CopyData 消息,其有效载荷都包含一条具有下列格式之一的消息:
将该消息标识为 WAL 数据。
本消息中 WAL 数据的起始位置。
服务器上当前的 WAL 末尾位置。
发送消息时服务器的系统时钟,以自 2000-01-01 午夜以来的微秒数表示。
nWAL 数据流的一个片段。
单条 WAL 记录绝不会被拆分到两条 XLogData 消息中。当 WAL 记录跨越 WAL 页边界,因而已经通过续接记录拆分时,可以在页边界处分开发送。换句话说,最初的主 WAL 记录及其续接记录可以在不同的 XLogData 消息中发送。
将该消息标识为发送端保活消息。
服务器上当前的 WAL 末尾位置。
发送消息时服务器的系统时钟,以自 2000-01-01 午夜以来的微秒数表示。
1 表示客户端应尽快回复此消息,以避免超时断开连接;否则为 0。
接收进程可以随时使用以下消息格式之一回复发送端(同样放在 CopyData 消息的有效载荷中):
将该消息标识为接收端状态更新。
备库已接收并写入磁盘的最后一个 WAL 字节的位置加 1。
备库已刷盘的最后一个 WAL 字节的位置加 1。
备库已应用的最后一个 WAL 字节的位置加 1。
发送消息时客户端的系统时钟,以自 2000-01-01 午夜以来的微秒数表示。
如果为 1,表示客户端请求服务器立即回复此消息。可用它向服务器发送探测请求,以测试连接是否仍然正常。
将该消息标识为热备反馈消息。
发送消息时客户端的系统时钟,以自 2000-01-01 午夜以来的微秒数表示。
备库当前的 xmin。如果备库发送通知说此连接将不再发送热备反馈,则该值可能为 0。之后的非零消息可以重新启动反馈机制。
备库当前的纪元。
SLOT slot_name LOGICAL XXX/XXX [ ( option_name [option_value] [, ... ] ) ]指示服务器开始为逻辑复制流式传输 WAL,起始 WAL 位置为 XXX/XXX。服务器可以返回错误,例如请求的 WAL 段已被回收。成功时,服务器会响应一条 CopyBothResponse 消息,然后开始向前端流式传输 WAL。
CopyBothResponse 中承载的消息采用与 START_REPLICATION ... PHYSICAL 文档中记载的相同格式。
与所选复制槽关联的输出插件将用于处理流式输出。
SLOT slot_name要从中流式传输更改的复制槽名称。该参数是必需的,并且必须对应于使用 CREATE_REPLICATION_SLOT 在 LOGICAL 模式下创建的现有逻辑复制槽。
XXX/XXX开始流式传输的WAL位置。
option_name传递给复制槽逻辑解码插件的选项名称。
option_value指定选项相关的可选值,以字符串常量的形式表示。
slot_name 删除复制槽,释放任何保留的服务器端资源。如果该槽当前正被一个活动连接使用,则此命令失败。
slot_name要删除的复制槽名称。
LABEL 'label'] [PROGRESS] [FAST] [WAL] [NOWAIT] [MAX_RATE rate] 指示服务器开始流式传输基础备份。 在备份开始之前,系统将自动进入备份模式,并在备份完成后退出备份模式。 接受以下选项:
LABEL 'label'设置备份的标签。如果未指定,则将使用base backup作为备份标签。 标签的引号使用规则与打开standard_conforming_strings的标准SQL字符串相同。
PROGRESS请求生成进度报告所需的信息。这将在每个表空间的首部发送一个近似大小, 可用于计算流式传输的进度。这是通过在传输开始之前先枚举所有文件大小来计算的, 可能会对性能产生负面影响。特别是,在流式传输数据之前可能需要更长的时间。 由于备份期间数据库文件可能会发生变化,因此大小仅为近似值, 在估算与实际发送文件之间的这段时间里可能会增长或缩小。
FAST请求快速检查点。
WAL在备份中包含必要的 WAL 段。这会把开始备份到停止备份之间的所有文件放入基础目录 tar 文件内的pg_xlog目录中。
NOWAIT默认情况下,备份会等待最后一个必需的 WAL 段完成归档;如果未启用日志归档,则发出警告。指定 NOWAIT 会同时禁用等待和警告,由客户端负责确保所需日志可用。
MAX_RATE rate限制(节流)每单位时间从服务器传输到客户端的最大数据量。预期的单位是每秒千字节。 如果指定了此选项,则该值必须等于零,或者必须在32 kB到1 GB(含)的范围内。 如果传递零或未指定该选项,则不对传输施加任何限制。
备份开始时,服务器首先发送两个普通结果集,然后发送一个或多个 CopyResponse 结果。
第一个普通结果集包含备份的起始位置,在一个包含两列的单行中。第一列包含以XLogRecPtr格式给出的起始位置,第二列包含相应的时间线ID。
第二个普通结果集中的每个表空间都有一行。 这一行中的字段是:
表空间的 OID,如果是基础目录则为 NULL。
表空间目录的完整路径,如果是基础目录则为 NULL。
如果请求了进度报告,则为表空间的大致大小;否则为 NULL。
在第二个普通结果集之后,会发送一个或多个 CopyResponse 结果,其中一个用于 PGDATA,其他结果分别用于 pg_default 和 pg_global 之外的各个附加表空间。CopyResponse 结果中的数据是表空间内容的 tar 格式转储(遵循 POSIX 1003.1-2008 标准中规定的 “ustar interchange format”),但省略了标准规定的末尾两个全零块。tar 数据传输完成后,会发送最后一个普通结果集,其中包含备份的 WAL 结束位置,格式与起始位置相同。
数据目录和每个表空间的tar归档将包含目录中的所有文件,无论它们是PostgreSQL文件还是添加到同一目录的其他文件。唯一排除的文件是:
postmaster.pid
postmaster.opts
PostgreSQL 服务器运行过程中创建的各种临时文件。
pg_xlog,包括子目录。如果备份包含WAL文件,则将包含pg_xlog的合成版本,但它只包含使备份可用所需的文件,而不包含其余内容。
pg_replslot作为空目录复制。
除普通文件和目录之外的文件,例如符号链接和特殊设备文件,会被跳过。(pg_tblspc中的符号链接会被保留。)
如果服务器上的底层文件系统支持,将设置所有者、组和文件模式。
所有表空间发送完毕后,会发送最后一个常规结果集。该结果集包含备份的结束位置,以 XLogRecPtr 格式作为单行单列给出。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。