使用插件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数据库表和索引膨胀问题
本文2024-09-23 01:13:29发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144570.html