一、背景
看到监控告警磁盘空间占用达到90%,问了业务最近没有产生什么大数据量的表,于是乎开始排查,发现是数据库数据目录下,pg_wal占用631G导致。
二、解决过程
1、查看每个目录大小发现pg_wal目录占用较大,推断是物理复制槽异常导致
物理复制槽的主要作用是确保主库不会删除还未发送到备库的 WAL 日志,即使备库掉线。通过复制槽记录的从库状态,PostgreSQL 会保证从库还没有应用的日志不会从主库的日志目录中清除。
du -sh*
2、查看复制槽的信息发现物理复制槽的激活状态为false,推断复制槽未使用,与运维沟通后发现这台机器根本没有备用库用来备份数据,怪不得WAL日志一直没清除
SELECT * FROM pg_replication_slots;
3、查看复制槽延迟删除 WAL 日志的大小,可以对得上
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size FROM pg_replication_slots;
4、确认复制槽无用后删除复制槽,两分钟后再查询磁盘空间已恢复正常
select pg_drop_replication_slot('slave1');