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,但是没有配置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是在备用服务器上增加了运行只读查询所需的信息,一般实在流复制的时候使用到。
- 1、minimal是默认的值,它仅写入崩溃或者突发关机时所需要的信息(不建议使用)。
-
修改
archive_command
配置