介绍
你好,我是IT那活儿公众号的小编。PostgreSQL使用多版本模型来维护MVCC。因此,表或索引的膨胀是不可避免的。通常,我们可以使用Vacuumfull、Rewritetable(如在线Cluster)的方式重建表,或者重建或重定位表的索引。但是上述方式需要持有排它锁,会堵塞读操作。为了减少锁冲突,相应的插件就应运而生,例如pg_squeeze、pg_repack等。

pg_squeeze和pg_repack的区别
首先说pg_repack,pg_repack是pg_reorg的一个分支。其工作机制如下:
- 创建一个日志表来记录对原始表所做的更改。在原始表上添加一个触发器,将INSERT、UPDATE和DELETE记录到我们的日志表中。
- 创建一个包含旧表中所有行的新表。
- 在这个新表上建立索引。
- 将日志表中产生的所有更改应用到新表。
- 使用systemcatalog(包含了元数据的VIEW和表的一个schema)交换表,包括索引和toasttable。
- 删除原始表。
从上述pg_repack的工作机制来看,其使用了新建表的方式重组数据,最后通过切换完成数据重组。仅仅在切换时需要持有排他锁,因时间非常短暂,影响比Vacuumfull和Rewrite的方式小很多。但是pg_repack都需要建触发器,记录下增量重组时,原表产生的增量数据。因此重组时,触发器及原表的DML会带来一定的影响。
而pg_squeeze的工作原理是创建一个新的数据文件,然后在复制快照时将所做的更改应用到表中。这是使用REDO和logicalreplication来捕获对重建表的数据更改的方式来完成。所以相对于pg_repack,其不需要建触发器,并且在重组时对原表的DML几乎没有性能影响。另外,pg_squeeze支持自动重组。即通过设置阈值,自动启动WORKER进程,将数据复制到重组表,最后加锁切换。但是要求表必须有一个PRIMARYKEY,或者在非空列上至少有一个唯一索引。
pg_squeeze的安装及使用
pg_squeeze的下载路径为:https://github.com/cybertec-postgresql/pg_squeeze
- 设置PG_CONFIG环境变量,安装时,我们必须确保路径中的pg_config版本正确。
- 编译安装。
- 修改postgresql.conf参数文件并重启生效。
- wal_level = logical
- max_replication_slots = 1 #或者在当前值上加1。
- shared_preload_libraries = pg_squeeze #将pg_squeeze添加到现有库中。
- 使用超级用户创建扩展pg_squeeze。
- CREATE EXTENSION pg_squeeze;
- 要使“pg_squeeze”扩展知道该表,您需要在“squeeze.tables”表中插入一条记录。添加后,会定期检查表的统计信息。
- 最简单的注册方法是直接插入一条记录,例如:
- INSERT INTO squeeze.tables(tabschema,tabname,schedule)VALUES (public,person,({10},{23},NULL,NULL,{4,6}));
- 如果需要指定其他列,例如free_space_extra、vacuum_max_age、max_retry等,也可以参照给定的示例。
- 最后,使用SELECT squeeze.start_worker();启动pg_squeeze自动处理命令,使用SELECT squeeze.stop_worker();关闭pg_squeeze命令。要控制最大占用锁的时间,可以使用SET squeeze.max_xlock_time TO 100;(单位为毫秒)。
手动收缩表,而无需注册,可以使用以下命令:
- squeeze.squeeze_table(tabchema name,tabname name,clustering_index name,rel_tablespace name,ind_tablespaces name[])
例如:SELECT squeeze.squeeze_table(public,person_old202209,null,null,null);
以上就是关于PostgreSQL膨胀表或索引收缩插件之pg_squeeze的介绍。如有不懂之处,请在评论区留言。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6498.html
