pg_repack是PostgreSQL的在线表重组工具,核心优势是不锁表、不阻塞DML操作(增删改),可解决表膨胀、索引碎片问题,适合生产环境在线执行。
一、核心前提(必满足)
- 数据库版本支持:PostgreSQL 9.1+(建议9.5+,兼容性更好)。
- 安装插件:需在目标数据库中安装
pg_repack插件(通过apt/yum或源码编译,如CREATE EXTENSION pg_repack;)。 - 表要求:目标表必须有主键或唯一索引(pg_repack依赖其排序重组数据),且不能是系统表、临时表、外部表。
- 权限:执行用户需拥有
SUPERUSER权限,或被授予pg_repack角色。
二、在线操作步骤(以表重组为例)
1. 操作前准备
- 检查表膨胀率:通过
pg_stat_user_tables和pg_class估算,如SELECT relname, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE relname = '目标表名';,死元组占比高时需重组。 - 确认空间:需预留至少1倍目标表大小的空闲空间(临时存储重组数据,可指定
--tablespace使用独立表空间)。
2. 执行在线重组
通过命令行工具pg_repack执行(推荐,避免SQL会话中断影响),基本语法:
# 重组单个表(含索引)
pg_repack -d 数据库名 -t 目标表名 -U 用户名 -h 主机地址 -p 端口号
# 仅重组表的索引
pg_repack -d 数据库名 -t 目标表名 -i 目标索引名 -U 用户名
- 执行中可通过
pg_stat_activity查看进度:SELECT query FROM pg_stat_activity WHERE query LIKE '%pg_repack%';。
3. 操作后验证
- 检查表膨胀率:重新执行步骤1的查询,确认死元组减少、表大小优化。
- 验证数据一致性:通过
COUNT(*)对比重组前后数据量,或抽样检查数据(如SELECT * FROM 目标表名 LIMIT 100;)。
三、关键注意事项
- 性能影响:重组会消耗IO和CPU,务必在业务低峰期执行(如凌晨),避免影响在线业务。
- 事务干扰:执行期间避免长事务(会阻塞pg_repack进度),建议提前通知开发/业务方。
- 异常处理:若中途中断,需执行
pg_repack --clean -d 数据库名 -t 目标表名清理临时文件,再重新执行。 - 替代方案:若表极小(<1GB),可优先用
VACUUM ANALYZE(轻量,不重组结构);仅当膨胀严重时用pg_repack。
2537

被折叠的 条评论
为什么被折叠?



