23.pg_wal浅析01
1.PG_WAL?
WAL是一套保证数据完整性的标准。简要地说,WAL中心概念是数据文件(这里涉及到表和索引)修改必须在这些动作被记录之后,即 描述这些修改操作的日志记录被刷到永久存储中。如果我们遵循这个过程,我们不需要在每次事务提交时刷数据页到磁盘,因我我们知道一旦发生崩溃,我们可以使用日志回复数据库,任何还没有被应用到数据页面的改变可以根据其日志记录重做(这是前滚恢复,也被称为REDO)
因为WAL存储在数据库崩溃后的内容,日志文件系统不需要数据文件或者WAL文件的可靠存储。事实上,日志预写回降低性能,特别是日志文件会引起文件系统数据被刷到磁盘中
当数据库中数据发生变更时:
change发生时:先要将变更后内容计入wal buffer中,再将变更后的数据写入data buffer;
commit发生时:wal buffer中数据刷新到磁盘;
checkpoint发生时:将所有data buffer刷新的磁盘。
可以想象,如果没有wal日志,那么数据库中将会发生什么?
首先,当我们在数据库中更新数据时,如果没有wal日志,那么每次更新都会将数据刷到磁盘上,并且这个动作是随机i/o,性能可想而知。并且没有wal日志,关系型数据库中事务的ACID如何保证呢?
因此wal日志重要性可想而知。其中心思想就是:先写入日志文件,再写入数据。
说到checkpoint,我们再来看看哪些情况会触发数据库的checkpoing:
1.手动执行CHECKPOINT命令;
2.执行需要检查点的命令(例如pg_start_backup 或pg_ctl stop|restart等等);
3.达到检查点配置时间(checkpoint_timeout);
4.max_wal_size已满。
其中1和2两点都和数据库的配置无关,我们暂时先不看,这里先介绍下checkpoint_timeout和max_wal_size两个参数
2.参数
- checkpoint_timeout:自动 WAL 检查点之间的最长时间,以秒计。合理的范围在 30 秒到 1 天之间。默认是 5 分钟(5min)。增加这个参数的值会增加崩溃恢复所需的时间。
- max_wal_size:在自动 WAL检查点之间允许WAL 增长到的最大尺寸。这是一个软限制,在特殊的情况 下 WAL 尺寸可能会超过max_wal_size, 例如在重度负荷下、archive_command失败或者高的 wal_keep_segments设置。默认为 1 GB。增加这个参数可能导致崩溃恢复所需的时间变长
- min_wal_size:按照max_wal_size的理解,反过来min_wal_size就是限制pg_wal目录的最小值,也就是限制最少的wal日志文件数量,在数据库空闲的时候,如果pg_wal目录大小低于min_wal_size,数据库将会重用wal日志文件而不是删除。
- wal_segment_size:这个是默认的每个wal日志文件的大小(16M),该值可以在安装是指定
- wal_keep_size(pg13中称wal_keep_segments):
指定保存在pg_wal目录中的过去日志文件段的最小数量,以防备用服务器需要获取它们以进行流复制
- checkpoint_completion_target:指定检查点完成的目标,作为检查点之间总时间的一部分。默认是 0.5。
什么意思呢,假如我的checkpoint_timeout设置是30分钟,而wal生成了10G,那么设置成0.5就允许我在15分钟内完成checkpoint,调大这个值就可以降低checkpoint对性能的影响,但是万一数据库出现故障,那么这个值设置越大数据就越危险。
#wal_segment_size --报告预写日志段的大小。默认值为 16MB #wal_keep_segments --指定保存在pg_wal目录中的过去日志文件段的最小数量,以防备用服务器需要获取它们以进行流复制。pg13改为wal_keep_segments #checkpoint_completion_target = 0.5 --指定检查点完成的目标,作为检查点之间总时间的一部分。默认值为 0.5 #checkpoint_timeout=300 --自动 WAL 检查点之间的最长时间。如果指定此值没有单位,则以秒为单位。有效范围在 30 秒到 1 天之间。默认值为五分钟 ( 5min)。 #max_wal_size = 1GB --最大不超过这个值 ,在自动检查点期间让 WAL 增长的最大大小。这是一个软限制;WAL 大小max_wal_size在特殊情况下可能会超出,例如重负载、失败archive_command或高wal_keep_segments设置。如果此值指定为不带单位,则以兆字节为单位。默认值为 1 GB。 #min_wal_size = 80MB --最小保留这个值,只要 WAL 磁盘使用率低于此设置,旧的 WAL 文件总是在检查点被回收以供将来使用,而不是被删除。这可用于确保保留足够的 WAL 空间来处理 WAL 使用中的峰值,例如在运行大型批处理作业时。如果此值指定为不带单位,则以兆字节为单位。默认值为 80 MB。
参考:max_wal_size/min_wal_size参数理解和作用测试 - PostgreSQL数据库 - 晟数学苑 - 学习塑造未来 (sandata.com.cn)