PostgreSQL WAL 日志发展史 - pg7

文章目录

一、pg7.1 开天辟地

7.1 是 PostgreSQL 国际社区文档中提供详细资料的第一个版本,因为够完整也够简单,所以选择从 pg7.1 开始介绍

上图描述了 wal 日志的本职工作,PostgreSQL 在执行数据修改操作时,修改的数据在写入磁盘前要先将修改的内容写入 wal 日志,如此就可以不必时时地将共享缓存中的数据刷新到磁盘中,这样做的目的是以 wal 日志的顺序写入代替数据文件的随机写入来提升性能,如果数据库发生崩溃,可以从 wal 日志获取共享缓存中未写入磁盘的数据

1、WAL_BUFFERS

wal 日志缓冲区大小,用于减少磁盘 I/O 次数,提升性能

注意:

  • COMMIT 操作会触发一次对 wal_buffers 的强制刷盘,为了保证 ACID 中的 "D"(Durability,持久性),确保数据不会因系统崩溃而丢失,而且这还是一个同步(synchronous_commit)操作,会短暂阻塞事务直到 I/O 完成
  • XLOG_BLCKSZ(wal 日志基本单位)不是一个 GUC 参数,一般是编译数据库时通过 configure 命令指定,pg11(包含)之后,可以通过 initdb 命令指定

2、FSYNC

确保 wal 日志,或者其他数据文件安全写入磁盘

3、WAL_SYNC_METHOD

这个参数是对fsync参数的补全,它指定了保证数据写入持久化存储的方法。

4、COMMIT_DELAY & COMMIT_SIBLINGS

我们知道 COMMIT 操作会触发一次对 wal_buffers 的强制刷盘,期间 PostgreSQL 又做了一点小动作来提升性能:

  • commit_delay:事务提交后允许 wal 缓存延迟刷写的时间,这个延迟的目的是想等一下并行执行的兄弟事务,等兄弟事务完成提交后,一起将 wal 日志刷盘,如果兄弟事务超过 commit_delay 时间还未提交,那么当前进程就完成 wal 日志刷写
  • commit_siblings:当前事务做这个等待的条件,如果并行执行的兄弟事务小于 commit_siblings,那当前事务就不做等待了

可能文字描述比较难懂,举个例子:小明(事务)放学(提交)要打车回家(刷盘),他发现有顺路的其他班级的同学(兄弟事务)没有放学,就想等几个人一起平摊打车的费用,结果发现在上课的同学太少了(commit_siblings),就想等这么长时间省这么点钱不划算,就自己走了(刷磁);发现还在上课的同学很多,就想等一段时间(commit_delay)吧,等到这个时间长度带上下课的同学就走

注意:pg8.3 增加了可以定时刷写 wal 日志的进程 walwriter,该策略也因此改变

5、WAL_DEBUG

开启 wal debug 的参数,可以不用关注它

6、WAL_FILES

  • > 0:做检查点时会预先创建 wal_files 数量的 wal 段备用
  • = 0:会一个一个地创建 wal 段

注意:pg7.3 删除了该参数,改为另一种 wal 日志的预生成方法

7、CHECKPOINT_TIMEOUT

PostgreSQL 执行一次 checkpoint 的时间间隔,该参数跟 wal 关系没那么大,因为与下面的参数 checkpoint_segment 有相似的功能,都是触发 checopint 的时机,所以也写到了这里

8、CHECKPOINT_SEGMENT

PostgreSQL 执行一次 checkpoint 的 wal 段间隔,从上一次 checkpoint 开始,PostgreSQL 在写了一定数量的 wa l段后,会再次触发 checkpoint

二、pg7.3 改变 wal 预生成方式

此版本在 pg7.1 基础上做了微小的改变,主要是改变了预生成 wal 段的方法

checkpoint 时不再预生成 wal 段,改为了新的策略维护 wal 生成目录中的 wal 段:

  1. wal 段的数量原则上不超过 2 * checkpoint_segments + 1
  2. 一个流量高峰可能会导致 backend 极速生成 wal 日志,可能会将 wal 段数量增加到 2 * checkpoint_segments + 1 以上
  3. 做检查点时,如果 wal 段数量超限,会将超限的 wal 段删除, 如果 wal 段数量不超限,会将旧的 wal 段改名为将来的 wal 段。

因此参数 wal_files 不再使用,在该版本中被移除了,当然这个 wal 段的管理方式在 pg9.5 又有所变化

三、pg7.4 增加便利性 warning

此版本没有功能性的变化,只是增加了一个 warning 参数 checkpoint_warning

CHECKPOINT_WARNING

如果两次因为参数 checkpoint_segmet 产生的 checkpoint 的时间间隔小于 checkpoint_warning 值,会报一个 warning,用于提醒用户增大 checkpoint_segmet 值

相关推荐
程序员云帆哥16 分钟前
MySQL JDBC Driver URL参数配置规范
数据库·mysql·jdbc
TDengine (老段)34 分钟前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
大气层煮月亮1 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang1 小时前
达梦数据库的命名空间
数据库·oracle
三三木木七2 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔2 小时前
sql数据库语法
数据库·sql
唐古乌梁海2 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强2 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL2 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王2 小时前
NoSQL介绍
数据库·nosql