pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
WAL 是自动启用的; 管理员无需任何操作, 只需确保满足 WAL 日志的额外 磁盘空间需求, 并完成必要的调优(见 第 25.3 节)。
WAL 日志存储在数据 目录下的 pg_xlog 目录中,作为一组 段文件,每个大小为 16 MB。每个 段划分为 8 kB 的页。日志记录头在 access/xlog.h 中描述;记录内容 取决于所记录事件的 类型。段文件以 递增的数字命名,从 0000000000000000 开始。目前 数字不会回绕,但 用尽可用数字也需要非常长的 时间。
WAL 缓冲区和控制结构位于共享内存中,由服务器子进程处理;它们受轻量级锁保护。对共享内存的需求取决于缓冲区的数量。WAL 缓冲区的默认大小是 8 个缓冲区、每个 8 kB,共 64 kB。
如果能将 WAL 放在与主数据库文件不同的磁盘上,会更有利。这可以通过把 pg_xlog 目录移动到其他位置(当然要在服务器关闭时进行), 然后在主数据目录中的原位置创建一个指向新位置的符号链接来实现。
WAL 的目标——确保日志在 数据库记录被更改之前写入——可能被 向内核虚假报告写入成功的 磁盘驱动器破坏, 而实际上它们只是缓存了数据 而尚未存储到磁盘 上。这种情况下 断电仍可能导致 不可恢复的数据损坏。管理员应尽量确保 存放 PostgreSQL WAL 日志文件的磁盘不做 这样的虚假报告。
在完成检查点并刷写 WAL 之后,该检查点的位置会保存在文件 pg_control 中。因此,在恢复开始时,服务器会先读取 pg_control,再读取检查点记录;然后从检查点记录给出的 WAL 位置向前扫描并执行 REDO。由于检查点之后对数据页的第一次修改,会把整页内 容保存在 WAL 中, 因而自该检查点以来被修改的所有页面都会恢复到一致状态。
用 pg_control 获取检查点 位置可以加快恢复过程,但为了处理 pg_control 可能的 损坏,我们其实应该实现 以相反顺序——从最新到 最旧——读取现有日志段来找到 最后一个检查点。这一点 尚未实现。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。