操作场景
RDS-PostgreSQL支持通过 pg_repack
插件在线清理表空间,有效解决因对全表大量更新等操作引起的表膨胀问题。pg_repack无需获取排它锁,相比CLUSTER或VACUUM FULL更加轻量化。
前提条件
- 请确保您的实例内核大版本满足,本插件所支持的内核版本,请参考支持的版本插件列表。
注意事项
pg_repack
需要额外的存储空间。全表repack时,剩余存储空间大小需要至少是待repack表大小的2倍。- pg_repack无法操作临时表。
- pg_repack无法操作GiST索引。
- 重建表和索引时会占用较多的磁盘IO,使用时请提前评估是否影响业务。
- 在pg_repack运行期间,目标表上不能执行除vacuum和analyze之外的任何DDL指令。
插件使用
- 安装插件
CREATE EXTENSION IF NOT EXISTS pg_repack;
- 卸载插件
DROP EXTENSION IF EXISTSpg_repack;
使用示例
使用 pg_repack
插件清理表。
-
创建测试表
create table pg_repack_test(id bigint primary key, name varchar); insert into pg_repack_test select i , to_char(random()*100000, 'FM000000') from generate_series(1, 1000000) i; delete from pg_repack_test where id in (select i from generate_series(1, 600000, 2) i); select pg_size_pretty(pg_relation_size('pg_repack_test'));
-
清理测试表
cd <RDS_INSTALL_PATH> . setenv.sh cd bin ./pg_repack --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root --no-superuser-check --no-kill-backend -t pg_repack_test
- <RDS_INSTALL_PATH>:RDS-PostgreSQL实例的安装目录
- <RDS_ADDRESS>:RDS-PostgreSQL实例的IP地址。
- <DB_PORT>:RDS-PostgreSQL实例的端口。
- <DB_NAME>:表pg_repack_test所在的数据库。
- 查看清理后的表大小
select pg_size_pretty(pg_relation_size('pg_repack_test'));
常见问题
Q1:报错:“pg_repack failed with error: You must be a superuser to use pg_repack”。
A1:执行pg_repack时加上--no-superuser-check,跳过超级用户检查。
Q2:报错:“Waiting for 1 transactions to finish. First PID: ***"。
A2:清理过程中有长事务,pg_repack会等待事务执行完成。