一、全页写的概述与特点
在PostgreSQL(十一)WAL日志管理中曾提到过,PG默认记录WAL日志的方式,是将原始SQL转换为特定格式后记录在文件中。
但实际上,pg还支持另一种记录WLA日志的方式,那就是全页写-full-page Writes。
全页写模式下,会将一整个数据块的内容写入 WAL文件中,而非只记录日志条目。
1、优点:解决块分离问题,保护数据完整性;
2、缺点:全页写会导致WAL日志膨胀,增加额外I/O,影响数据库整体性能;
3、控制:使用full_page_writes参数控制on/off .
4、模式:
非强制模式:最后一次检查点之后,第一次修改的数据块会进行全页写,后续再修改时不会进行全页写,直到下一次检查点发生。full_page_writes=on后进入非强制模式。
强制模式:当使用pg_basebackup工具对数据库进行备份时,会自动执行强制模式,在备份期间被修改的数据库会全部写入WAL当中;
当执行pg_start_backup函数时,系统也会进入全页写模式,执行pg_stop_backup后停止。
二、导致块分离的原因
操作系统进行I/O操作时,以块为单位,例如:512字节、1kb等;
而数据库块一般是操作系统块的整数倍,比如2kb、4kb、8kb等;
因为块是操作系统最小的I/O单位,当数据库写一个数据块时,操作系统需要I/O多次,才能全部写完;
假如在I/O过程中系统断电、磁盘故障等原因,会导致一个数据库的数据块没有完整的写入,从而导致块分离。
三、全页写管理
以下情况可以考虑禁用全页写:
1、数据库有完整的备份;
2、优先考虑数据库整体性能;
3、选择能够阻止部分页面写入的文件系统(比如ZFS)。