安装使用pg_repack
环境:
OS:Centos 7
DB:pg12
1.查看有那些可以使用的版本
[root@localhost bin]# yum list pg_repack*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.ustc.edu.cn
* epel: mirror.01link.hk
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.edu.cn
Available Packages
pg_repack10.x86_64 1.4.6-1.rhel7 pgdg10
pg_repack11.x86_64 1.4.6-1.rhel7 pgdg11
pg_repack12.x86_64 1.4.6-1.rhel7 pgdg12
pg_repack13.x86_64 1.4.6-1.rhel7 pgdg13
pg_repack_10.x86_64 1.4.8-1.rhel7 pgdg10
pg_repack_11.x86_64 1.4.8-1.rhel7 pgdg11
pg_repack_12.x86_64 1.4.8-1.rhel7 pgdg12
pg_repack_13.x86_64 1.4.8-1.rhel7 pgdg13
pg_repack_14.x86_64 1.4.8-1.rhel7 pgdg14
pg_repack_15.x86_64 1.4.8-1.rhel7 pgdg15
2.安装与pg一致的版本
[root@localhost bin]#yum install pg_repack12.x86_64
3.加载扩展
修改配置文件后重启postgresql
vi /opt/pg12/data/postgresql.conf
shared_preload_libraries = 'pg_repack'
[root@localhost ~]# systemctl stop postgresql-12
[root@localhost ~]# systemctl start postgresql-12
4.数据库中创建扩展
su - postgres
[postgres@localhost data]$ psql
postgres=# CREATE EXTENSION pg_repack;
CREATE EXTENSION
5.查看如何使用
[postgres@localhost ~]$ /usr/pgsql-12/bin/pg_repack -h 192.168.1.102 -U postgres --dry-run -d db_test --table tb_test
INFO: Dry run enabled, not executing repack
Password:
ERROR: pg_repack failed with error: pg_repack 1.4.8 is not installed in the database
[postgres@localhost ~]$
解决办法:需要在具体的库下面安装扩展插件
[postgres@localhost ~]$ psql -h 192.168.1.102 -U postgres -d db_test
Password for user postgres:
psql (12.13)
Type "help" for help.
db_test=#
db_test=# CREATE EXTENSION pg_repack;
CREATE EXTENSION
db_test=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+------------+--------------------------------------------------------------
pg_repack | 1.4.8 | public | Reorganize tables in PostgreSQL databases with minimal locks
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
再次执行(不真正执行dry-run)
[postgres@localhost ~]$ /usr/pgsql-12/bin/pg_repack -h 192.168.1.102 -U postgres --dry-run -d db_test --table tb_test
INFO: Dry run enabled, not executing repack
Password:
INFO: repacking table "public.tb_test"
说明:表tb_test是支持pg_repack的,表必须有主键或者唯一约束
#################模拟删除表释放空间######################
1.查看当前表记录数和大小
db_test=# SELECT pg_size_pretty(pg_total_relation_size('tb_test'));
pg_size_pretty
----------------
2023 MB
(1 row)
db_test=# select count(1) from tb_test;
count
----------
13430004
(1 row)
2.尝试删除数据
db_test=# delete from tb_test;
DELETE 13430004
这个时候再次查看表占用存储大小
db_test=# SELECT pg_size_pretty(pg_total_relation_size('tb_test'));
pg_size_pretty
----------------
288 MB
(1 row)
发现表还是会占用存储空间
3.执行pg_repack
su - postgres
[postgres@localhost ~]$ /usr/pgsql-12/bin/pg_repack -h 192.168.1.102 -U postgres --no-kill-backend -d db_test --table tb_test
Password:
INFO: repacking table "public.tb_test"
WARNING: skipping invalid index: CREATE INDEX idx_name2 ON public.tb_test USING btree (name2)
db_test=# SELECT pg_size_pretty(pg_total_relation_size('tb_test'));
pg_size_pretty
----------------
8192 bytes
(1 row)
这个时候发现空间以及完成释放
上面提示索引失效
db_test=# \d+ tb_test;
Table "public.tb_test"
Column | Type | Collation | Nullable | Default | Storage | S
tats target | Description
------------+-----------------------------+-----------+----------+-------------------------------------+----------+--
------------+-------------
id | bigint | | not null | nextval('tb_test_id_seq'::regclass) | plain |
|
name1 | character varying(32) | | | | extended |
|
name2 | character varying(32) | | | | extended |
|
name3 | character varying(32) | | | | extended |
|
name4 | character varying(32) | | | | extended |
|
name5 | character varying(32) | | | | extended |
|
name6 | character varying(32) | | | | extended |
|
createtime | timestamp without time zone | | | CURRENT_TIMESTAMP | plain |
|
modifytime | timestamp without time zone | | | CURRENT_TIMESTAMP | plain |
|
name7 | character varying(32) | | | | extended |
|
name8 | character varying(32) | | not null | 'aaa'::character varying | extended |
|
Indexes:
"tb_test_pkey" PRIMARY KEY, btree (id)
"idx_name2" btree (name2) INVALID
Access method: heap
重建索引
db_test=# reindex index idx_name2;
REINDEX
说明:
1.pg_repack期间可以对表进行DML
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-12-02 redis-faina
2020-12-02 centos7使用RAC其中一个节点作为同步服务器
2019-12-02 12C 删除统一审计信息
2019-12-02 pdb删除后重新加入