19.5. 预写日志

有关调整这些设置的其他信息,请参见Section 30.4

19.5.1. Settings

minimal级别,可以安全地跳过一些批量操作的 WAL 日志记录,这可以使这些操作更快(请参见Section 14.4.7)。可以应用此优化的操作包括:

CREATE TABLE AS
CREATE INDEX
CLUSTER
COPY进入在同一事务中创建或截断的表

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

logical级别中,记录的信息与replica相同,另外还包括允许从 WAL 中提取逻辑变更集所需的信息。使用logical级别将增加 WAL 量,特别是如果为REPLICA IDENTITY FULL配置了许多表并且执行了许多UPDATEDELETE语句时。

在 9.6 之前的版本中,此参数还允许值archivehot_standby。这些仍被接受,但已 Map 到replica

虽然关闭fsync通常可以提高性能,但是在断电或系统崩溃的情况下,这可能导致无法恢复的数据损坏。因此,仅当您可以轻松地从外部数据重新创建整个数据库时,才建议关闭fsync

关闭fsync的安全情况的示例包括从备份文件中初始加载新数据库集群,使用数据库集群处理一批数据(此后将丢弃并重新创建数据库)或只读数据库。经常重新创建且不用于故障转移的克隆。单独使用高质量的硬件不足以关闭fsync

为了在将fsync从关闭更改为打开时进行可靠的恢复,必须将内核中所有已修改的缓冲区强制为持久存储。这可以在集群关闭或fsync开启时通过运行initdb --sync-only,运行sync,卸载文件系统或重新引导服务器来完成。

在许多情况下,为非关键事务关闭synchronous_commit可以提供关闭fsync的许多潜在性能优势,而不会带来数据损坏的风险。

只能在postgresql.conf文件或服务器命令行中设置fsync。如果您关闭此参数,也可以考虑关闭full_page_writes

如果synchronous_standby_names为非空,则此参数还控制事务提交是否将 await 其 WAL 记录复制到备用服务器。当设置为on时,提交将一直 await,直到当前同步备用数据库的答复指示他们已接收到事务的提交记录并将其刷新到磁盘。这样可以确保事务不会丢失,除非主备用数据库和所有同步备用数据库都遭受数据库存储损坏。当设置为remote_apply时,提交将一直 await,直到当前同步备用数据库的答复指示他们已接收到事务的提交记录并应用了该记录后,该记录才可在备用数据库上的查询中看到。当设置为remote_write时,提交将一直 await,直到当前同步备用数据库的答复指示它们已接收到事务的提交记录并将其写出到 os 中。即使 PostgreSQL 的一个备用实例崩溃,此设置也足以确保数据保存,但即使备用数据库遭受 os 级崩溃,此设置也足以确保数据保存,因为数据不一定已到达备用数据库上的稳定存储。最后,设置local导致提交 await 本地刷新到磁盘,但不 await 复制。当使用同步复制时,这通常不是所希望的,但出于完整性考虑而提供。

如果synchronous_standby_names为空,则设置onremote_applyremote_writelocal都提供相同的同步级别:事务提交仅 await 本地刷新到磁盘。

该参数可以随时更改。任何一项事务的行为都由提交时生效的设置决定。因此,使某些事务同步提交而其他事务异步提交是可能且有用的。例如,要使单个多语句事务在默认设置相反时异步提交,请在事务内发出SET LOCAL synchronous_commit TO OFF

open_ *选项也使用O_DIRECT(如果有)。并非所有这些选择在所有平台上都可用。默认值为平台支持的上述列表中的第一种方法,但fdatasync是 Linux 上的默认方法。默认值不一定理想。可能有必要更改此设置或系统配置的其他方面,以创建崩溃安全配置或实现最佳性能。这些方面在Section 30.1中讨论。此参数只能在postgresql.conf文件或服务器命令行中设置。

禁用此参数可加快正常操作的速度,但在系统故障后可能会导致不可恢复的数据损坏或静默数据损坏。风险与关闭fsync相似,尽管较小,但应仅根据针对该参数建议的相同情况将其关闭。

禁用此参数不会影响使用 WAL 归档进行时间点恢复(PITR)(请参阅Section 25.3)。

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

如果启用了数据校验和,则将始终对提示位更新进行 WAL 记录,并且将忽略此设置。如果数据库启用了数据校验和,则可以使用此设置来测试将发生多少额外的 WAL 日志记录。

该参数只能在服务器启动时设置。默认值为off

启用此参数可以减少 WAL 量,而不会增加不可恢复的数据损坏的风险,但是以在 WAL 日志记录期间进行压缩以及在 WAL 重放期间进行解压缩上花费一些额外的 CPU 为代价。

WAL 缓冲区的内容在每次事务提交时都会写出到磁盘,因此极大的值不太可能带来显着的好处。但是,将此值设置为至少几个兆字节可以提高繁忙的服务器上的写入性能,该服务器上有许多 Client 端一次提交。在大多数情况下,默认设置为-1 选择的自动调整应该会给出合理的结果。

在 9.3 之前的 PostgreSQL 发行版中,commit_delay的行为有所不同,效果也差得多:它只影响提交,而不影响所有 WAL 刷新,并且即使 WAL 刷新更早完成也要 await 整个配置的延迟。从 PostgreSQL 9.3 开始,准备刷新的第一个进程将 await 配置的时间间隔,而后续进程仅 await 领导者完成刷新操作。

19.5.2. Checkpoints

19.5.3. Archiving

archive_modearchive_command是单独的变量,因此可以在不退出存档模式的情况下更改archive_command。该参数只能在服务器启动时设置。当wal_level设置为minimal时,不能启用archive_mode

此参数只能在postgresql.conf文件或服务器命令行中设置。除非在服务器启动时启用了archive_mode,否则它将被忽略。如果在启用archive_modearchive_command是空字符串(默认值),则将暂时禁用 WAL 归档,但是服务器将 continue 累积 WAL 段文件,以期将很快提供命令。将archive_command设置为仅返回 true 的命令,例如/bin/true(在 Windows 上为REM)有效地禁用了归档,但同时也破坏了存档恢复所需的 WAL 文件链,因此仅应在特殊情况下使用。

上一章 首页 下一章