数据库避免数据部分写入的FULL_PAGE_WRITES和double write机制个人理解

数据库避免数据部分写入的FULL_PAGE_WRITES和double write机制个人理解

参考

http://blog.chinaunix.net/uid-20726500-id-5105905.html
https://www.cnblogs.com/geaozhang/p/7241744.html

FULL_PAGE_WRITES

核心

PostgreSQL引入了fullpagewrites,checkpoint后的第一次页面修改将完全的页内容记录到WAL,之后从上次的checkpoint点开始恢复时,先取得这个完成的页面内容然后再在其上重放后续的修改操作。

理解

写入前,将整个原始页面全部留一个副本,然后做对应的修改并记录REDO日志。 恢复时,WAL里有完整的原始内容,根据checkpoint重做就行了。

double write

double write 示意图

核心

1、当一系列机制触发数据缓冲池中的脏页刷新时,并不直接写入磁盘数据文件中,而是先拷贝至内存中的doublewrite buffer中;

  2、接着从两次写缓冲区分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB;

  3、待第二步完成后,再将doublewrite buffer中的脏页数据写入实际的各个表空间文件(离散写);(脏页数据固化后,即进行标记对应doublewrite数据可覆盖)

理解

数据先顺序写入到一个临时文件,确认成功后,再将临时文件【随机】转存到正式数据空间。

总结

FULL_PAGE_WRITES 每次都要保存一份原始的完整数据,增加了总量。

double write,只记录变动,但需要二次写入(Double), 多了一次磁盘IO。

从整体看,double write更适合大数据量写入