【面试题PostgreSQL】full page write 是什么?有什么作用?

1. full page write 简介

full page write 称之为全页写,简称 fpw,在一个 checkpoint 之后页面的第一次修改时,会将该页面整个写入到 wal 日志。

这么做是因为在操作系统崩溃恢复期间正在处理的一次页写入可能只有部分完成,从而导致在一个磁盘页面中混合有新旧数据。在崩溃后的恢复期间,通常存储在 wal 中的行级改变数据不足以恢复这样一个页面。存储完整的页面映像可以保证页面被正确的存储,但是代价是增加了必须被写入 wal 的数据量。

2. 为什么需要 full page write

full page write 是解决所谓的页断裂问题。PostgreSQL 数据页写入是以 page 为单位,默认是使用 8KB 的页面大小。操作系统的文件系统通常使用 4kb 的大小,在硬件级别上,旧的驱动器使用 512B 扇区,新设备可能会以更大的块(4kb 或者 8kb)写入数据。因此,当 PostgreSQL 写 8kb 页面时,存储堆栈的其他层可能会把它分成更小的块,分别管理。这样就产生了原子性的问题。8kb 的 PostgreSQL 页面可以分成两个 4kb 的文件系统页面,然后再分成 512b 扇区。如果在写入期间,服务器崩溃(电源故障、内核错误)那么就可能造成数据库写入了 8kb 的数据页,但是在崩溃前只有部分数据写入了磁盘。

在崩溃恢复时,数据库将读取自上次检查点之后的 wal 日志,并再次应用更改,以确保数据文件修改完成。但是这里有一个问题,恢复并不是盲目地应用修改,它通常需要先读取数据页,此时数据库是假定页面没有被损坏的。这其实是自相矛盾的,因为要修改数据损坏,先假定没有数据损坏。

有了 fpw 就保证了在恢复过程中,接触到一个页面的第一个 wal 记录包含了整个页面,而不需要从数据文件中读取可能被破坏的页面。

文章评论

0条评论