要启动流复制,前端在启动消息中发送replication参数。布尔值true (或on、yes、1)告诉后端进入物理复制 walsender 模式,在此模式下,可以发出下面列出的一小组复制命令,而不是 SQL 语句。
将database作为replication参数的值传递给后端, 指示其进入逻辑复制 walsender 模式,并连接到dbname参数中指定的数据库。 在逻辑复制 walsender 模式下,可以发出下文所示的复制命令以及普通 SQL 命令。
无论是物理复制还是逻辑复制的 walsender 模式,都只能使用简单查询协议。
为了测试复制命令,可以通过psql或任何其他使用连接字符串且包含replication选项的libpq工具建立复制连接, 例如:
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
然而,更常用的是使用pg_receivewal(用于物理复制)或pg_recvlogical(用于逻辑复制)。
复制命令在服务器日志中记录,当启用log_replication_commands时。
复制模式中接受的命令包括:
IDENTIFY_SYSTEM #请求服务器标识自身。服务器会返回一个包含四个字段的单行结果集:
systemid (text)用于标识该集簇的唯一系统标识符。它可用于检查初始化备库所用的基础备份是否来自同一个集簇。
timeline (int4)当前时间线 ID。也可用于检查备库是否与主库一致。
xlogpos (text)当前 WAL 刷新位置。用于获得预写式日志中的一个已知位置,以便从该处开始流复制。
dbname (text)当前连接到的数据库,或为 null。
SHOW name #请求服务器发送运行时参数的当前设置。这类似于SQL命令SHOW。
name一个运行时参数的名称。可用参数在Chapter 19中有文档记录。
TIMELINE_HISTORY tli #请求服务器发送时间线历史文件以获取时间线tli。 服务器回复一行结果集,包含两个字段。虽然这些字段被标记为text, 但它们实际上返回原始字节,没有编码转换:
filename (text)时间线历史文件的文件名,例如,00000002.history。
content (text)时间线历史文件的内容。
CREATE_REPLICATION_SLOT slot_name [ TEMPORARY ] { PHYSICAL [ RESERVE_WAL ] | LOGICAL output_plugin [ EXPORT_SNAPSHOT | NOEXPORT_SNAPSHOT | USE_SNAPSHOT ] } #创建一个物理或逻辑复制槽。查看Section 26.2.6了解更多关于复制槽的信息。
slot_name要创建的复制槽名称。必须是合法的复制槽名称(参见Section 26.2.6.1)。
consistent_point (text)复制槽达到一致状态时的 WAL 位置。这是可从该复制槽开始流复制的最早位置。
snapshot_name (text)该命令导出的快照标识符。该快照在此连接上执行下一条命令之前,或复制连接关闭之前有效。如果所创建的是物理复制槽,则为 null。
output_plugin (text)新建复制槽所使用的输出插件名称。如果所创建的是物理复制槽,则为 null。
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 时,哪些事务 仍然被备库所需要。
如果客户端请求的 timeline 不是最新的,但属于服务器历史的一部分,服务器会从请求的起点开始流传输该 timeline 上的全部 WAL,直到服务器切换到另一个 timeline 的位置为止。如果客户端请求的位置正好是旧 timeline 的末尾,服务器将完全跳过 COPY 模式。
在非最新时间线上流传输完全部 WAL 后,服务器会通过退出 COPY 模式来结束流传输。当客户端也通过退出 COPY 模式来确认时,服务器会发送一个包含一行两列的结果集,指示该服务器历史中的下一条时间线。第一列是下一条时间线的 ID(类型为 int8),第二列是发生切换的 WAL 位置(类型为 text)。通常,切换位置就是所流传输 WAL 的末尾,但也存在一些边界情况,服务器可能会先发送一些自己在提升前尚未重放的旧时间线 WAL。最后,服务器会发送两个 CommandComplete 消息(一个结束 CopyData,另一个结束 START_REPLICATION 本身),然后准备接受新的命令。
WAL 数据会作为一系列 CopyData 消息发送;详见 Section 51.6 与 Section 51.7。(这使其他信息可与之交错发送;特别是服务器在开始流传输后若遇到失败,仍可发送 ErrorResponse。)从服务器到客户端的每个 CopyData 消息负载都属于以下格式之一:
将消息标识为WAL数据。
该消息中 WAL 数据的起始点。
服务器上当前的WAL结束位置。
传输时服务器的系统时钟,以2000-01-01午夜以来的微秒计算。
nWAL数据流的一个部分。
单个 WAL 记录绝不会拆分为两个 XLogData 消息。 当 WAL 记录跨越 WAL 页面边界,并因此已使用连续记录进行拆分时,它可以在页面边界处进行拆分。 换句话说,第一个主 WAL 记录及其连续记录可以在不同的 XLogData 消息中发送。
将该消息标识为发送方 keepalive。
服务器上当前的WAL结束位置。
传输时服务器的系统时钟,以2000-01-01午夜以来的微秒计算。
1 表示客户端应尽快回复此消息,以避免超时断开连接。否则为0。
接收进程可以随时使用以下某种消息格式向发送方回传响应(同样放在 CopyData 消息的负载中):
将该消息标识为接收方状态更新。
备库中最后一个已接收并写入磁盘的 WAL 字节位置 + 1。
备库中最后一个已刷写到磁盘的 WAL 字节位置 + 1。
备库中最后一个已应用的 WAL 字节位置 + 1。
客户端在传输时的系统时钟,以2000-01-01午夜以来的微秒计算。
如果为 1,则客户端请求服务器立即回复此消息。这可用于 ping 服务器,以测试连接是否仍然健康。
将该消息标识为热备反馈消息。
客户端在传输时的系统时钟,以2000-01-01午夜以来的微秒计算。
备库当前的全局 xmin,不包括任何复制槽中的 catalog_xmin。如果该值和后面的 catalog_xmin 都为 0,则视为通知:此连接后续将不再发送热备反馈。之后的非零消息可能会重新启动反馈机制。
备库上全局 xmin xid 的纪元。
备库上任何复制槽中的最低 catalog_xmin。如果备库上不存在 catalog_xmin,或已禁用热备反馈,则设为 0。
备用服务器上 catalog_xmin xid 的纪元。
START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [ option_value ] [, ...] ) ] #指示服务器开始为逻辑复制流传输 WAL,起始 WAL 位置为 XXX/XXX。服务器可以返回错误,例如请求的 WAL 段已被回收。成功时,服务器会响应一条 CopyBothResponse 消息,然后开始向前端流传输 WAL。
CopyBothResponse 中承载的消息采用与 START_REPLICATION ... PHYSICAL 文档中记载的相同格式,包括两个 CommandComplete 消息。
与所选复制槽关联的输出插件将用于处理流式输出。
SLOT slot_name要从中流传输更改的复制槽名称。该参数是必需的,并且必须对应于使用 CREATE_REPLICATION_SLOT 在 LOGICAL 模式下创建的现有逻辑复制槽。
XXX/XXX开始流式传输的WAL位置。
option_name传递给复制槽逻辑解码输出插件的选项名称。请参阅Section 51.5, 了解标准(pgoutput)插件接受的选项。
option_value指定选项相关的可选值,以字符串常量的形式表示。
DROP_REPLICATION_SLOT slot_name [ WAIT ] #删除复制槽,释放任何保留的服务器端资源。
slot_name要删除的复制槽名称。
WAIT该选项会让命令在复制槽处于活跃状态时等待,直到其变为非活跃,而不是按默认行为报错。
BASE_BACKUP [ LABEL 'label' ] [ PROGRESS ] [ FAST ] [ WAL ] [ NOWAIT ] [ MAX_RATE rate ] [ TABLESPACE_MAP ] [ NOVERIFY_CHECKSUMS ] [ MANIFEST manifest_option ] [ MANIFEST_CHECKSUMS checksum_algorithm ] #指示服务器开始流式传输基本备份。 在备份开始之前,系统将自动进入备份模式,并在备份完成后退出备份模式。 接受以下选项:
LABEL 'label'设置备份的标签。如果未指定,则将使用base backup作为备份标签。 标签的引用规则与打开standard_conforming_strings的标准SQL字符串相同。
PROGRESS请求生成进度报告所需的信息。这将在每个表空间的头部发回大致大小,可用于计算流传输的完成进度。此大小通过在传输开始之前枚举所有文件大小来计算,因此可能对性能有负面影响。特别是在第一个数据被发出之前可能需要更长的时间。
FAST请求快速检查点。
WAL [ boolean ]如果设置为true,则在备份中包含必要的WAL段。这将包括在开始和停止备份之间的所有文件在基本目录tar文件的pg_wal目录中。默认值为false。
WAIT [ boolean ]如果设置为 true,备份会等待直到最后一个所需 WAL 段已归档;若未启用 WAL 归档则发出警告。 如果设置为 false,备份既不等待也不警告,而由客户端负责确保所需 WAL 可用。 默认值为true。
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当指定此选项的值为yes或force-encode时, 将创建一个备份清单并随备份一起发送。该清单是备份中每个文件的列表, 除了可能包含的任何WAL文件。它还存储每个文件的大小、最后修改时间, 以及可选的校验和。 值为force-encode会强制对所有文件名进行十六进制编码; 否则,仅对文件名为非UTF8八位序列的文件执行此类型的编码。 force-encode主要用于测试目的,以确保读取备份清单的客户端 能够处理这种情况。为了与之前的版本兼容,默认值为MANIFEST 'no'。
MANIFEST_CHECKSUMS checksum_algorithm指定应用于备份清单中包含的每个文件的校验和算法。 目前,可用的算法有NONE、CRC32C、 SHA224、SHA256、 SHA384和SHA512。 默认值为CRC32C。
当备份开始时,服务器将首先发送两个普通的结果集,然后是一个或多个CopyOutResponse结果。
第一个普通结果集包含备份的起始位置,在一个包含两列的单行中。第一列包含以XLogRecPtr格式给出的起始位置,第二列包含相应的时间线ID。
第二个普通结果集中的每个表空间都有一行。 这一行中的字段是:
spcoid (oid)表空间的OID,如果是基本目录则为null。
spclocation (text)表空间目录的完整路径,如果是基本目录则为null。
size (int8)表空间的大致大小,以千字节(1024字节)为单位,如果已请求进度报告;否则为null。
在第二个常规结果集之后,将发送一个CopyOutResponse。 每个CopyData消息的有效负载将包含以下格式之一的消息:
标识消息表示备份清单的开始。
标识消息包含归档或清单数据。
n数据字节。
标识消息为进度报告。
已完成处理的来自当前表空间的字节数。
在发送了CopyOutResponse或所有这些响应之后,将发送最终的普通结果集,其中包含备份的WAL结束位置,格式与起始位置相同。
数据目录和每个表空间的tar归档将包含目录中的所有文件,无论它们是PostgreSQL文件还是添加到同一目录的其他文件。唯一排除的文件是:
postmaster.pid
postmaster.opts
pg_internal.init(在多个目录中找到)
PostgreSQL 服务器运行期间创建的各种临时文件和目录,例如以pgsql_tmp开头的任何文件或目录以及临时关系。
未记录的关系(Unlogged表),除了需要在恢复时重新创建(空的)未记录的关系的init fork。
pg_wal,包括子目录。如果备份包含WAL文件,则将包含pg_wal的合成版本,但它只包含备份工作所需的文件,而不包含其余内容。
pg_dynshmem,pg_notify, pg_replslot,pg_serial, pg_snapshots,pg_stat_tmp和 pg_subtrans将作为空目录复制(即使它们是符号链接)。
除了常规文件和目录之外的文件,如符号链接(除了上述列出的目录之外的符号链接)以及特殊设备和操作系统文件,将被跳过。(pg_tblspc中的符号链接将被保留。)
如果服务器上的底层文件系统支持,将设置所有者、组和文件模式。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。