PostgreSQL未按archive_timeout间隔生成新WAL文件问题排查
问题:archive_timeout设置后WAL文件仍长时间未归档
已将archive_timeout设置为300秒(5分钟),但WAL文件仍长时间(数小时)处于打开状态,且PostgreSQL未按预期每5分钟强制生成新日志文件。
环境与配置信息
PostgreSQL版本:13.5,启动无报错postgresql.conf核心配置:
archive_mode = on archive_timeout = 300 archive_command = '/usr/local/internal/pgarchive.sh "%p" "%f"' restore_command = '/usr/local/internal/pgrestore.sh "%f" "%p"' wal_level = logical
pg_wal目录内容
drwx------ 3 postgres postgres 4096 Oct 19 15:51 . drwx------ 19 postgres postgres 4096 Oct 19 15:31 .. -rw------- 1 postgres postgres 348 Oct 19 15:31 000000010000000000000097.00000028.backup -rw------- 1 postgres postgres 16777216 Oct 19 15:51 00000001000000000000009A -rw------- 1 postgres postgres 16777216 Oct 19 15:56 00000001000000000000009B -rw------- 1 postgres postgres 16777216 Oct 19 15:31 00000001000000000000009C -rw------- 1 postgres postgres 16777216 Oct 19 15:36 00000001000000000000009D -rw------- 1 postgres postgres 16777216 Oct 19 15:41 00000001000000000000009E drwx------ 2 postgres postgres 4096 Oct 19 15:56 archive_status
归档目录内容
drwxrwxrwx 2 postgres postgres 4096 Oct 19 15:56 . drwxrwxrwx 4 root root 4096 Oct 18 20:57 .. -rw------- 1 postgres postgres 16777216 Oct 19 15:30 000000010000000000000094 -rw------- 1 postgres postgres 16777216 Oct 19 15:30 000000010000000000000095 -rw------- 1 postgres postgres 16777216 Oct 19 15:31 000000010000000000000096 -rw------- 1 postgres postgres 16777216 Oct 19 15:31 000000010000000000000097 -rw------- 1 postgres postgres 348 Oct 19 15:31 000000010000000000000097.00000028.backup -rw------- 1 postgres postgres 16777216 Oct 19 15:36 000000010000000000000098 -rw------- 1 postgres postgres 16777216 Oct 19 15:41 000000010000000000000099 -rw------- 1 postgres postgres 16777216 Oct 19 15:51 00000001000000000000009A -rw------- 1 postgres postgres 16777216 Oct 19 15:56 00000001000000000000009B
核心原因分析与解决步骤
1. WAL未归档的本质
PostgreSQL仅会在WAL文件不再被实例依赖且归档命令执行成功后,才会标记文件可清理或复用。从归档目录可见9B已完成归档,但pg_wal中的9C/9D/9E仍存在,说明这几个文件的归档流程大概率卡住了。
2. archive_timeout的生效逻辑
archive_timeout的作用是当当前WAL文件最后写入时间超过设定值时,强制切换到新WAL文件,但它不会主动处理未完成归档的旧文件。如果当前WAL仍有写入操作,或旧WAL归档卡住,PostgreSQL不会频繁触发WAL切换。
3. 未归档文件的排查方向
- 验证归档脚本有效性:手动执行
/usr/local/internal/pgarchive.sh "pg_wal/00000001000000000000009C" "00000001000000000000009C",检查是否能成功归档、是否有权限问题或脚本逻辑错误。 - 查看PostgreSQL日志:搜索
archive相关日志,确认是否有归档失败的报错(如磁盘空间不足、脚本返回非0错误码)。 - 检查archive_status目录:该目录下的
.ready文件表示待归档,.done表示归档完成。若9C/9D/9E对应.ready文件存在,说明PostgreSQL一直在重试归档但未成功。 - 流复制节点影响:如果存在备库,主库会保留WAL直到备库确认接收,可通过
pg_stat_replication查看备库同步状态。
4. 关于9B文件的状态
9B已完成归档但仍留在pg_wal,可能是因为:
- 实例仍需它用于崩溃恢复;
- 检查点未触发:PostgreSQL会在检查点完成后清理已归档的旧WAL,可执行
CHECKPOINT;手动触发,或通过pg_stat_bgwriter查看最近检查点时间。
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

