背景

发现数据库宕机,排查原因发现数据磁盘爆满,经排查发现是数据库数据目录下,pg_wal目录占用过大导致。

pg_wal(Write-AHead Logging) 说明

wal日志位置:
$PGDATA/pg_wal(pg10之前叫pg_xlog)

#
#wal日志文件命名规则:
#我们看到的wal日志是这样的:000000010000000100000092
#其中前8位:00000001表示timeline;
#中间8位:00000001表示logid;
#最后8位:00000092表示logseg

清除检查点以前的XLOG文件

root@~> pg_controldata $PGDATA

Latest checkpoint location:           1/E000028  
Prior checkpoint location:            1/D18C068  
Latest checkpoint's REDO location:    1/E000028  
Latest checkpoint's REDO WAL file:    00000001000000010000000E  
  
表示00000001000000010000000E之前的pg_wal文件可以删除

如何人为清理pg_wal文件

参考原文

如果你的数据库配置不当,导致pg_wal文件堆积的话,如何人为的处理呢?
比如你配置了archive_mode=on,但是没有配置archive_command,那么xlog文件会一直堆积(pg_wal写完后,会写.ready,但是由于没有配置archive_command,也就是说不会触发归档命令,所以一直都不会写.done)。

从而导致pg_wal一直不会被清理。
然后使用pg_archivecleanup命令来清理。

# 1. 读取控制文件,找到哪个文件是可以被清理的
pg_controldata $PGDATA  
  
Latest checkpoint location:           1/E000028  
Prior checkpoint location:            1/D18C068  
Latest checkpoint's REDO location:    1/E000028  
Latest checkpoint's REDO WAL file:    00000001000000010000000E  
  
# 表示00000001000000010000000E之前的pg_wal文件可以删除 (pg10以前的叫做pg_xlog)
pg_archivecleanup -d $PGDATA/pg_xlog 00000001000000010000000E  
pg_archivecleanup: keep WAL file "/disk1/digoal/pgdata/pg_root1921/pg_xlog/00000001000000010000000E" and later  
pg_archivecleanup: removing file "/disk1/digoal/pgdata/pg_root1921/pg_xlog/00000001000000010000000D" 

如何关闭或修改归档模式

  • 修改archive_mode配置

    当启用archive_mode时,通过设置archive_command将已完成的WAL段发送到归档存储。除了off,disable,还有两种模式:on,always。在正常操作期间,两种模式之间没有区别,但是当设置为always的情况下,WAL archiver在存档恢复或待机模式下也被启用。在always模式下,从归档还原或流式复制流的所有文件都将被归档(再次)。archive_mode和archive_command是单独的变量,因此可以在不更改存档模式的情况下更改archive_command。此参数只能在服务器启动时设置。当wal_level设置为minimal时,无法启用archive_mode。

  • 修改wal_level配置

    • 1、minimal是默认的值,它仅写入崩溃或者突发关机时所需要的信息(不建议使用)。
    • 2、archive是增加wal归档所需的日志(最常用)。
    • 3、hot_standby是在备用服务器上增加了运行只读查询所需的信息,一般实在流复制的时候使用到。
  • 修改archive_command配置

    请参考

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐