PG使用插件pg_repack收缩膨胀的表和索引

0    1114    7

Tags:

👉 本文共约7982个字,系统预计阅读时间或需31分钟。

简介

官网:

https://reorg.github.io/pg_repack/

https://pgxn.org/dist/pg_repack

https://github.com/reorg/pg_repack/

Postgresql通过数据多版本实现MVCC(参考:https://www.xmmup.com/pgzhongdemvccduobanbenbingfakongzhi.html )。删除数据并不会真正删除数据,而是修改标识更新是通过删除+插入的方式进行,所以在频繁更新的系统,数据膨胀是个头疼的问题,如果不进行处理,数据膨胀倍数可能达到十几倍。

为了处理膨胀问题,pg提供了vacuum工具,vacuum分为普通vacuum和vacuum full,普通vacuum会清理死元组,但是不会进行空间重组,磁盘上的已经利用的空间不会释放给操作系统,但是会释放死元组的空间,后续插入的元组会根据空闲空间管理fsm优先插入空闲空间。Vacuum full清理会释放磁盘空间,但是会获取八级锁(会阻塞所有其它的操作),因为vacuum full的原理是新建一个表数据文件,然后从老表中拷贝数据到新文件中,这个过程会阻塞select。

因为影响业务,pg社区开发了pg_repack工具,老版本叫pg_reorg。pg_repack以extension的方式存在,用户可以自己安装该插件。

PostgreSQL支持通过插件pg_repack在线清理表空间,有效解决因对全表大量更新等操作引起的表膨胀问题。pg_repack无需获取排它锁,相比CLUSTER或VACUUM FULL更加轻量化。

pg_repack是一个可以在线重建表和索引的扩展,它会在数据库中创建一个和需要清理的目标表一样的临时表,将目标表中的数据COPY到临时表,并在临时表上建立和目标表一样的索引,然后通过重命名的方式用临时表替换目标表。

pg_repackpg_reorg项目的一个分支。

您可以选择以下方法之一进行重组:

  • 在线CLUSTER(按簇索引排序)
  • 按指定列排序
  • 在线 VACUUM FULL(仅包装行)
  • 仅重建或重定位表的索引

注意:

  • 只有超级用户才能使用该实用程序。
  • 目标表必须有一个 PRIMARY KEY,或者至少有一个 NOT NULL 列上的 UNIQUE 索引。
  • 重整开始之前,最好取消掉所有正在进行的Vacuum任务
  • 对索引做重整之前,最好能手动清理掉可能正在使用该索引的查询
  • 如果出现异常的情况(警如中途强制退出),有可能会留下未清理的垃圾,需要手工清理。
  • 当完成重整,进行重命名替换时,会产生巨量的WAL,有可能会导致复制延迟,而且无法取消
  • 重整特别大的表时,需要预留至少与该表及其索引相同大小的磁盘空间,需要特别小心,手动检查。
  • 如果遇到写入速度非常快的,最后阶段replylog的时候,只能等。

安装

Pg_repack的源码在github或者pgxn上都可以下载,https://pgxn.org/dist/pg_repack

编译过程:

帮助:

pg_repack 是以 extension 的方式工作的。

用法

可以在OPTIONS中指定以下选项。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部