阅读(3960) (13)

PostgreSQL 预写式日志

2021-08-18 17:23:34 更新
19.5.1. 设置
19.5.2. 检查点
19.5.3. 归档
19.5.4. 归档恢复
19.5.5. 恢复目标

参阅第 29.4 节获取调节这些设置的额外信息。

19.5.1. 设置

wal_level (enum)

wal_level决定多少信息写入到 WAL 中。默认值是replica,它会写入足够的数据以支持WAL归档和复制,包括在后备服务器上运行只读查询。minimal会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录。最后,logical会增加支持逻辑解码所需的信息。每个层次包括所有更低层次记录的信息。这个参数只能在服务器启动时设置。

minimal级别中,对于创建或重写永久关系的事务的其余部分,不会记录任何信息。。 这可以使那些操作更快(参见第 14.4.7 节)。初始化这种优化的操作包括:

ALTER ... SET TABLESPACE
CLUSTER
CREATE TABLE
REFRESH MATERIALIZED VIEW (without CONCURRENTLY)
REINDEX
TRUNCATE

但最少的 WAL 不会包括足够的信息来从基础备份和 WAL 日志中重建数据,因此,要启用 WAL 归档(archive_mode)和流复制,必须使用replica或更高级别。

logical层,与replica相同的信息会被记录,外加上 允许从 WAL 抽取逻辑修改集所需的信息。使用级别 logical将增加 WAL 容量,特别是如果为了REPLICA IDENTITY FULL配置了很多表并且执行了很多UPDATEDELETE语句时。

在 9.6 之前的版本中,这个参数也允许值archivehot_standby。现在仍然接受这些值,但是它们会被映射到replica

fsync (boolean)

如果打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出fsync()系统调用或者使用多种等价的方法(见​wal_sync_method​)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。

虽然关闭fsync常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重建整个数据库时才建议关闭fsync

能安全关闭fsync的环境的例子包括从一个备份文件中初始加载一个新数据库集簇、使用一个数据库集簇来在数据库被删掉并重建之后处理一批数据,或者一个被经常重建并却不用于失效备援的只读数据库克隆。单独的高质量硬件不足以成为关闭fsync的理由。

当把fsync从关闭改成打开时,为了可靠的恢复,需要强制在内核中的所有被修改的缓冲区进入持久化存储。这可以在多个时机来完成:在集簇被关闭时或在 fsync 因为运行initdb --sync-only而打开时、运行sync时、卸载文件系统时或者重启服务器时。

在很多情况下,为不重要的事务关闭​synchronous_commit​可以提供很多关闭fsync的潜在性能收益,并不会有的同时, 关闭fsync可以提供很多潜在的性能优势,而不会有伴随着的数据损坏风险。

fsync只能在postgresql.conf文件中或在服务器命令行上设置。如果你关闭这个参数,请也考虑关闭​full_page_writes​。

synchronous_commit (enum)

指定数据库服务器返回success指示给客户端之前,必须要完成多少WAL处理。 合法的值为remote_apply, on(默认值), remote_write,local, 和 off

如果synchronous_standby_names为空,则唯一有意义的设置为onoffremote_applyremote_writelocal都提供与 on相同的本地同步级别。 所有非off模式的本地行为都是等待WAL的本地刷新到磁盘。 在 off模式,无需等待,因此在向客户端报告成功和以后保证事务安全防止服务器崩溃之间可能会出现延迟。 当设置为off时,在向客户端报告成功和真正保证事务不会被服务器崩溃威胁之间会有延迟(最大的延迟是​wal_writer_delay​的三倍)。 不同于​fsync​,将这个参数设置为off不会产生数据库不一致性的风险:一个操作系统或数据库崩溃可能会造成一些最近据说已提交的事务丢失,但数据库状态是一致的,就像这些事务已经被干净地中止。 因此,当性能比完全确保事务的持久性更重要时,关闭synchronous_commit可以作为一个有效的代替手段。更多讨论见第 29.3 节

如果synchronous_standby_names为非空,synchronous_commit也控制是否事务提交将等待它们的 WAL 记录在后备服务器上被处理。

当设置为 remote_apply 时,提交将等待,直到来自当前同步备用服务器的答复显示他们已收到事务的提交记录并应用了它,以便它变得对备用服务器上的查询可见,并写入备用服务器上的持久存储。 这将导致比以前的设置更大的提交延迟,因为它等待 WAL 重放(replay)。 当设置为on时,提交将等待,直到来自于当前同步的后备服务器的回复显示它们已经收到了事务的提交记录并将其刷入了磁盘。 这保证事务将不会被丢失,除非主服务器和所有同步后备都遭受到了数据库存储损坏的问题。 当这个参数被设置为remote_write时,提交将等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经把该记录写到它们的文件系统,这种设置保证数据得以保存,在PostgreSQL的后备服务器实例崩溃时,但是不能保证后备服务器遭受操作系统级别崩溃时数据能被保持,因为数据不一定必须要在后备机上达到持久存储。 设置local会导致提交等待本地刷写到磁盘,而不是复制。在使用同步复制时这通常是不可取的,但是为了完整性提供了这个选项。

这个参数可以随时被修改;任何一个事务的行为由其提交时生效的设置决定。因此,可以同步提交一些事务,同时异步提交其他事务。例如,当默认是相反时,实现一个单一多语句事务的异步提交,在事务中发出SET LOCAL synchronous_commit TO OFF

表 19.1 概括了 synchronous_commit 设置的能力.

表 19.1. synchronous_commit Modes

synchronous_commit setting local durable commit standby durable commit after PG crash standby durable commit after OS crash standby query consistency
remote_apply
on  
remote_write    
local      
off        

wal_sync_method (enum)

用来向强制 WAL 更新到磁盘的方法。如果fsync是关闭的,那么这个设置就不相关,因为 WAL 文件更新将根本不会被强制。可能的值是:

  • open_datasync(用open()选项O_DSYNC写 WAL 文件)

  • fdatasync(在每次提交时调用fdatasync()

  • fsync(在每次提交时调用fsync()

  • fsync_writethrough(在每次提交时调用fsync(),强制任何磁盘写高速缓存的直通写)

  • open_sync(用open()选项O_SYNC写 WAL 文件)

open_* 选项也可以使用O_DIRECT(如果可用)。不是在所有平台上都能使用所有这些选择。默认值是列表中第一个被平台支持的那个, 不过fdatasync是 Linux 中的默认值。默认值不一定是最理想的;有可能需要修改这个设置或系统配置的其他方面来创建一个崩溃-安全的配置,或达到最佳性能。这些方面在第 29.1 节中讨论。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

full_page_writes (boolean)

当这个参数为打开时,PostgreSQL服务器在一个检查点之后的页面的第一次修改期间将每个页面的全部内容写到 WAL 中。这么做是因为在操作系统崩溃期间正在处理的一次页写入可能只有部分完成,从而导致在一个磁盘页面中混合有新旧数据。在崩溃后的恢复期间,通常存储在 WAL 中的行级改变数据不足以完全恢复这样一个页面。存储完整的页面映像可以保证页面被正确存储,但代价是增加了必须被写入 WAL 的数据量(因为 WAL 重放总是从一个检查点开始,所以在检查点后每个页面的第一次改变时这样做就够了。因此,一种减小全页面写开销的方法是增加检查点间隔参数值)。

把这个参数关闭会加快正常操作,但是在系统失败后可能导致不可恢复的数据损坏,或者静默的数据损坏。其风险类似于关闭fsync, 但是风险较小。并且只有在可关闭fsync的情况下才应该关闭它。

关闭这个选项并不影响用于时间点恢复(PITR)的 WAL 归档使用(见第 25.3 节)。

这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是on

wal_log_hints (boolean)

当这个参数为on时,PostgreSQL服务器一个检查点之后页面被第一次修改期间把该磁盘页面的整个内容都写入 WAL,即使对所谓的提示位做非关键修改也会这样做。

如果启用了数据校验和,提示位更新总是会被 WAL 记录并且这个设置会被忽略。你可以使用这个 设置测试如果你的数据库启用了数据校验和,会有多少额外的 WAL 记录发生。

这个参数只能在服务器启动时设置。默认值是off

wal_compression (boolean)

当这个参数为on时,如果​full_page_writes ​为打开或者处于基础备份期间,PostgreSQL服务器 会压缩写入到 WAL 中的完整页面镜像。压缩页面镜像将在 WAL 重放时 被解压。默认值为off。只有超级用户可以更改这个设置。

打开这个参数可以减小 WAL 所占的空间且无需承受不可恢复的数据损坏风险, 但是代价是需要额外的 CPU 开销以便在 WAL 记录期间进行压缩以及在 WAL 重放时解压。

wal_init_zero (boolean)

如果设置为on(默认值),此选项会导致新的 WAL 文件被零填充。 在某些文件系统上,这可确保在我们需要写入 WAL 记录之前分配空间。 但是,Copy-On-Write(COW)文件系统可能不会从此技术中受益,因此可以选择跳过不必要的工作。 如果设置为off,则在创建文件时仅写入最终字节,以便其具有预期大小。

wal_recycle (boolean)

如果设置为 on (默认值),此选项通过重命名来回收 WAL 文件,从而避免创建新文件。 在 COW 文件系统上,创建新文件系统可能更快,因此提供了禁用此行为的选项。

wal_buffers (integer)

用于还未写入磁盘的 WAL 数据的共享内存量。默认值 -1 选择等于shared_buffers的 1/32 的尺寸(大约3%),但是不小于64kB也不大于 WAL 段的尺寸(通常为)。如果自动的选择太大或太小可以手工设置该值,但是任何小于32kB的正值都将被当作 32kB。 如果指定值时没有单位,则以WAL块作为单位,即为 XLOG_BLCKSZ 字节,通常为8kB。这个参数只能在服务器启动时设置。

在每次事务提交时,WAL 缓冲区的内容被写出到磁盘,因此极大的值不可能提供显著的收益。不过,把这个值设置为几个兆字节可以在一个繁忙的服务器(其中很多客户端会在同一时间提交)上提高写性能。由默认设置 -1 选择的自动调节将在大部分情况下得到合理的结果。

wal_writer_delay (integer)

指定 WAL 写入器刷写 WAL 的频繁程度,以时间为单位。 在刷写WAL之后,写入器将根据wal_writer_delay所给出的时间长度进行睡眠,除非被一个异步提交的事务提前唤醒。 如果最近的刷写发生在 wal_writer_delay 之前,并且小于 wal_writer_flush_after WAL的值产生之后,那么WAL只会被写入操作系统,而不会被刷写到磁盘。 如果指定值时没有单位,则以毫秒作为单位。 默认值是 200 毫秒(200ms)。注意在很多系统上,有效的睡眠延迟粒度是 10 毫秒,把wal_writer_delay设置为一个不是 10 的倍数的值,其效果和把它设置为大于该值的下一个 10 的倍数产生的效果相同。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。

wal_writer_flush_after (integer)

指定 WAL 写入器刷写 WAL 的频繁程度,以卷为单位。 如果最近的刷写发生在 wal_writer_delay 之前,并且小于 wal_writer_flush_after WAL的值产生之后,那么WAL只会被写入操作系统,而不会被刷写到磁盘。 如果wal_writer_flush_after被设置为0,则WAL数据总是会被立即刷写。 如果指定值时没有单位,则以WAL块作为单位,即为XLOG_BLCKSZ字节,通常为8kB。 默认是1MB。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。

wal_skip_threshold (integer)

wal_levelminimal,并且在创建或重写永久关系之后提交事务时,此设置将确定如何保留新数据。 如果数据小于此设置,将其写入 WAL 日志;否则,使用受影响文件的 fsync。 根据存储的属性,如果此类提交减慢了并发事务,提高或降低此值可能会有所帮助。 如果指定此值时没有单位,则视为千字节。默认为两兆字节(2MB)。

commit_delay (integer)

在一次 WAL 刷写被发起之前,commit_delay增加一个时间延迟。 如果系统负载足够高,使得在一个给定间隔内有额外的事务准备好提交,那么通过允许更多事务通过一个单次 WAL 刷写来提交能够提高组提交的吞吐量。 但是,它也把每次 WAL 刷写的潜伏期增加到了最多commit_delay。 因为如果没有其他事务准备好提交,就会浪费一次延迟,只有在当一次刷写将要被发起时有至少 commit_siblings个其他活动事务时,才会执行一次延迟。 另外,如果fsync被禁用,则将不会执行任何延迟。 如果指定值时没有单位,则以微秒作为单位。 默认的commit_delay是零(无延迟)。只有超级用户才能修改这个设置。

PostgreSQL的 9.3 发布之前,commit_delay的行为不同并且效果更差:它只影响提交,而不是所有 WAL 刷写,并且即使在 WAL 刷写马上就要完成时也会等待一整个配置的延迟。从PostgreSQL 9.3 中开始,第一个准备好刷写的进程会等待配置的间隔,而后续的进程只等到领先者完成刷写操作。

commit_siblings (integer)

在执行commit_delay延迟时,要求的并发活动事务的最小数目。大一些的值会导致在延迟间隔期间更可能有至少另外一个事务准备好提交。默认值是五个事务。

19.5.2. 检查点

checkpoint_timeout (integer)

自动 WAL 检查点之间的最长时间。如果指定值时没有单位,则以秒为单位。 合理的范围在 30 秒到 1 天之间。默认是 5 分钟(5min)。增加这个参数的值会增加崩溃恢复所需的时间。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

checkpoint_completion_target (floating point)

指定检查点完成的目标,作为检查点之间总时间的一部分。默认是 0.5。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

checkpoint_flush_after (integer)

当执行检查点时写入的数据量超过此数量时,就尝试强制 OS 把这些写发送到底层存储。 这样做将会限制内核页面高速缓存中的脏数据数量,降低在检查点末尾发出fsync或者 OS 在后台大批量写回数据时被卡住的可能性。 那常常会导致大幅度压缩的事务延迟,但是也有一些情况(特别是负载超过shared_buffers但小于 OS 页面高速缓存)的性能会降低。 这种设置可能会在某些平台上没有效果。 如果指定值时没有单位,则以块为单位,即为BLCKSZ 字节,通常为8kB。 合法的范围在0(禁用强制写回)和2MB之间。Linux 上的默认值是256kB,其他平台上是0(如果 BLCKSZ不是8kB,则默认值和最大值会按比例缩放到它)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。

checkpoint_warning (integer)

如果由于填充WAL段文件导致的检查点之间的间隔低于这个参数表示的时间量,那么就向服务器日志写一个消息(它建议增加max_wal_size的值)。 如果指定值时没有单位,则以秒为单位。默认值是 30 秒(30s)。零则关闭警告。如果checkpoint_timeout低于checkpoint_warning,则不会有警告产生。这个参数只能在 postgresql.conf文件中或在服务器命令行上设置。

max_wal_size (integer)

在自动 WAL 检查点之间允许 WAL 增长到的最大尺寸。这是一个软限制,在特殊的情况下 WAL 尺寸可能会超过max_wal_size, 例如在重度负荷下、archive_command失败或者高的 wal_keep_size设置。 如果指定值时没有单位,则以兆字节为单位。默认为 1 GB。增加这个参数可能导致崩溃恢复所需的时间。 这个参数只能在postgresql.conf 或者服务器命令行中设置。

min_wal_size (integer)

只要 WAL 磁盘用量保持在这个设置之下,在检查点时旧的 WAL 文件总是 被回收以便未来使用,而不是直接被删除。这可以被用来确保有足够的 WAL 空间被保留来应付 WAL 使用的高峰,例如运行大型的批处理任务。 如果指定值时没有单位,则以兆字节为单位。默认是 80 MB。这个参数只能在postgresql.conf 或者服务器命令行中设置。

19.5.3. 归档

archive_mode (enum)

当启用archive_mode时,可以通过设置 ​archive_command​命令将完成的 WAL 段发送到 归档存储。除用于禁用的off之外,还有两种模式: onalways。在普通操作期间,这两种模式之间 没有区别,但是当设置为always时,WAL 归档器在归档恢复 或者后备模式下也会被启用。在always模式下,所有从归档恢复 的或者用流复制传来的文件将被(再次)归档。详见 第 26.2.9 节

archive_modearchive_command是独立的变量,这样可以在不影响归档模式的前提下修改archive_command。这个参数只能在服务器启动时设置。当wal_level被设置为minimal时, archive_mode不能被启用。

archive_command (string)

本地 shell 命令被执行来归档一个完成的 WAL 文件段。字符串中的任何%p被替换成要被归档的文件的路径名, 而%f只被文件名替换(路径名是相对于服务器的工作目录, 即集簇的数据目录)。如果要在命令里嵌入一个真正的%字符,可以使用%%。有一点很重要,该命令只在成功时返回一个零作为退出状态。更多信息请见 第 25.3.1 节

这个参数只能在postgresql.conf文件中或在服务器命令行上设置。除非服务器启动时启用了archive_mode,否则它会被忽略。如果archive_mode被启用时,archive_command是一个空字符串(默认),WAL 归档会被临时禁用,但服务器仍会继续累计 WAL 段文件,期待着一个命令被提供。将archive_command设置为一个只返回真但不做任何事的命令(例如/bin/true或 Windows 上的REM)实际上会禁用归档,也会打破归档恢复所需的 WAL 文件链,因此只有在极少数情况下才能用。

archive_timeout (integer)

archive_command​仅在已完成的 WAL 段上调用。因此,如果你的服务器只产生很少的 WAL 流量(或产生流量的周期很长),那么在事务完成和它被安全地记录到归档存储之间将有一个很长的延迟。为了限制未归档数据存在的时间,你可以设置archive_timeout来强制服务器来周期性地切换到一个新的 WAL 段文件。 当这个参数被设置为大于零时,只要从上次段文件切换后过了参数所设置的时间量,并且已经有过任何数据库活动(包括一个单一检查点),服务器将切换到一个新的段文件(如果没有数据库活动则会跳过检查点)。 注意,由于强制切换而提早关闭的被归档文件仍然与完整的归档文件长度相同。因此,使用非常短的archive_timeout是不明智的 — 它将占用巨大的归档存储。一分钟左右的archive_timeout设置通常比较合理。如果你希望数据能被更快地从主服务器上复制下来,你应该考虑使用流复制而不是归档。如果指定值时没有单位,则以秒为单位。这个参数只能在 postgresql.conf文件中或在服务器命令行上设置。

19.5.4. 归档恢复

本节描述了仅在恢复期间适用的设置。如果您希望执行任何后续恢复,则必须重置它们。

Recovery涵盖使用服务器作为备用服务器或用于执行目标恢复。 通常情况,备用模式用于提供高可用性和/或读可扩展性,而目标恢复用于从数据丢失中恢复。

若要在备用模式下启动服务器,在数据目录中建立名为standby.signal 的文件。 服务器将会进入恢复状态并且在到达归档WAL末尾时不会停止恢复,但将保持尝试继续恢复,通过连接到primary_conninfo设置指定的发送服务器和/或用restore_command获取新的WAL分段。 对于这种模式,来自本节的参数和第 19.6.3 节 是值得关注的。 本文中第 19.5.5 节 中的参数也会被应用,但通常在这种模式下没用。

要启动服务器为目标恢复模式,需在数据目录中建立名为recovery.signal 的文件。 如果同时创建了standby.signalrecovery.signal 文件,则优先使用备用模式。 目标恢复模式在归档的WAL全部回放或到达recovery_target时结束。 在这种模式下,将使用来自本节和本文中  第 19.5.5 节 的参数。

restore_command (string)

用于获取 WAL 文件系列的一个已归档段的本地 shell 命令。这个参数是归档恢复所必需的,但是对于流复制是可选的。 在该字符串中的任何%f会被替换为从归档中获得的文件的名字,并且任何%p会被在服务器上的复制目标路径名替换(该路径名是相对于当前工作目录的,即集簇的数据目录)。 任何%r会被包含上一个可用重启点的文件的名字所替换。 在那些必须被保留用于使得一次恢复变成可重启的文件中,这个文件是其中最早的一个,因此这个信息可以被用来把归档截断为支持从当前恢复重启所需的最小值。 %r通常只被温备配置(见第 26.2 节)所使用。要嵌入一个真正的%字符,需要写成 %%

很重要的一点是,该命令只有在成功时才返回一个为零的退出状态。 该命令会被询问不存在于归档中的文件名,当这样被询问时它必须返回非零。例子:

restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"'  # Windows

一个例外是如果该命令被一个信号(不是SIGTERM,它是数据库服务器关闭的一部分)或者一个 shell 错误(例如命令未找到)终止,则恢复将会中止并且服务器将不会启动。

这个参数只能在服务器启动时被设置。

archive_cleanup_command (string)

这个可选参数指定了一个 shell 命令,它将在每一个重启点被执行。 archive_cleanup_command的目的是提供一种清除不再被后备服务器需要的旧的已归档 WAL 文件的机制。 任何%r会被替换为包含最后一个可用重启点的文件的名称。 那是使一次恢复变成可重启的所必须被保留的最早的文件,并且因此比 %r更早的所有文件可以被安全地移除。 这个信息可以被用来把归档截断为支持从当前恢复重启所需的最小值。 对于单一后备配置,pg_archivecleanup模块常常被用在archive_cleanup_command中,例如:

archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'

但是注意,如果多个后备服务器正在从同一个归档目录中恢复,你将需要保证只有当任意服务器都不再需要 WAL 文件时才会删除它们。 archive_cleanup_command通常被用于一种温后备配置(见第 26.2 节)中。 要在该命令中嵌入一个真正的%字符,需要写成 %%

如果该命令返回一个非零退出状态,则将会写出一个警告日志消息。 一个例外是如果该命令被一个信号或者一个 shell 错误(例如命令未找到)终止,则会抛出一个致命错误。

这个参数只能在 postgresql.conf 文件中设置或通过服务器命令行的方式。

recovery_end_command (string)

这个参数指定了一个将只在恢复末尾被执行一次的 shell 命令。这个参数是可选的。 recovery_end_command的目的是为复制或恢复之后的清除提供一种机制。 与archive_cleanup_command中相似,任何%r会被替换为包含最后一个可用重启点的文件的名称。

如果该命令返回一个非零退出状态,则一个警告日志消息将被写出并且不管怎样该数据库将继续启动。 一个例外是如果该命令被一个信号或者 shell 错误(例如命令未找到)中止,该数据库将不会继续启动。

这个参数只能在 postgresql.conf 文件中设置或通过服务器命令行的方式。

19.5.5. 恢复目标

默认情况下,恢复将会一直恢复到 WAL 日志的末尾。下面的参数可以被用来指定一个更早的停止点。 在recovery_targetrecovery_target_lsnrecovery_target_namerecovery_target_timerecovery_target_xid中, 最多只能使用一个,如果在配置文件中使用了多个,将会产生一个错误。这个参数只能在服务器启动时设置。

recovery_target = 'immediate'

这个参数指定恢复应该在达到一个一致状态后尽快结束,即尽早结束。在从一个在线备份中恢复时,这意味着备份结束的那个点。

在技术上,这是一个字符串参数,但是'immediate'是目前唯一允许的值。

recovery_target_name (string)

这个参数指定(pg_create_restore_point()所创建)的已命名的恢复点,恢复将进入该恢复点。

recovery_target_time (timestamp)

此参数指定恢复将执行的时间戳。精确的停止点还受到​recovery_target_inclusive​得影响。

此参数的值是一个被timestamp with time zone数据类型接受的相同格式的时间戳,只不过你不能使用时区缩写(除非timezone_abbreviations变量在配置文件中已提前设置)。 首选样式是使用 UTC 的数字偏移量,或者你可以写一个完整时区名称,例如 Europe/Helsinki而不是 EEST

recovery_target_xid (string)

这个参数指定恢复将进入的事务 ID。记住虽然事务 ID 是在事务开始时顺序分配的,但是事务可能以不同的数字顺序完成。 那些在指定事务之前(也可以包括该事务)提交的事务将被恢复。精确的停止点也受到​recovery_target_inclusive​的影响。

recovery_target_lsn (pg_lsn)

此参数指定恢复将继续进行的预写日志位置的LSN。精确的停靠点也受 ​recovery_target_inclusive​的影响。 使用系统数据类型pg_lsn解析此参数。

下列选项进一步指定恢复目标,并且影响到达目标时会发生什么:

recovery_target_inclusive (boolean)

指定我们是否仅在指定的恢复目标之后停止(on),或者仅在恢复目标之前停止(off)。 适用于​recovery_target_lsn​、​recovery_target_time​或者 ​recovery_target_xid​被指定的情况。 这个设置分别控制事务是否有准确的目标WAL位置(LSN)、提交时间或事务ID将被包括在该恢复中。默认值为on

recovery_target_timeline (string)

指定恢复到一个特定的时间线中。该值可以是数字时间线 ID 或特殊值。 值current沿着与执行基本备份时相同的时间线恢复。 值latest将恢复到归档中能找到的最新的时间线,这在一个备用服务器中有用。latest是默认的。

你通常只需要在复杂的重恢复情况下设置这个参数,在这种情况下你需要返回到一个状态,该状态本身是在一次时间点恢复之后到达的。 相关讨论见第 25.3.5 节

recovery_target_action (enum)

指定在达到恢复目标时服务器应该立刻采取的动作。默认动作是pause,这表示恢复将会被暂停。 promote表示恢复处理将会结束并且服务器将开始接受连接。 最后,shutdown将在达到恢复目标之后停止服务器。

使用pause设置的目的是:如果这个恢复目标就是恢复最想要的位置,就允许对数据库执行查询。 暂停的状态可以使用pg_wal_replay_resume()(见表 9.87)继续,这会让恢复终结。 如果这个恢复目标不是想要的停止点,那么关闭服务器,将恢复目标设置改为一个稍后的目标并且重启以继续恢复。

要让实例在想要的重放点那里准备好,shutdown设置可以派上用场。 该实例将仍能重放更多 WAL 记录(并且事实上将不得不重放从下一次它被启动后最后一个检查点以来的 WAL 记录)。

注意由于在recovery_target_action被设置为shutdown时,recovery.signal将不会被移除, 任何后续的启动都将会以立刻关闭为终结,除非该配置被改变或者recovery.signal文件被手工移除。

如果没有设置恢复目标,这个设置没有效果。 如果没有启用hot_standbypause设置的动作将和shutdown一样。 如果在升级期间达到恢复目标,pause 的设置将与 promote的行为相同。

在任何情况下,如果已配置了恢复目标,但归档恢复在达到目标之前结束,则服务器将关闭,并出现致命错误。