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

0    1227    7

Tags:

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

简介

官网:

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

https://pgxn.org/dist/pg_repack

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

Postgresql通过数据多版本实现MVCC(参考:https://www.dbaup.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中指定以下选项。

  • 选项:

    -a, —all 重新打包所有数据库

    -t, —table=TABLE 仅重新打包特定表

    -I, —parent-table=TABLE 重新打包特定的父表及其继承者

    -c, —schema=SCHEMA 仅在特定模式中重新打包表

    -s, —tablespace=TBLSPC 将重新打包的表移动到新的表空间

    -S, —moveidx 将重新打包的索引也移动到TBLSPC

    -o, —order-by=COLUMNS 按列而不是簇键排序

    -n, —no-order 做 vacuum full 而不是 cluster

    -N, —dry-run 打印将被重新包装的内容并退出

    -j, —jobs=NUM 为每个表使用这么多并行作业

    -i, —index=INDEX 只移动指定的索引

    -x, —only-indexes 只移动指定表的索引

    -T, —wait-timeout=SECS 超时以取消冲突的其他后端

    -D, —no-kill-backend 超时时不要杀死其他后端

    -Z, —no-analyze 最后不分析

    -k, —no-superuser-check 跳过客户端中的超级用户检查

    -C, —exclude-extension 不要重新打包属于特定扩展名的表

  • 连接选项:

    -d, —dbname=DBNAME 要连接的数据库

    -h, —host=HOSTNAME 数据库服务器主机或套接字目录

    -p, —port=PORT 数据库服务器端口

    -U, —username=USERNAME 连接的用户名

    -w, —no-password 从不提示输入密码

    -W, —password 强制密码提示

  • 通用选项:

    -e, —echo 回显查询

    -E, —elevel=LEVEL 设置输出消息级别

    —help 显示此帮助,然后退出

    —version 输出版本信息,然后退出

重组选项

标签:

Avatar photo

小麦苗

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

您可能还喜欢...

发表回复