使用插件pg_repack解决PG数据库表和索引膨胀问题

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

使用插件pg_repack解决PG数据库表和索引膨胀问题

一 pg_repack简介 

PostgreSQL数据库通过数据多版本实现MVCC,删除数据并不会真正删除数据,而是修改标识。更新是通过删除+插入的方式进行。所以在频繁更新的系统,如果不进行处理,数据膨胀倍数可能达到十几倍。

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

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

二 pg_repack部署

$ wget https://api.pgxn.org/dist/pg_repack/1.4.6/pg_repack-1.4.6.zip

pg_repack 1.4.6添加了对 PostgreSQL 13 的支持,在 9.4 之前放弃对 PostgreSQL 的支持.

$ unzip pg_repack-1.4.6.zip

$ cd pg_repack-1.4.6

[root@localhost ~]# yum -y install openssl openssl-devel

[root@localhost ~]# yum -y install readline-devel.x86_64

$ make && make install



/var/postgresql/soft/pg12.8/bin/pg_repack



三 pg_repack配置

扩展pg_repack

postgres=# create extension pg_repack;

kingdee=# create extension pgstattuple;



四 pg_repack示例

大表做repack操作 



$ pg_repack -p 5432 -d kingdee --no-order --table large_test




在经过repack后,物理文件的名字更改了,大小也变为了115MB,刚才那些被废弃的行空间也已经释放给了系统。

表的占用空间变小了,访问表的速度也会更快。

在线pg_repack

repack数据库

pg_repack -p 5432 -d kingdee --no-order --jobs 4  --elevel=info

repack模式

pg_repack -p 5432 -d kingdee --schema=public --no-order --jobs 4  --elevel=info

repack表和索引

pg_repack -p 5432 -d kingdee --no-order --table public.large_test --elevel=info

repack所有索引

pg_repack -p 5432 -d kingdee --no-order --only-indexes --table public.large_test --elevel=info

repack指定索引

pg_repack -p 5432 -d kingdee  --index public.large_test_pkey --elevel=info

pg_repack注意事项

pg_repack需要额外的存储空间。全表repack时,剩余存储空间大小需要至少是待repack表大小的2倍。 

pg_repack无法操作临时表。

pg_repack无法操作GiST索引。

pg_repack运行时无法对repack操作中的表执行DDL。pg_repack会持有ACCESS SHARE锁,禁止DDL执行。

































使用插件pg_repack解决PG数据库表和索引膨胀问题

一 pg_repack简介 PostgreSQL数据库通过数据多版本实现MVCC,删除数据并不会真正删除数据,而是修改标识。更新是通过删除+插入的方式进行。...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息