【凤凰社】postgresql 如何手动清理归档文件(pg_wal)

背景

发现数据库宕机,排查原因发现数据磁盘爆满,经排查发现是数据库数据目录下,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,But没有配置archive_command,那么xlog文件会一直堆积(pg_wal写完后,会写.ready,But由于没有配置archive_command,也就是说不会触发归档命令,So一直都不会写.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。在正常操作期间,两种模式之间没有区别,But当设置为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配置

    请参考


0 评论

回复