可参考官方文档:
https://reorg.github.io/pg_repack/?spm=a2c63.p38356.879954.3.6d6d15b3rdFspH
RDS PostgreSQL支持通过插件pg_repack在线清理表空间,有效解决因对全表大量更新等操作引起的表膨胀问题。pg_repack无需获取排它锁,相比CLUSTER或VACUUM FULL更加轻量化。
注意事项:
- pg_repack需要额外的存储空间。全表repack时,剩余存储空间大小需要至少是待repack表大小的2倍。
- pg_repack无法操作临时表。
- pg_repack无法操作GiST索引。
- pg_repack运行时无法对repack操作中的表执行DDL。pg_repack会持有ACCESS SHARE锁,禁止DDL执行。
功能介绍
pg_repack插件支持全表repack和索引repack。
- 对整表数据进行repack的实现原理如下:
- 创建日志表记录对原表的变更。
- 在原表创建触发器,将原表的INSERT/UPDATE/DELETE操作记录到日志表中。
- 创建新表,与原表的行列相同。
- 在新表中创建索引。
- 将日志表里的变更应用到新表。
- 在system catalog交换新旧表。
- 删除旧表。
说明 pg_repack会在第1、2步和第6、7步短暂持有ACCESS
EXCLUSIVE锁。其余步骤pg_repack只需要持有原表的ACCESS SHARE锁,不影响原表的INSERT/UPDATE/DELETE。
- 对表中索引进行repack的实现原理如下:
- 以CONCURRENTLY方式创建新索引。
- 在system catalog交换新旧索引。
- 删除旧索引。
使用插件
开启插件。
CREATE EXTENSION pg_repack;
关闭插件。
DROP EXTENSION pg_repack;
对数据库test中所有表执行repack操作。
pg_repack test
对数据库test中的表foo和表bar执行repack操作。
pg_repack --no-order --table foo --table bar test
将数据库test中的表foo所有索引移动到表空间tbs。
pg_repack -d test --table foo --only-indexes --tablespace tbs
将数据库中指定的索引移动到表空间tbs。
pg_repack -d test --index idx --tablespace tbs