1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

PostgreSQL膨胀表或索引收缩插件之pg_squeeze

介绍

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

PostgreSQL膨胀表或索引收缩插件之pg_squeeze

pg_squeeze和pg_repack的区别

首先说pg_repack,pg_repack是pg_reorg的一个分支。其工作机制如下:

  1. 创建一个日志表来记录对原始表所做的更改。在原始表上添加一个触发器,将INSERT、UPDATE和DELETE记录到我们的日志表中。
  2. 创建一个包含旧表中所有行的新表。
  3. 在这个新表上建立索引。
  4. 将日志表中产生的所有更改应用到新表。
  5. 使用systemcatalog(包含了元数据的VIEW和表的一个schema)交换表,包括索引和toasttable。
  6. 删除原始表。

从上述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

  1. 设置PG_CONFIG环境变量,安装时,我们必须确保路径中的pg_config版本正确。
  2. 编译安装。
  3. 修改postgresql.conf参数文件并重启生效。
    • wal_level = logical
    • max_replication_slots = 1 #或者在当前值上加1。
    • shared_preload_libraries = pg_squeeze #将pg_squeeze添加到现有库中。
  4. 使用超级用户创建扩展pg_squeeze。
    • CREATE EXTENSION pg_squeeze;
  5. 要使“pg_squeeze”扩展知道该表,您需要在“squeeze.tables”表中插入一条记录。添加后,会定期检查表的统计信息。
  6. 最简单的注册方法是直接插入一条记录,例如:
    • INSERT INTO squeeze.tables(tabschema,tabname,schedule)VALUES (public,person,({10},{23},NULL,NULL,{4,6}));
  7. 如果需要指定其他列,例如free_space_extra、vacuum_max_age、max_retry等,也可以参照给定的示例。
  8. 最后,使用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