要启动流式复制,前端在启动消息中发送 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
#请求服务器标识自身。服务器返回一个单行的结果集,其中包含四个字段
systemid
(text
)标识群集的唯一系统标识符。这可以用于检查用于初始化备用的基本备份是否来自同一群集。
timeline
(int8
)当前时间线 ID。也可用于检查备用服务器是否与主服务器一致。
xlogpos
(text
)当前 WAL 刷新位置。可用于获取预写式日志中可以开始流式传输的已知位置。
dbname
(text
)连接到的数据库或 null。
SHOW
name
#请求服务器发送运行时参数的当前设置。这类似于 SQL 命令 SHOW。
name
运行时参数的名称。可用参数在 第 19 章 中进行了说明。
TIMELINE_HISTORY
tli
#请求服务器发送时间线 tli
的时间线历史文件。服务器返回一个单行的结果集,其中包含两个字段。虽然这些字段标记为 text
,但它们实际上返回原始字节,不进行编码转换
filename
(text
)时间线历史文件的文件名,例如 00000002.history
。
content
(text
)时间线历史文件的内容。
CREATE_REPLICATION_SLOT
slot_name
[ TEMPORARY
] { PHYSICAL
| LOGICAL
output_plugin
} [ ( option
[, ...] ) ] #创建物理或逻辑复制槽。有关复制槽的更多信息,请参阅 第 26.2.6 节。
slot_name
要创建的槽的名称。必须是有效的复制槽名称(请参阅 第 26.2.6.1 节)。
output_plugin
用于逻辑解码的输出插件的名称(请参阅 第 47.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'
将像往常一样仅将快照用于逻辑解码,而不会执行任何其他操作。
FAILOVER [ boolean
]
如果为 true,则启用该槽以同步到备用服务器,以便在故障转移后可以恢复逻辑复制。默认值为 false。
在响应此命令时,服务器将发送一个包含以下字段的单行结果集
slot_name
(text
)新创建的复制槽的名称。
consistent_point
(text
)该槽变得一致时的 WAL 位置。这是此复制槽上可以开始流式传输的最早位置。
snapshot_name
(text
)该命令导出的快照的标识符。快照在对该连接执行新命令或关闭复制连接之前有效。如果创建的槽是物理的,则为 Null。
output_plugin
(text
)新创建的复制槽使用的输出插件的名称。如果创建的槽是物理的,则为 Null。
CREATE_REPLICATION_SLOT
slot_name
[ TEMPORARY
] { PHYSICAL
[ RESERVE_WAL
] | LOGICAL
output_plugin
[ EXPORT_SNAPSHOT
| NOEXPORT_SNAPSHOT
| USE_SNAPSHOT
| TWO_PHASE
] } #为了与旧版本兼容,仍然支持 CREATE_REPLICATION_SLOT
命令的此替代语法。
ALTER_REPLICATION_SLOT
slot_name
( option
[, ...] ) #更改复制槽的定义。有关复制槽的更多信息,请参阅 第 26.2.6 节。此命令目前仅支持逻辑复制槽。
slot_name
要更改的槽的名称。必须是有效的复制槽名称(请参阅 第 26.2.6.1 节)。
支持以下选项
FAILOVER [ boolean
]
如果为 true,则启用该槽以同步到备用服务器,以便在故障转移后可以恢复逻辑复制。
READ_REPLICATION_SLOT
slot_name
#读取与复制槽关联的某些信息。如果复制槽不存在,则返回包含 NULL
值的元组。此命令目前仅支持物理复制槽。
在响应此命令时,服务器将返回一个包含以下字段的单行结果集
slot_type
(text
)复制槽的类型,可以是 physical
或 NULL
。
restart_lsn
(text
)复制槽的 restart_lsn
。
restart_tli
(int8
)与 restart_lsn
关联的时间线 ID,遵循当前时间线历史。
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
开启时哪些事务仍然需要。
如果客户端请求的时间线不是最新的,但属于服务器的历史记录的一部分,服务器将从请求的起始点开始,在该时间线上流式传输所有 WAL,直到服务器切换到另一个时间线的点。如果客户端请求在旧时间线的末尾进行流式传输,服务器将完全跳过 COPY 模式。
在流式传输完不是最新时间线上的所有 WAL 后,服务器将通过退出 COPY 模式来结束流式传输。当客户端也退出 COPY 模式以确认这一点时,服务器将发送一个包含一行两列的结果集,指示此服务器历史记录中的下一个时间线。第一列是下一个时间线的 ID(类型为 int8
),第二列是发生切换的 WAL 位置(类型为 text
)。通常,切换位置是流式传输的 WAL 的末尾,但在某些极端情况下,服务器可能会从旧时间线发送一些它自己在提升之前没有重放过的 WAL。最后,服务器发送两条 CommandComplete 消息(一条结束 CopyData,另一条结束 START_REPLICATION
本身),并准备好接受新命令。
WAL 数据作为一系列 CopyData 消息发送;有关详细信息,请参阅 第 53.6 节 和 第 53.7 节。(这允许其他信息混合在一起;特别是,如果服务器在开始流式传输后遇到故障,它可以发送 ErrorResponse 消息。)从服务器到客户端的每个 CopyData 消息的有效负载包含以下格式之一的消息
将消息标识为 WAL 数据。
此消息中 WAL 数据的起始点。
服务器上 WAL 的当前结束位置。
传输时服务器的系统时钟,以 2000-01-01 午夜以来的微秒数表示。
n
WAL 数据流的一部分。
单个 WAL 记录永远不会跨两个 XLogData 消息拆分。当 WAL 记录跨越 WAL 页边界,因此已经使用延续记录拆分时,可以在页边界拆分。换句话说,第一个主 WAL 记录及其延续记录可以在不同的 XLogData 消息中发送。
将消息标识为发送方保持活动消息。
服务器上 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 的 epoch。
备用服务器上任何复制槽的最低 catalog_xmin
。如果备用服务器上不存在 catalog_xmin
或正在禁用热备用反馈,则设置为 0。
备用服务器上 catalog_xmin
xid 的 epoch。
START_REPLICATION
SLOT
slot_name
LOGICAL
XXX/XXX
[ ( option_name
[ option_value
] [, ...] ) ] #指示服务器开始流式传输逻辑复制的 WAL,从 WAL 位置 XXX/XXX
或槽的 confirmed_flush_lsn
开始(请参阅第 52.19 节),取较大者。此行为使客户端更容易避免在没有要处理的数据时更新其本地 LSN 状态。但是,从与请求不同的 LSN 开始可能无法捕获某些类型的客户端错误;因此,客户端可能希望在发出 START_REPLICATION
之前检查 confirmed_flush_lsn
是否与其期望值匹配。
如果槽不存在,服务器可以回复错误。如果成功,服务器将回复 CopyBothResponse 消息,然后开始向前端流式传输 WAL。
CopyBothResponse 消息中的消息格式与为 START_REPLICATION ... PHYSICAL
记录的格式相同,包括两条 CommandComplete 消息。
与所选槽关联的输出插件用于处理流式传输的输出。
SLOT
slot_name
从中流式传输更改的槽的名称。此参数是必需的,并且必须对应于在 LOGICAL
模式下使用 CREATE_REPLICATION_SLOT
创建的现有逻辑复制槽。
XXX/XXX
开始流式传输的 WAL 位置。
option_name
传递给槽的逻辑解码输出插件的选项名称。有关标准 (pgoutput
) 插件接受的选项,请参阅第 53.5 节。
option_value
与指定选项关联的可选值,形式为字符串常量。
DROP_REPLICATION_SLOT
slot_name
[ WAIT
] #删除复制槽,释放任何保留的服务器端资源。如果该槽是一个在 walsender 连接的数据库之外的数据库中创建的逻辑槽,则此命令将失败。
slot_name
要删除的槽的名称。
WAIT
此选项使命令在槽处于活动状态时等待,直到它变为非活动状态,而不是引发错误的默认行为。
UPLOAD_MANIFEST
#上传备份清单,为进行增量备份做准备。
BASE_BACKUP
[ ( option
[, ...] ) ] #指示服务器开始流式传输基本备份。系统将在启动备份之前自动进入备份模式,并在备份完成时退出备份模式。接受以下选项
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,则在名为 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
。
INCREMENTAL
请求增量备份。必须先执行 UPLOAD_MANIFEST
命令,然后才能使用此选项运行基本备份。
当备份开始时,服务器将首先发送两个普通的结果集,然后发送一个或多个 CopyOutResponse 结果。
第一个普通结果集包含备份的起始位置,以单行两列的形式。第一列包含以 XLogRecPtr 格式给出的起始位置,第二列包含对应的时间线 ID。
第二个普通结果集为每个表空间有一行。此行中的字段为
spcoid
(oid
)表空间的 OID,如果它是基本目录,则为 null。
spclocation
(text
)表空间目录的完整路径,如果它是基本目录,则为 null。
size
(int8
)如果已请求进度报告,则为表空间的大概大小(以千字节(1024 字节)为单位);否则为 null。
在第二个常规结果集之后,将发送 CopyOutResponse。每个 CopyData 消息的有效负载将包含以下格式之一的消息
将消息标识为指示新存档的开始。主数据目录将有一个存档,每个额外的表空间将有一个存档;每个存档将使用 tar 格式(遵循 POSIX 1003.1-2008 标准中指定的“ustar 交换格式”)。
此存档的文件名。
对于主数据目录,为空字符串。对于其他表空间,为从中创建此存档的目录的完整路径。
将消息标识为指示备份清单的开始。
将消息标识为包含存档或清单数据。
n
数据字节。
将消息标识为进度报告。
已完成处理的当前表空间中的字节数。
在发送 CopyOutResponse 或所有此类响应后,将发送最终的普通结果集,其中包含备份的 WAL 结束位置,格式与起始位置相同。
数据目录和每个表空间的 tar 存档将包含目录中的所有文件,无论它们是 PostgreSQL 文件还是添加到同一目录的其他文件。唯一排除的文件是
postmaster.pid
postmaster.opts
pg_internal.init
(在多个目录中找到)
在 PostgreSQL 服务器运行期间创建的各种临时文件和目录,例如任何以 pgsql_tmp
开头的文件或目录和临时关系。
未记录的关系,除了在恢复时重建(空)未记录关系所需的 init 分支。
pg_wal
,包括子目录。如果备份运行时包含 WAL 文件,则将包含 pg_wal
的合成版本,但它只包含备份工作所需的文件,而不包含其余内容。
pg_dynshmem
、pg_notify
、pg_replslot
、pg_serial
、pg_snapshots
、pg_stat_tmp
和 pg_subtrans
将被复制为空目录(即使它们是符号链接)。
将跳过常规文件和目录以外的文件,例如符号链接(上面列出的目录除外)以及特殊设备和操作系统文件。(pg_tblspc
中的符号链接将保留。)
如果服务器上的底层文件系统支持,则会设置所有者、组和文件模式。
在上述所有命令中,当指定 boolean
类型的参数时,可以省略 value
部分,这等效于指定 TRUE
。
如果您在文档中发现任何不正确的内容、与特定功能的经验不符或需要进一步说明的内容,请使用此表单报告文档问题。