pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
有若干影响数据库性能的与 WAL 相关的 参数。本节说明它们的用法。 设置配置参数的详情请 查阅 第 3.4 节。
有两个常用的 WAL 函数: LogInsert 和 LogFlush。 LogInsert 用于把一条新记录放入 共享内存中的 WAL 缓冲区。如果 没有空间放新记录,LogInsert 就 不得不写出(移入内核缓存)几个已满的 WAL 缓冲区。这并 不理想,因为 LogInsert 在每次数据库低层修改(例如 元组插入)时都会被使用,而那时 受影响的数据页上正持有排他锁, 该操作应当尽可能 快;更糟的是,写出 WAL 缓冲区还 可能引发创建新的日志段,这需要 更多 时间。正常情况下,WAL 缓冲区应当由 LogFlush 请求写出并 刷写,该请求大部分 在事务提交时发出,以确保 事务记录被刷写到永久存储。在日志 输出很高的系统上,LogFlush 请求 可能不够频繁,无法阻止 WAL 缓冲区被 LogInsert 写出。在这样的系统上, 应当通过修改 WAL_BUFFERS 参数来增加 WAL 缓冲区的数量。WAL 缓冲区的默认 数量是 8。增大这个值 将影响共享内存的使用。
检查点 是事务序列中 保证数据文件已用检查点之前记录的 所有信息更新过的点。在 检查点时刻,所有脏数据页被刷写到磁盘, 并向日志文件写入一条 特殊的检查点记录。结果是,一旦 发生崩溃,恢复者就知道应从日志中的 哪条记录(称为重做记录)开始 REDO 操作,因为在该记录之前 对数据文件所做的任何更改都已在 磁盘上。做完检查点之后,重做 记录之前写入的任何日志段都会被 删除,因此检查点也被用来释放 WAL 目录中的磁盘 空间。(当实现了基于 WAL 的 BAR 时, 日志段可以被归档而不仅仅是 删除。)检查点生成器还能为 将来的使用创建几个日志段,以避免 LogInsert 或 LogFlush 花时间创建它们。
WAL 日志以一组称为 段 的 16 MB 文件的形式 保存在磁盘上。默认 情况下,只有当前段用了超过 75% 时才创建 新段。可以通过修改配置参数 WAL_FILES 让服务器 在检查点时预创建最多 64 个 日志段。
为了崩溃后恢复更快,更频繁地 创建检查点会更好。但应把这与 刷写脏数据页的 成本相权衡;此外,为确保 数据页一致性,每个 检查点后对数据页的第一次修改会导致 记录整个页面内容,从而 增加日志输出和日志的大小。
postmaster 每隔一段时间派生一个专门的 后端进程来创建下一个检查点。每 CHECKPOINT_SEGMENTS 个日志段 或每 CHECKPOINT_TIMEOUT 秒 (以先到者为准)创建一个 检查点。默认设置分别是 3 段和 300 秒。 也可以用 SQL 命令 CHECKPOINT 强制 检查点。
The COMMIT_DELAY parameter defines for how many microseconds the backend will sleep after writing a commit record to the log with LogInsert but before performing a LogFlush. This delay allows other backends to add their commit records to the log so as to have all of them flushed with a single log sync. No sleep will occur if fsync is not enabled or if fewer than COMMIT_SIBLINGS other backends are not currently in active transactions; this avoids sleeping when it's unlikely that any other backend will commit soon. 注意在大多数平台上,休眠请求的 分辨率是十毫秒,因此 1 到 10000 微秒之间的任何非零 COMMIT_DELAY 设置效果都 相同。
WAL_SYNC_METHOD 参数决定 Postgres 如何要求内核把 WAL 更新强制写到磁盘。 All the options should be the same as far as reliability goes, but it's quite platform-specific which one will be the fastest. Note that this parameter is irrelevant if FSYNC has been turned off.
把 WAL_DEBUG 参数设为任何非零 值将导致每次 LogInsert 和 LogFlush 的 WAL 调用都被 记录到标准错误。目前, 非零值具体是什么没有 区别。这个选项将来可能被 更通用的机制取代。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。