由于复制槽导致wal大量堆积的处理方案
文章目录
- 环境
- 症状
- 问题原因
- 解决方案
环境
系统平台: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_walls -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,触发清理walhighgo=# checkpoint ;CHECKPOINT
wal正常被清理。