RDS PostgreSQL支持通过插件pg_repack在线清理表空间,有效解决因对全表大量更新等操作引起的表膨胀问题。pg_repack无需获取排它锁,相比CLUSTER或VACUUM FULL更加轻量化。
前提条件
-
请确保实例大版本满足要求,本插件具体支持的实例大版本,请参见支持插件列表。
-
如实例大版本已满足要求,但仍提示不支持,请升级内核小版本,具体操作,请参见升级内核小版本。
注意事项
功能介绍
pg_repack插件支持全表repack和索引repack。
-
对整表数据进行repack的实现原理如下:
-
创建日志表记录对原表的变更。
-
在原表创建触发器,将原表的INSERT、UPDATE和DELETE操作记录到日志表中。
-
创建新表,与原表的行列相同。
-
在新表中创建索引。
-
将日志表里的变更应用到新表。
-
在system catalog交换新旧表。
-
删除旧表。
说明
pg_repack会在第a、b步和第f、g步短暂持有ACCESS EXCLUSIVE锁。其余步骤pg_repack只需要持有原表的ACCESS SHARE锁,不影响原表的INSERT、UPDATE和DELETE。
-
-
对表中索引进行repack的实现原理如下:
-
以CONCURRENTLY方式创建新索引。
-
在system catalog交换新旧索引。
-
删除旧索引。
-
插件开启与关闭
说明
请使用高权限账号执行如下命令。
-
开启插件。
CREATE EXTENSION pg_repack;
-
关闭插件。
DROP EXTENSION pg_repack;
安装客户端
pg_repack插件需要配合客户端使用,以ECS Alibaba Cloud Linux 3.2104及以上版本为例,参考以下命令:
-
安装环境依赖。
sudo yum install postgresql* redhat-rpm-config libpq* openssl-devel readline-devel -y
-
添加环境变量。
export PATH=$PATH:/usr/lib64/pgsql/postgresql-12/bin
-
下载pg_repack客户端并编译安装。
wget https://github.com/reorg/pg_repack/archive/refs/tags/ver_1.4.6.tar.gz tar zxvf ver_1.4.6.tar.gz cd pg_repack-ver_1.4.6 make && make install
使用示例
-- 检查但不执行:--dry-run
pg_repack --dry-run --no-superuser-check --echo --no-order -h 连接串 -p 端口 -d database1 -U user --table schema1.table1
-- 检查并执行
pg_repack --no-superuser-check --echo --no-order -h 连接串 -p 端口 -d database1 -U user --table schema1.table1
常见问题
Q:报错“ERROR: pg_repack failed with error: You must be a superuser to use pg_repack”。
A:请使用-k或–no-superuser-check,避免没有权限。
重要
全表repack时,无法通过此方式拥有权限。
相关参考
pg_repack的详细说明可参考pg_repack官方帮助文档。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/156103.html