1. 提出问题
最近遇到一个问题:"我们公司的业务量较小,但现在数据库积累了大量的 WAL, 一个月的时间 pg_wal 目录和归档的目录均超过了100GB, 且 WAL 增长的速度较快,由于虚拟机的磁盘不大,几乎把磁盘撑爆了,我应该怎么处理呢?可以先人工删一下吗?”
针对这个现象,我们需要分析如下几个问题:
-
几乎没有业务为什么 WAL 还会增加且增加的还很快?
-
WAL 会一直增加直至把磁盘撑爆吗?DBMS 有参数控制上限么?
-
WAL 文件为什么会保留那么多, DBMS 难道不会自动清理, 需要人工介入么?
2. 分析问题
因为 PostgreSQL 不同版本之间参数有差异,所以确认运行环境是排查问题的第一步。
经确认, 出现这一现象的 DB 版本是 PostgreSQL 11.5,那么针对 pg_wal 目录下文件数量和尺寸的问题,我们首先明确如下几个相关参数的含义:
-
wal_segment_size:单个 WAL 文件的大小,默认为16MB,一般不做更改,且在 pg11 之前,只能在编译 pg 时指定,很明显这个参数的影响可以排除。
-
wal_keep_segments:这个参数配置的是 standby 复制所需的在 pg_wal 目录中最少保留的 WAL 文件的数目,一般情况下,这大概就是 wal 尺寸范围,如果这个参数配置为