3 WAL WRITE AHEAD LOG
3.1 Settings
3.1.1 fsync
字符串
默认: fsync = on
开启后强制把数据同步更新到磁盘,可以保证数据库将在OS或者硬件崩溃的后恢复到一个一致的状态。
虽然关闭,可以提升数据库性能,但无法保证数据库崩溃后数据一致性。
通常情况下需要打开这个参数,除非能经受掉电或硬件故障带来的数据丢失,否则不要关闭。
3.1.2 wal_level
字符型
默认: wal_level = replica ,minimal、replica、logical三选一
重启数据库生效
预写日志模式
minimal是仅写入崩溃或者突发关机时所需要的信息
replica增加wal归档信息,包括只读服务器需要的信息。(9.6中新增,将之前版本的 archive 和 hot_standby 合并)
logical主要用于logical decoding场景
在写入频繁的场景中,会产生大量的WAL日志,而且WAL日志量会远远超过实际更新的数据量。叫做“WAL写放大”。
造成WAL写放大的主要原因有2点。
1、在checkpoint之后第一次修改页面,需要在WAL中输出整个page,即全页写(full page writes)。全页写的目的是防止在意外宕机时出现的数据块部分写导致数据库无法恢复。
2、更新记录时如果新记录位置(ctid)发生变更,索引记录也要相应变更,这个变更也要记入WAL。更严重的是索引记录的变更又有可能导致索引页的全页写,进一步加剧了WAL写放大。
过量的WAL输出会对系统资源造成很大的消耗,因此需要进行适当的优化。
1. 磁盘IO:WAL写入是顺序写,通常再差的硬盘对付WAL的写入速度也是绰绰有余。所以一般可以忽略。
2. 网络IO:对局域网内的复制估计还不算问题,远程复制就难说了。
3. 磁盘空间:如果做WAL归档,需要的磁盘空间也是巨大的。
版本小于或等于9.6的配置为:
minimal是仅写入崩溃或者突发关机时所需要的信息(不建议使用)。
archive是增加wal归档所需的日志(最常用)。
hot_standby是在备用服务器上增加了运行只读查询所需的信息,一般实在流复制的时候使用到。
3.1.3 wal_buffers
数字型
默认: wal_buffers = -1 ,最小值32kB,-1表示和shared_buffers共用。
重启数据库生效
用于存放WAL数据的内存空间(日志缓存区的大小)。最小32K。
执行一个大事务肯定受到影响,应该适当的增大该参数,降低IO。
如果比较多的并发短事务,应该考了设置commit_delay、commit_siblings。
3.1.4 wal_writer_delay
数字型
默认: wal_writer_delay = 200ms ,取值范围1-10000ms