环境
系统平台:N/A
版本:N/A
症状
数据库中的pg_wal占用大量空间,且不删除。
问题原因
复制槽占用早期的wal日志,导致wal归档后无法正常删除。
1. 排查复制槽情况:
highgo=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-------------+--------+-----------+--------+----------+-----------+---------------+------------+------+--------------+-------------+---------------------
node_c_slot | | physical | | | f | t | | | | 155/8802AD50|
node_b_slot | | physical | | | f | f <-- 不活动 | 20314 | | | 53/1A005320 |
(2 rows)
查询复制槽的lsn对应的wal文件
highgo=# SELECT pg_walfile_name(pg_lsn('53/1A005320')) AS wal_file_name_offset;
wal_file_name_offset
--------------------------
00000007000000530000001A
(1 row)
2. 查询wal最早的文件:
cd $PGDATA/pg_wal
ls -lth
......
-rw------- 1 root root 16M Feb 29 15:50 00000007000000530000001A <--与前面复制槽占用的文件一致
-rw------- 1 root root 258 Feb 15 14:16 00000007.history
-rw------- 1 root root 214 Feb 15 13:54 00000006.history
与最早的wal文件相符,说明wal是被复制槽占用,无法正常删除。
解决方案
与客户确认该复制槽node_b_slot未在使用,决定删除该复制槽
highgo=# select pg_drop_replication_slot('node_b_slot');
pg_drop_replication_slot
--------------------------
(1 row)
--手动执行checkpoint,触发清理wal
highgo=# checkpoint ;
CHECKPOINT
wal正常被清理。