# 30.6.墙内构件

自动启用WAL;除了确保满足WAL日志的磁盘空间要求,以及完成任何必要的调整外,管理员无需采取任何行动(请参阅第30.5节).

在写入每个新记录时,WAL记录会附加到WAL日志中。插入位置由日志序列号(LSN)描述,LSN是日志中的字节偏移量,随着每个新记录的增加而单调增加。LSN值作为数据类型返回pg_lsn。可以通过比较这些值来计算分隔它们的WAL数据量,因此可以使用它们来衡量复制和恢复的进度。

WAL日志存储在目录中普格沃尔在数据目录下,作为一组段文件,通常每个文件的大小为16MB(但可以通过更改--wal segsizeinitdb选项)。每个段被分成页面,通常每个页面8 kB(这个大小可以通过--大块头配置选项)。日志记录标题如中所述访问/记录。H; 记录内容取决于记录的事件类型。段文件的名称越来越多,从000000010000000000000001.这些数字没有包装,但需要非常、非常长的时间才能用完可用的数字。

如果日志位于与主数据库文件不同的磁盘上,这是有利的。这可以通过移动普格沃尔目录到另一个位置(当然,服务器关闭时),并创建从主数据目录中的原始位置到新位置的符号链接。

WAL的目的是确保在更改数据库记录之前写入日志,但这可能会被磁盘驱动器破坏它错误地报告了对内核的成功写入,而实际上它们只缓存了数据,还没有将其存储在磁盘上。在这种情况下,电源故障可能会导致无法恢复的数据损坏。管理员应尽量确保保存PostgreSQL WAL日志文件的磁盘不会出现此类虚假报告。(见第30.1节.)

创建检查点并刷新日志后,检查点的位置将保存在文件中pg_控制。因此,在恢复开始时,服务器首先读取pg_控制然后是检查点记录;然后,它通过从检查点记录中指示的日志位置向前扫描来执行重做操作。因为数据页的全部内容都保存在检查点(假设满的_页_写未禁用),自检查点以来更改的所有页面将恢复为一致状态。

来处理这个案子pg_控制如果已损坏,我们应该支持以从最新到最旧的相反顺序扫描现有日志段,以便找到最新的检查点。这项计划尚未实施。pg_控制足够小(少于一个磁盘页),因此不会出现部分写入问题,并且截至本文撰写之时,还没有任何报告称数据库故障完全是由于无法读取pg_控制它本身因此,虽然理论上这是一个弱点,pg_控制在实践中似乎不是问题。