近期生产库PostgreSQL调度任务变慢,发现表占用空间变大,但数据量并没有猛增,于是使用vacuum回收表空间,回收后占用依旧很大,怀疑vacuum不生效于是记录下解决问题的心路历程
1、查看表中死元组
存在6596109行死元组,执行 VACUUM FULL table 并未生效,上次生效时间是两天前
select * from pg_stat_user_tables where relname = tablename
2、登陆服务器进入数据库使用VACUUM VERBOSE进行故障排查,发现长事物影响VACUUM回收
-- 登陆数据库
psql -U username -W -h hostname -d databasename
-- 故障排除
VACUUM verbose tablename
3、查看长事物的pid手动杀死
SELECT DATNAME,PID,STATE,WAIT_EVENT_TYPE,QUERY,WAIT_EVENT,QUERY_START
FROM pg_stat_activity
WHERE backend_xmin = '3075195681'