它会为待重建的表创建一份副本。首先取一份全量快照,将所有活元组写入新表,并通过触发器将所有针对原表的变更同步至新表,最后通过重命名,使用新的紧实副本替换老表。而对于索引,则是通过PostgresQL的CREATE(DROP)INDEXCONCURRENTLY完成的。
1.pg_repack 工作原理
·创建一个记录表,用于记录原表中的记录的修改
·在原表上创建一个触发器,记录插入、更新、和删除操作到日志表
·创建一个新表,包含原表中的所有的记录
·在新表上创建索引
·将日志表中的变更应用到新表.
·使用system catalogs将原表和新表进行swap,包含索引和toast表(更新系统表system catalogs)格
·删除原先的表
2.使用pg_repack 的优点
· 大量删除记录后,从表中回收空闲空间给磁盘。
· 重新构建一个表,以重新排列记录,并将它们压缩/打包到更少的页。这可能会让查询的IO更少,性能更高。
· 从那些因为autovacuum设置不当,而导致过度膨胀的表中回收空闲空间。
· pg_repack是PostgreSQL的一个扩展,它可以帮助我们在线重建一个表。这类似于MySQL中用于在线表重建的pt-online-schema-change。然而,pg repack只适用于具有主键或NOT NULL唯一键的表。
3.使用pg_repack 注意点
·重整开始之前,最好取消掉所有正在进行的Vacuum任务。
·对索引做重整之前,最好能手动清理掉可能正在使用该索引的查询
·如果出现异常的情况(譬如中途强制退出),有可能会留下未清理的垃圾,需要手工清理。
·当完成重整,进行重命名替换时,会产生巨量的WAL,有可能会导致复制延迟,而且无法取消。
·重整特别大的表时,需要预留至少与该表及其索引相同大小的磁盘空间,需要特别小心,手动检查。
4.pg_repack 安装
下载网址:https://pgxn.org/dist/pg_repack/
上传并解压:
unzip pg_repack-1.4.8.zip
编译并安装
cd pg_repack-1.4.8
make
make install
登录数据库添加扩展
create extension pg_repack;
查看已经安装的pg_repack
SELECT * FROM pg_available_extensions where name like 'pg_repack';
5.pg_repack 基本使用