min_wal_size
默认:80MB
建议:大一些,1GB
首先需要理解wal日志,这个是pg的一个核心功能的保障:
WAL(Write-Ahead Logging)是PostgreSQL的核心机制,它确保任何数据修改都必须先写入日志,然后才能写入实际数据文件。这个机制源于数据库的ACID特性中的持久性(Durability)要求。
历史来源:WAL概念最早出现在1970年代的IBM System R数据库中,为了解决"如何在系统崩溃后保证数据一致性"这个根本问题。PostgreSQL从版本7.1(2001年)开始引入WAL机制。
然后再去理解min_wal_size:最小wal日志大小。
直观理解有点奇怪,设置最大很直观,设置最小是为啥?
官方:wal日志大小在设置阈值之下时,旧的wal文件就会在检查点时被循环使用,而不是被删除。这可以用来确保保留足够的wal空间来处理wal使用峰值。
有点抽象,溯源看下:
历史来源:在PostgreSQL 9.5版本之前,WAL管理相对简单,系统会根据需要动态创建WAL文件,但会在检查点后立即回收不再需要的文件。这导致在写入负载波动大的场景下,频繁的文件创建/删除操作成为性能瓶颈。PostgreSQL 9.5引入了
min_wal_size和max_wal_size参数来解决这个问题。
min_wal_size就是告诉PostgreSQL:"始终保持这么多WAL文件准备好,不要急着删除它们"。
实际保留的WAL文件数 = MAX( min_wal_size / wal_segment_size, 恢复所需的最少WAL文件数, 复制槽要求的WAL文件数 )
所以,建议的意思就是,如果磁盘空间不是那么紧张,可以大一些。
checkpoint_warning
默认:30s
建议:checkpoint_timeout的一部分,或者就1min
历史来源:这个参数最早出现在 PostgreSQL 8.0(2005年)左右,当时社区发现很多用户在高写入负载下遭遇性能抖动,却不知道是因为
max_wal_size设置太小导致检查点过于频繁。于是引入了这个“善意的提醒”,帮助 DBA 快速定位配置问题。
- 在设定时间内,如果出现多次检查点,给出一个告警
- 设置为0禁用
- 默认单位为s