本文档介绍了系统配置参数中 预写式日志类别的相关参数。
注意!
为确保系统稳定与安全,请务必谨慎手动修改相关参数。
在一次 WAL 刷写被发起之前,commit_delay
增加一个时间延迟(以微秒为单位)。
commit_delay
。 因为如果没有其他事务准备好提交,就会浪费一次延迟,只有在当一次刷写将要被发起时有至少 commit_siblings
(见下文) 个其他活动事务时,才会执行一次延迟。 fsync
被禁用,则将不会执行任何延迟。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ 100000 | master;session;reload;superuser |
在执行 commit_delay
延迟时,要求的并发活动事务的最小数目。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 5 | 0 ~ 1000 | master;session;reload |
当这个参数为 on
时,YMatrix 服务器在一个检查点(Checkpoint)之后,在页面的第一次修改期间会将每个页面的全部内容写到 WAL 中。
fsync
, 但是风险较小。并且只有在可关闭 fsync
的情况下才应该关闭它。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;system;reload |
如果打开这个参数,YMatrix 服务器将尝试确保更新被物理地写入到磁盘,做法是发出 fsync()
系统调用或者使用多种等价的方法(见下文 wal_sync_method
)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。
initdb --sync-only
而打开时、运行 sync 时、卸载文件系统时或者重启服务器时。full_page_writes
(见上文)。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;system;reload |
指定同步级别。即在命令返回 success
指示给客户端之前,一个事务是否需要等待 WAL 记录被写入磁盘。
on
。当设置为 off
时,在向客户端报告成功和真正保证事务不会被服务器崩溃威胁之间会有延迟(最大的延迟是 wal_writer_delay
的三倍)。不同于 fsync,将这个参数设置为 off
不会产生数据库不一致性的风险:一个操作系统或数据库崩溃可能会造成一些最近已提交的事务丢失,但数据库状态与这些事务已经被完全中止是一样的。因此,当性能比完全确保事务的持久性更重要时,关闭 synchronous_commit
可以作为一个有效的代替手段。on
时,直到当前同步的 Standby 服务器收到事务提交记录的回复,并将其刷入了磁盘,主服务器上的事务才会提交。这保证事务将不会被丢失,除非主服务器和所有同步 Standby 的数据库存储均出现损坏。remote_apply
时,提交将会等待,直到来自当前的同步 Standby 的回复指示它们已经收到了该事务的提交记录并且已经应用了该事务,该事务才会对 Standby 上的查询可见。remote_write
时,提交将等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经把该记录写出到其操作系统。这种设置足以保证数据在 Standby 服务器的 YMatrix 实例崩溃时得以保存,但是不能保证 Standby 服务器遭受操作系统级别崩溃时数据能被保存,因为数据不一定必须要在 Standby 机上达到稳定存储。local
会导致提交等待本地刷写到磁盘而不是复制完成。在使用同步复制时这通常不是我们想要的效果,但是为了完整性,还是提供了这样一个选项。synchronous_standby_names
为空,设置 on
、remote_apply
、remote_write
和 local
都提供了同样的同步级别:事务提交只等待本地刷写磁盘。参数值 | 本地持久性提交 | YMatrix 崩溃后 Standby 持久性提交 | 操作系统崩溃后 Standby 持久性提交 | Standby 查询一致性 |
---|---|---|---|---|
remote_apply | Y | Y | Y | Y |
on | Y | Y | Y | |
remote_write | Y | Y | ||
local | Y | |||
off |
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | on | on / off / true / false / yes / no / 1 / 0 / remote_apply / remote_write / local | segments;session;reload |
用于还未写入磁盘的 WAL 数据的共享内存量(以 WAL 块作为单位,即为 XLOG_BLCKSZ 字节)。
-1
选择等于 shared_buffers 的 1/32 的尺寸(大约 3%),但是不小于 64KB
也不大于 WAL 段的尺寸(通常为 16MB
)。32KB
的正值都将被当作 32KB
。wal_buffers
值是不可能提供显著的收益的。不过,把这个值设置为几个兆字节可以在一个繁忙的服务器(其中很多客户端会在同一时间提交)上提高写性能。-1
选择的自动调节在绝大部分情况下都可得到合理的结果。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | -1 | -1 ~ INT_MAX/XLOG_BLCKSZ | segments;system;restart |
允许全页写的压缩操作。
on
时,如果 full_page_writes
也为 on
或者处于基础备份期间,YMatrix 服务器会压缩写入到 WAL 中的完整页面镜像。压缩页面镜像将在 WAL 重放时被解压。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | segments;session;reload;superuser |
当此参数被设置为 on
,则会以 0 填充新的 WAL 文件。
off
,当文件被创建时只有最后的字节会被写入,因此它会拥有一个预期的尺寸。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;session;reload;superuser |
此参数决定多少信息写入到 WAL 中。
replica
,它会写入足够的数据以支持 WAL 归档和复制,包括在后备服务器上运行只读查询。minimal
会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录。最后,logical
会增加支持逻辑解码所需的信息。每个层次包括所有更低层次记录的信息。minimal
级别中,某些批量操作的 WAL 日志可以被安全地跳过,这可以使那些操作更快。这种优化可以应用的操作包括:CREATE TABLE AS
、
CREATE INDEX
、
CLUSTER
、
COPY
到在同一个事务中被创建或截断的表中。replica
或更高级别。logical
层,与 replica
相同的信息会被记录,外加的信息需要允许从 WAL 抽取逻辑修改集获取。使用级别 logical
将增加 WAL 容量,特别是如果为了 REPLICA IDENTITY FULL
配置了很多表并且执行了很多 UPDATE
和 DELETE
语句时。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | replica | replica / minimal / logical | segments;system;restart |
对非关键更新同样执行全页写操作。
on
时,YMatrix 服务器会在一个检查点之后,在页面被第一次修改期间把该磁盘页面的全部内容都写入 WAL,即使对所谓的提示位做非关键修改时也会这样做。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | segments;system;restart |
循环利用 WAL 文件。
on
,WAL 文件会以重命名的方式被循环利用,以避免创建新的文件。数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;session;reload;superuser |
用来向强制 WAL 更新到磁盘的方法。
open_datasync
(用 open()
选项 O_DSYNC
写 WAL 文件)、fdatasync
(在每次提交时调用 fdatasync()
)、fsync
(在每次提交时调用 fsync()
)、fsync_writethrough
(在每次提交时调用 fsync()
,强制任何磁盘写高速缓存的直通写)、open_sync
(用 open()
选项 O_SYNC
写 WAL 文件)open_*
选项也可以使用 O_DIRECT
(如果可用)。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | fsync / fdatasync(default on Linux) | open_datasync / fdatasync / fsync / fsync_writethrough / open_sync | segments;system;reload |
指定 WAL 写入器刷写 WAL 的频繁程度,以时间(ms)为单位。
wal_writer_delay
所给出的时间长度进行睡眠(除非被一个异步提交的事务提前唤醒)。wal_writer_delay
之前,并且小于 wal_writer_flush_after
WAL 的值产生之后,那么 WAL 只会被写入操作系统,而不会被刷写到磁盘。wal_writer_delay
设置为一个不是 10 的倍数的值,其效果和把它设置为大于该值的下一个 10 的倍数产生的效果相同。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 200 | 1 ~ 10000 | segments;system;reload |
指定 WAL 写入器刷写 WAL 的频繁程度(以 WAL块 作为单位,即为 XLOG_BLCKSZ 字节)。
wal_writer_delay
之前,并且小于 wal_writer_flush_after
WAL 的值产生之后,那么 WAL 只会被写入操作系统,而不会被刷写到磁盘。wal_writer_flush_after
被设置为 0
,则 WAL 数据总是会被立即刷写。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 1048576/XLOG_BLCKSZ | 0 ~ INT_MAX | segments;system;reload |
检查点目标时长。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
floating point | 0.5 | 0.0 ~ 1.0 | segments;system;reload |
当执行检查点时写入的数据量超过此参数(以 BLOCKS 为单位)时,就尝试强制操作系统(OS)把这些写发送到底层存储。
fsync
或者 OS 在后台大批量写回数据时被卡住的可能性。0
,则禁用强制写回。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ 256 | segments;system;reload |
自动 WAL 检查点之间的最长时间(以秒为单位)。
30 ~ 86400
(即 60天)。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 300 | 30 ~ 86400 | segments;system;reload |
如果由于填充 WAL 段文件导致的检查点之间的间隔低于这个参数表示的时间量(s),那么就向服务器日志写一个消息(意味着应增加 max_wal_size
的值)。
0
则关闭警告。如果 checkpoint_timeout
低于此参数的值,则不会有警告产生。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 30 | 0 ~ INT_MAX | segments;system;reload |
在自动 WAL 检查点之间允许 WAL 增长到的最大尺寸(以 MB 为单位)。
max_wal_size
,例如在重度负荷下、archive_command
失败或者高的 wal_keep_segments
设置。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 4096 | 2 ~ INT_MAX/1024 | segments;system;reload |
在自动 WAL 检查点之间允许 WAL 的最小尺寸(MB)。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 320 | 2 ~ INT_MAX/1024 | segments;system;reload |
用于归档一个完成 WAL 文件的 Segment 的本地 shell 命令。
%p
占位符需要被替换成要 被归档文件的路径,而 %f
需要替换为文件名(路径为集群的数据目录)。如果要在命令里嵌入一个真正的 %
字符,可以使用 %%
。例如:'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
0
作为退出状态。archive_mode
,否则它会被忽略。如果 archive_mode
被启用时,archive_command
是一个空字符串(默认),WAL 归档会被临时禁用,但服务器仍会继续累计 WAL 段文件,期待着一个命令被提供。archive_command
设置为一个只返回 true 但不做任何操作的命令(例如 /bin/true
或 Windows 上的 REM
)实际上会禁用归档,也会打破归档恢复所需的 WAL 文件链,因此只有在极少数情况下才能用。数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;reload |
当启用 archive_mode
时,可以通过设置 archive_command
命令将完成的 WAL 段发送到归档存储。
off
之外,还有两种模式: on
和 always
。在普通操作期间,这两种模式之间没有区别,但是当设置为 always
时,WAL 归档器在归档恢复或者后备模式下也会被启用。在 always
模式下,所有从归档恢复的或者用流复制传来的文件将被(再次)归档。archive_mode
和 archive_command
是独立的变量,这样可以在不影响归档模式的前提下修改 archive_command
。wal_level
(见上文) 被设置为 minimal
时,archive_mode
不能被启用。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | off | off / on / always | segments;system;restart |
在超过此参数值时间量(以秒为单位)后,强制切换到一个新的 WAL 段文件。
archive_command
仅在已完成的 WAL 段上调用。因此,如果你的服务器只产生很少的 WAL 流量(或产生流量的周期很长),那么在事务完成和它被安全地记录到归档存储之间将有一个很长的延迟。为了限制未归档数据存在的时间,你可以设置 archive_timeout
来强制服务器来周期性地切换到一个新的 WAL 段文件。archive_timeout
是不明智的 — 它将占用巨大的归档存储。一分钟左右的 archive_timeout
设置通常比较合理。0
,即禁用此功能。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX/2 | segments;system;reload |
此部分参数只用于恢复模式。如果您希望执行任何后续恢复操作,则必须重置它们。
“Recovery” 涵盖使用服务器作为备用(Standby)服务器或用于执行目标恢复。通常情况,备用模式用于提供高可用性和/或读的可扩展性,而目标恢复用于从数据丢失中恢复。
若要在备用模式下启动服务器,在数据目录中建立名为 standby.signal
的文件。服务器将会进入恢复状态,且在已归档的 WAL 结束时也不会停止恢复状态,而是会通过连接到 primary_conninfo
设置指定的发送服务器和/或用 restore_command
获取新的 WAL 分段来尝试继续保持此状态。
要启动服务器为目标恢复模式,需在数据目录中建立名为 recovery.signal
的文件。 如果同时创建了 standby.signal
和 recovery.signal
文件,则优先使用备用模式。目标恢复模式在归档的 WAL 全部回放或到达 recovery_target
时结束。
指定在每个重启点执行的 shell 命令。
%r
会被替换为包含最后一个可用重启点的文件的名称。这是使一次恢复变成可重启的所必须被保留的最早的文件,因此比 %r
更早的所有文件可以被安全地移除。要在该命令中嵌入一个真正的 %
字符,需要写成 %%
。这个信息可以被用来把归档截断为支持从当前恢复重启所需的最小值。对于单个后备配置,pg_archivecleanup
模块常常被用在 archive_cleanup_command
中,例如:archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
。数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;reload |
指定恢复完成时被执行一次的 shell 命令。
archive_cleanup_command
中相似,任何 %r
会被替换为包含最后一个可用重启点的文件的名称。数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;reload |
用于获取使用 WAL 文件系列的一个已归档段的本地 shell 命令。
%p
占位符会被替换成要被归档文件的路径,而 %f
会被替换为文件名(路径为集群的数据目录)。如果要在命令里嵌入一个真正的 %
字符,可以使用 %%
。 任何 %r
会被替换为包含上一个可用重启点的文件的名字。例如:'cp /mnt/server/archivedir/%f %p'
。restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;restart |
此部分参数仅在进行定向恢复操作时设置。默认情况下,恢复将会一直恢复到 WAL 日志的末尾。此部分参数可以被用来指定一个更早的停止点。
注意!
在recovery_target
、recovery_target_lsn
、recovery_target_name
、recovery_target_time
和recovery_target_xid
中,最多只能使用一个,如果在配置文件中使用了多个,将会产生一个错误。
这个参数指定恢复在达到一致状态后尽快结束。
immediate
是目前唯一允许的值。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
string | immediate | segments;system;restart |
指定在达到恢复目标时服务器应该立刻采取的动作。
pause
,表示恢复将会被暂停。promote
表示恢复将会结束随后服务器将开始接受连接。shutdown
表示将在达到恢复目标之后停止服务器。pause
设置的目的是:如果这个恢复目标就是恢复最想要的位置,就允许对数据库执行查询。暂停的状态可以使用 pg_wal_replay_resume()
继续,这会让恢复终结。如果这个恢复目标不是想要的停止点,那么关闭服务器,将恢复目标设置改为一个稍后的目标并且重启以继续恢复。shutdown
设置可以派上用场。该实例将仍能重放更多 WAL 记录(并且事实上将不得不重放从下一次它被启动后,从最后一个检查点到当前的 WAL 记录)。recovery_target_action
被设置为 shutdown
时,recovery.signal
将不会被移除,任何后续的启动都将会以立刻关闭为终结,除非该配置被改变或者 recovery.signal
文件被手工移除。hot_standby
,pause
设置的动作将和 shutdown
一样。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
enum | pause | pause / promote / shutdown | segments;system;restart |
指定是否仅在指定的恢复目标之后停止(on),或者仅在恢复目标之前停止(off)。
recovery_target_lsn
、recovery_target_time
或者 recovery_target_xid
被指定的情况。| 数据类型 | 默认值 | 设置分类 | | --- | --- | --- | --- | | boolean | on | segments;system;restart |
此参数指定恢复将继续进行的 WAL LSN。
recovery_target_inclusive
(见上文)的影响。数据类型 | 默认值 | 设置分类 |
---|---|---|
pg_lsn | segments;system;restart |
指定(pg_create_restore_point()
所创建)的已命名的恢复点,恢复将进入该恢复点。
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;restart |
此参数指定恢复将执行的时间戳。
recovery_target_inclusive
(见上文)的影响。数据类型 | 默认值 | 设置分类 |
---|---|---|
timestamp | segments;system;restart |
指定恢复到一个特定的时间线中。
current
沿着与执行基本备份时相同的时间线恢复;值 latest
将恢复到归档中能找到的最新的时间线,这在一个备用服务器中有用。数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
string | latest | current / latest / Timeline ID | segments;system;restart |
这个参数指定恢复将进入的事务 ID。
recovery_target_inclusive
(见上文)的影响。数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;restart |