PostgreSQL数据库在线重组工具pg_repack安装与使用指南
2026/4/10 6:38:34 网站建设 项目流程

PostgreSQL数据库在线重组工具pg_repack安装与使用指南

【免费下载链接】pg_repackReorganize tables in PostgreSQL databases with minimal locks项目地址: https://gitcode.com/gh_mirrors/pg/pg_repack

项目概述

pg_repack是一款专为PostgreSQL数据库设计的扩展工具,能够在最小化锁定的情况下重新组织表和索引,有效移除数据库中的膨胀。与传统的CLUSTER和VACUUM FULL命令不同,pg_repack可以在线工作,在处理过程中不会对目标表持有排它锁,性能与直接使用CLUSTER命令相当。

核心特性

无锁重组技术

pg_repack采用创新的在线重组算法,仅在初始设置和最终交换阶段需要短暂的排它锁,其余时间仅持有共享更新排它锁,允许INSERT、UPDATE和DELETE操作正常进行。

多种重组模式

  • 在线CLUSTER:按照聚集索引顺序重组
  • 指定列排序:按照用户指定的列进行排序重组
  • 在线VACUUM FULL:仅压缩行数据
  • 索引重建:单独重建或迁移表的索引

并行处理能力

支持并行构建索引,通过指定作业数充分利用多核CPU资源,大幅提升处理效率。

环境要求

PostgreSQL版本支持

  • PostgreSQL 9.5, 9.6, 10, 11, 12, 13, 14, 15, 16, 17, 18
  • PostgreSQL 9.4及更早版本不再支持

磁盘空间需求

执行全表重组需要约两倍于目标表及其索引大小的磁盘空间。例如,如果待重组表和索引的总大小为1GB,则需要额外2GB的磁盘空间。

安装步骤

步骤一:获取源码

git clone https://gitcode.com/gh_mirrors/pg/pg_repack cd pg_repack

步骤二:编译安装

make sudo make install

步骤三:启用扩展

-- 连接到目标数据库 psql -U your_username -d your_database -- 创建pg_repack扩展 CREATE EXTENSION pg_repack;

使用方法

基本命令格式

pg_repack [OPTION]... [DBNAME]

常用选项说明

重组选项
  • -a, --all:重组集群中的所有数据库
  • -t, --table=TABLE:仅重组指定的表
  • -I, --parent-table=TABLE:重组指定父表及其继承表
  • -c, --schema=SCHEMA:仅重组指定模式中的表
  • -o, --order-by=COLUMNS:按照指定列进行在线CLUSTER
  • -n, --no-order:执行在线VACUUM FULL
连接选项
  • -d, --dbname=DBNAME:指定要连接的数据库名
  • -h, --host=HOSTNAME:指定数据库服务器主机名
  • -p, --port=PORT:指定数据库服务器端口
  • -U, --username=USERNAME:指定连接用户名
高级功能
  • -j, --jobs=NUM:为每个表使用指定数量的并行作业
  • -s, --tablespace=TBLSPC:将重组后的表移动到指定表空间
  • -S, --moveidx:同时将索引移动到新表空间

实用示例

重组所有表

pg_repack --dbname your_database

重组指定表

pg_repack --dbname test --table foo --table bar

仅重组索引

pg_repack -d test --table foo --only-indexes --tablespace tbs

移动指定索引

pg_repack -d test --index idx --tablespace tbs

注意事项

权限要求

只有超级用户或表和索引的所有者才能使用此工具。要以所有者身份运行pg_repack,需要使用--no-superuser-check选项。

表结构要求

目标表必须具有主键,或者至少在一个非空列上具有唯一索引。

限制条件

  • 无法重组临时表
  • 无法按照GiST索引对表进行聚类
  • 在pg_repack工作期间无法对目标表执行DDL命令

故障排除

常见错误处理

  • 权限错误:使用--no-superuser-check选项
  • 版本不匹配:删除旧版本扩展并重新安装
  • 锁冲突:使用--wait-timeout--no-kill-backend选项

清理操作

在发生致命错误后需要手动清理。对于PostgreSQL 9.1及更高版本,在发生错误的数据库中执行DROP EXTENSION pg_repack CASCADE,然后重新创建扩展。

技术原理

全表重组流程

  1. 创建日志表记录对原始表的更改
  2. 在原始表上添加触发器,将INSERT、UPDATE和DELETE操作记录到日志表
  3. 创建包含旧表中所有行的新表
  4. 在新表上构建索引
  5. 将日志表中累积的所有更改应用到新表
  6. 使用系统目录交换表,包括索引和TOAST表
  7. 删除原始表

仅索引重组流程

  1. 使用CONCURRENTLY选项创建与旧索引定义匹配的新索引
  2. 在目录中将旧索引替换为新索引
  3. 删除旧索引

版本兼容性

pg_repack持续更新以支持最新的PostgreSQL版本,同时保持向后兼容性。当前版本支持PostgreSQL 9.5至18版本,为数据库管理员提供了一个可靠的重组工具选择。

通过掌握pg_repack的安装和使用方法,数据库管理员可以在不影响业务运行的情况下,有效优化PostgreSQL数据库的性能和存储效率。

【免费下载链接】pg_repackReorganize tables in PostgreSQL databases with minimal locks项目地址: https://gitcode.com/gh_mirrors/pg/pg_repack

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询