数据库避免数据部分写入的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
核心
1、当一系列机制触发数据缓冲池中的脏页刷新时,并不直接写入磁盘数据文件中,而是先拷贝至内存中的doublewrite buffer中;
2、接着从两次写缓冲区分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB;
3、待第二步完成后,再将doublewrite buffer中的脏页数据写入实际的各个表空间文件(离散写);(脏页数据固化后,即进行标记对应doublewrite数据可覆盖)
理解
数据先顺序写入到一个临时文件,确认成功后,再将临时文件【随机】转存到正式数据空间。
总结
FULL_PAGE_WRITES 每次都要保存一份原始的完整数据,增加了总量。
double write,只记录变动,但需要二次写入(Double), 多了一次磁盘IO。
从整体看,double write更适合大数据量写入