pg_repack插件部署:
wget http://api.pgxn.org/dist/pg_repack/1.4.5/pg_repack-1.4.5.zip
source /home/postgres/.bash_profile
make
make install
create extension pg_repack;--到指定数据库下执行
Postgresql通过数据多版本实现mvcc,删除数据并不会真正删除数据,而是修改标识,更新是通过删除+插入的方式进行,所以在频繁更新的系统,数据膨胀是个头疼的问题,如果不进行处理,数据膨胀倍数可能达到十几倍。为了处理膨胀问题,pg提供了vacuum工具,vacuum分为普通vacuum(共享锁)和vacuumfull(排它锁),普通vacuum会清理死元组,但是不会进行空间重组,磁盘上的空间不会释放,但是会释放死元组的空间,后续插入的元组会根据空闲空间管理fsm优先插入空闲空间。Vacuum full清理会释放磁盘空间,但是会获取八级锁,因为vacuum full的原理是新建一个表数据文件,然后从老表中拷贝数据到新文件中,这个过程会阻塞select。因为影响业务,pg社区开发了pg_repack工具,老版本叫pg_reorg。Pg_repack以extension的方式存在,用户可以自己安装该插件。本文简单介绍一下pg_repack的使用。
经过测试,在执行pg_repack的同时对表进行并发查询,性能下降大概只有10%到20%,读取操作可以正常进行。并且表的oid没有发生变化,repack执行完成后,通过pg_relation_filepath()函数查询发现表的数据