ITPub博客

首页 > 数据库 > 数据库开发技术 > 如何处置PostgreSQL WAL日志膨胀

如何处置PostgreSQL WAL日志膨胀

原创 数据库开发技术 作者:sjw1933 时间:2024-05-18 23:45:06 0 删除 编辑
点击蓝字
关注我吧



作者:Digital Observer(施嘉伟)

Oracle ACE Associate: Database

PostgreSQL ACE Partner

11年数据库行业经验,现主要从事数据库服务工作

拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证

ITPUB认证专家、PolarDB开源社区技术顾问

国内某高校企业实践指导教师

公众号:Digital Observer;CSDN:施嘉伟;ITPUB:sjw1933;PGFans:施嘉伟。

膨胀原因

PostgreSQL的WAL日志膨胀通常是由于长时间运行的事务、未清理的复制槽、不当的参数设置、归档失败或频繁的数据变更。合理配置系统并定期维护可以帮助避免这一问题。


PART 01
# 描述 #

PostgreSQL由于WAL日志的机制,导致其在不正确配置的情况下会出现磁盘空间暴涨的情况,本文档就此情景写一般处理办法。

PART 02
# 场景复现及处理过程 #
1、基本描述


某朋友反馈,有一个PostgreSQL数据库的数据目录增长非常大,500G的总磁盘空间,剩余23G,通过du -sh $PGDATA/*对数据目录进行统计分析,发现大部分的空间都被pg_wal目录占用,文件数量达到1w+。

2、查看相关配置


查看可能会造成原因的相关参数,checkpoint_timeout是可能造成wal大量生成的原因之一,当max_wal_size=20GB时,可能会出现在进行checkpoint之间,如果出现大事物或者写入量非常大的时候,最大可能会生成(20*1024)/16=1280个wal文件。适当调整后,发现由于事务量比较大,即使调小参数,还是会不断生成文件,接着查看归档是否出现问题:

postgres=# show checkpoint_timeout ;
 checkpoint_timeout 
--------------------
 60min
(1 row)

postgres=# show max_wal_size ;
 max_wal_size 
--------------
 20GB
(1 row)

postgres=# show min_wal_size ;
 min_wal_size 
--------------
 80MB
(1 row)

postgres=# show wal_keep_size ;
 wal_keep_segments 
---------------
 128
(1 row)
3、查看归档配置


可以看到归档已经开启,检查归档路径是否存在,在pg_wal/ archive_status文件中记录wal文件的归档状态是否正常,检查都没有发现问题,如果说归档没有成功进行,wal日志也是无法移除造成文件空间迅增长。

postgres=# show archive_mode ;
 archive_mode 
--------------
 on
(1 row)

postgres=# show archive_command ;
                                  archive_command                                   
------------------------------------------------------------------------------------
 test ! -f /software/pgsql12/archivedir/%f && cp %p /software/pgsql12/archivedir/%f
(1 row)


4、查看是否有备库


查看是否有流复制环境,流复制环境中,主要靠wal日志进行主备同步,当主备环境之间差异过大,或者出问题后,造成主备没有同步,则会保留wal日志不进行删除。如果有差异的话,wal_keep_segments参数会生效,它会为备库保留相应数量的wal日志文件、甚至更多。

postgres=# select * from pg_stat_replication ;

确认没有备库环境!

5、查看是否有复制槽


是否存在无效的复制槽,备库如果没有进行同步或者说没有应用wal日志,那么该复制槽不可用,wal日志也会一直保留,造成wal日志不断增加。

postgres=# select * from pg_replication_slots;

查询到果然存在一个active状态为f的复制槽,我们尝试删除该复制槽。

SELECT * FROM pg_drop_replication_slot('pg_102');

删除后,发现pg_wal空间不再增长,一段时间后已自动释放!

总之,WAL日志膨胀的问题提示我们,数据库的健康运行需要我们持续的关注和细致的管理。只有这样,我们才能确保数据的安全,提升系统的可靠性,为用户提供更优的服务。

END
往期推荐:





什么?PGSQL执行突然变慢


Oracle 23ai新特性—DB_DEVELOPER_ROLE


Oracle 23ai新特性—DBMS_DICTIONARY_CHECK


分类分级在Oracle 23ai中的应用


初探Oracle 23ai——SQL*Plus新特性


在看点这里

点击"阅读原文"


原文作者:Digital Observer;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
11年数据库行业经验,Oracle ACE、PG ACE、OCM、IBM Certified DBA、MySQL OCP、PolarDB技术专家、KCP、PCTP、PCSD、达梦师资认证、PolarDB开源社区技术顾问、ITPUB认证专家、某高校外聘教师

注册时间:2019-05-05

  • 博文量
    295
  • 访问量
    300767