文章目录
一、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_siblings:当前事务等待的条件,如果并行执行的兄弟事务数量小于 commit_siblings,那当前事务就不等了
注意: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 功能相似,都是触发 checopoint 的时机,所以写在了这儿
8、CHECKPOINT_SEGMENT
PostgreSQL 执行 checkpoint 的 wal 段间隔,从上次 checkpoint 开始,PostgreSQL 在写了一定数量的 wal 段后,会再次触发 checkpoint
二、pg7.3 改变 wal 预生成方式
此版本在 pg7.1 基础上改变了 wal 段的预生成方式,checkpoint 时不再预生成 wal 段
- wal 段的数量原则上不超过 2 * checkpoint_segments + 1
- 一个流量高峰可能会导致 backend 极速生成 wal 日志,可能会将 wal 段数量增加到 2 * checkpoint_segments + 1 以上
- 做检查点时,如果 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 值

被折叠的 条评论
为什么被折叠?



