这个参数是需要设置为on,因为当操作系统crash时,page write可能只是部分完成,导致落盘page包含了混合新旧数据。
PG默认使用8KB的pages
Linux文件系统通常是4KB的pages
硬件存储层,旧的设备使用512B的扇区,新的设备通常使用大的块(4KB或8KB)
所以,当PG写8KB page时,其他存储层可能将这个8KB page切分到更小的块然后分别处理。
这就产生了写原子性的问题。PG的8KB page可能切分成4KB文件系统page,然后再切分成512B的扇区。那么,当服务器宕机时会发生什么?
尽管服务器使用存储系统设计来处理这类故障,但是内核上已经将数据切分成4KB的page。所以,很可能的结果就是数据库写入了8KB的page,但在故障发生前,只有部分数据被成功落盘。
正常情况下,当数据库重新启动后,数据库将读取WAL(从最近完成的检查点开始),然后apply changes来确保数据文件完整。
但是发生了crash,恢复操作不是盲目的进行的,它也需要读取数据pages。
假如发生了部分写(partial write)的情况,这就发生了矛盾,because to fix data corruption we assume there’s no data corruption。
full page writes 来解决这个矛盾,当在检查点之后第一次修改一个page时,这整个page都会被写入WAL。这就保证了当恢复时,第一个WAL记录保留了整个page,从而不必去从datafile读取可能损坏的pages。