9.2. 实现

在版本 7.1 以后,WAL 是自动打开的. 除了要求一些额外的磁盘空间存放 WAL 日志以及一些必要的调节以外(参阅Section 9.3) ,对管理员没有什么其他要求,

WAL 日志存放在 $PGDATA/pg_xlog 目录里,它是作为一个文件段的集合存储的,每个段 16 MB 大. 每个段分割成 8 kB 的页.日志记录头在 access/xlog.h 里描述;日志内容取决于 它记录的事件的类型.段文件的名字是自然数,从 0000000000000000开始.目前这些数字不能循环使用, 不过要把所有可用的数字都用光也需要非常长的时间.

WAL 的缓冲区和控制结构在共享内存里, 并且由后端操纵;它们是用自旋锁保护的.对共享内存的需求 由缓冲区数量决定;缺省的 WAL 缓冲区大小是 64 kB.

日志位于和主数据库文件不同的另外一个磁盘上会比较好. 你可以通过把pg_xlog目录移动到另外 一个位置( postmaster 当然得关闭),然后在 $PGDATA 里原来的位置创建一个 指向新位置的符号链接来实现.

WAL 的目的是确保在数据库记录被修改之前, 先写了日志,但是这个目的有可能被那些向内核谎报成功写的 磁盘驱动器破坏,这时候,它们实际上只是缓冲了数据而并未把数据 存储到磁盘上.这种情况下的电源失效仍然可能导致不可恢复的数据崩溃; 管理员应该确保保存 PostgreSQL 的数据 和日志文件的磁盘不会做这种虚假汇报.

9.2.1. 用 WAL 进行数据库恢复

在完成一个检查点并且日志文件冲刷了之后,检查点的位置保存在了文件 pg_control 里.因此在需要做恢复的时候, 后端首先读取 pg_control 和检查点记录; 然后它读取 redo 记录,redo 记录的位置保存在检查点里, 然后开始 REDO 操作.因为页面的所有内容都保存在日志里检查点后面 第一个修改的页面里,所以这些页面将首先恢复成一致的状态.

pg_control 获取检查点位置可以加快恢复 进程的速度,但是为了处理 pg_control 可能 的损坏,我们实际上应该实现对现存的日志段的反向读取顺序 -- 从最新到最老 -- 这样才能找到最后的检查点.这些在版本 7.1 中 还没有做完.