插件版本:
OS:Ubuntu 16.04
Postgresql:9.6
目的:
为了回收和再利用通过表更新或者删除行所占用的磁盘空间,我们要对表进行定时的清理,利用VACUUM FULL这种形式会出现较长时间锁表情况,导致该表无法进行读写,只有等整个过程完成后才可以进行正常使用,因此考虑采用Pg_squeeze这一扩展插件,解决如上问题
Pg_squeeze工作原理:
安装:
1、下载插件
https://github.com/cybertec-postgresql/pg_squeeze
根据PG版本下载指定版本
2、编译安装
make && make install
3、如果遇到如下问题
解决:修改MakeFile,添加PG_CONFIG位置,如下
如何查看本机PG_CONFIG可用目录位置:
sudo find / -name "pg_config" -print
4、配置Posgresql,修改postgresql.conf添加如下配置
wal_level = logical
max_replication_slots = 1 # 大于等于1
shared_preload_libraries = 'pg_squeeze'
5、重启Postgresql
使用
1、引入扩展插件pg_squeeze
postgres=# create extension pg_squeeze;
2、创建一张测试表
postgres=# create table test(id int primary key);
3、导入一批数据
postgres=# insert into test select generate_series(1,5000000);
4、查看安装pg_queeze后生成的系统表
postgres=# set search_path to squeeze;
postgres=# \d
主要看一下squeeze.tables的表结构
字段解释:
tabschema:schema name
tabname:table name
clustering_index:用来在表重构结束后对表元组做物理排序的索引
rel_tablespace:表示表重建时,移动到哪个表空间中
ind_tablespaces:这个一个二维数组,表示索引和表空间的映射关系
task_interval:表示检查表膨胀是否超过阀值的时间间隔
first_check:表示第一次检查时间
free_space_extra:表示空闲空间超过多少时就会对表进行重建,默认是50
min_size:被处理的最小的表占用的磁盘空间
vacuum_max_age:当进行一次vacuum后,认为fsm是有效的最大时间,默认1小时
max_retry:当重建表失败时最大的重新尝试的次数,默认是0
skip_analyze:跳过对表进行analyse,默认是false
5、向squeeze.tables插入一条数据,定期清理test表,5分钟一次,
insert into squeeze.tables (tabschema,tabname,first_check,free_space_extra,task_interval) values('public','test',now(),20,interval '5 minutes');
6、启动pg_squeeze的进程需要调用
SELECT squeeze.start_worker();
关闭:SELECT squeeze.stop_worker();
7、查看当前表的膨胀情况
此时test表大小
8、删除test表一半数据
postgres=# delete from test where id < 2500000;
DELETE 2499999
9、查看当前表的膨胀情况
如图,free_space为44,大于我们设置的20,进程已经开始清理表膨胀,还没有处理完
查看当前test大小
如图,表大小没有变化,由于进程没有结束,表空间没有释放
10、待表清理完,再次查看tables_internal
如图,表已清理完毕,再次查看表大小
如图,空间已释放,测试成功
参考: