pg_repack

pg_repack是PostgreSQL的在线表重组工具,核心优势是不锁表、不阻塞DML操作(增删改),可解决表膨胀、索引碎片问题,适合生产环境在线执行。

一、核心前提(必满足)

  1. 数据库版本支持:PostgreSQL 9.1+(建议9.5+,兼容性更好)。
  2. 安装插件:需在目标数据库中安装pg_repack插件(通过apt/yum或源码编译,如CREATE EXTENSION pg_repack;)。
  3. 表要求:目标表必须有主键或唯一索引(pg_repack依赖其排序重组数据),且不能是系统表、临时表、外部表。
  4. 权限:执行用户需拥有SUPERUSER权限,或被授予pg_repack角色。

二、在线操作步骤(以表重组为例)

1. 操作前准备
  • 检查表膨胀率:通过pg_stat_user_tablespg_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;)。

三、关键注意事项

  1. 性能影响:重组会消耗IO和CPU,务必在业务低峰期执行(如凌晨),避免影响在线业务。
  2. 事务干扰:执行期间避免长事务(会阻塞pg_repack进度),建议提前通知开发/业务方。
  3. 异常处理:若中途中断,需执行pg_repack --clean -d 数据库名 -t 目标表名清理临时文件,再重新执行。
  4. 替代方案:若表极小(<1GB),可优先用VACUUM ANALYZE(轻量,不重组结构);仅当膨胀严重时用pg_repack。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值