↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

11.2. 实现 #

从 7.1 版开始 WAL 自动启用。管理员无需任何操作,只需确保满足 WAL 日志的额外磁盘空间需求,并完成必要的调优(见第 11.3 节)。

WAL 日志存储在目录 $PGDATA/pg_xlog 中,作为一组段文件,每个大小为 16 MB。每个段划分为 8 kB 的页。日志记录头在 access/xlog.h 中描述;记录内容取决于所记录事件的类型。段文件以递增的数字命名,从 0000000000000000 开始。目前数字不会回绕,但用尽可用数字也需要非常长的时间。

WAL 缓冲区和控制结构位于共享内存中,由后端处理;它们由轻量级锁保护。对共享内存的需求取决于缓冲区的数量。WAL 缓冲区的默认大小是 8 个缓冲区、每个 8 kB,共 64 kB。

如果日志与主数据库文件位于不同的磁盘上会更有利。这可以通过把目录 pg_xlog 移到另一个位置(当然要在 postmaster 关闭时)并从 $PGDATA 中的原位置创建指向新位置的符号链接来实现。

WAL 的目标——确保日志在数据库记录被更改之前写入——可能被向内核虚假报告写入成功的磁盘驱动器破坏,而实际上它们只是缓存了数据而尚未存储到磁盘上。这种情况下断电仍可能导致不可恢复的数据损坏。管理员应尽量确保存放 PostgreSQL 日志文件的磁盘不做这样的虚假报告。

11.2.1. 用 WAL 进行数据库恢复 #

做完检查点并刷写日志之后,检查点的位置保存在 pg_control 文件中。因此,进行恢复时,后端先读取 pg_control 和检查点记录;然后从检查点记录所指示的日志位置向前扫描执行 REDO 操作。因为检查点后第一次修改页时数据页的完整内容都保存在日志中,检查点之后更改过的所有页面都将被恢复到一致的状态。

用 pg_control 获取检查点位置可以加快恢复过程,但为了处理 pg_control 可能的损坏,我们其实应该实现以相反顺序——从最新到最旧——读取现有日志段来找到最后一个检查点。这一点尚未实现。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.