pg_repack安装及使用

1.pg_repack是一个可以在线重建表和索引的扩展。它会在数据库中建立一个和需要清理的目标表一样的临时表,将目标表中的数据COPY到临时表,并在临时表上建立与目标表一样的索引,然后通过重命名的方式用临时表替换目标表

os:centos 7.4

数据库:postgresql 10.5

pg_repack-1.4.6

2.安装

[postgres@node1 ~]$ unzip pg_repack-1.4.6.zip
[postgres@node1 ~]$ ll
total 248
drwxrwxr-x 8 postgres postgres    184 Oct  4  2019 pg_repack-1.4.6
-rwxr--r-- 1 postgres postgres 125523 May 28 15:23 pg_repack-1.4.6.zip
[postgres@node1 ~]$ cd pg_repack-1.4.6/
[postgres@node1 pg_repack-1.4.6]$ ll
total 16
drwxrwxr-x 3 postgres postgres   71 Oct  4  2019 bin
-rw-rw-r-- 1 postgres postgres 1662 Oct  4  2019 COPYRIGHT
drwxrwxr-x 2 postgres postgres  121 Oct  4  2019 doc
drwxrwxr-x 3 postgres postgres  139 Oct  4  2019 lib
-rw-rw-r-- 1 postgres postgres 1616 Oct  4  2019 Makefile
-rw-rw-r-- 1 postgres postgres 1285 Oct  4  2019 META.json
drwxrwxr-x 2 postgres postgres  219 Oct  4  2019 msvc
-rw-rw-r-- 1 postgres postgres 2201 Oct  4  2019 README.rst
drwxrwxr-x 4 postgres postgres   96 Oct  4  2019 regress
drwxrwxr-x 2 postgres postgres   54 Oct  4  2019 SPECS
[postgres@node1 pg_repack-1.4.6]$ make

postgres@node1 pg_repack-1.4.6]$ psql
psql (12.2)
Type "help" for help.

postgres=# create extension pg_repack;
CREATE EXTENSION
postgres=# \dn
    List of schemas
    Name    |  Owner   
------------+----------
 public     | postgres
 repack     | postgres
 tbase      | postgres
 tbase_pgxz | tbase
(4 rows)

postgres=# \dx
                                  List of installed extensions
   Name    | Version |   Schema   |                         Description                          
-----------+---------+------------+--------------------------------------------------------------
 pg_repack | 1.4.6   | public     | Reorganize tables in PostgreSQL databases with minimal locks
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

测试:

--安装pgstattuple模块(提供多种函数来获得元组层的统计信息) 

postgres=# create extension pgstattuple;
CREATE EXTENSION

--建测试表(表必须有主键或者唯一约束)

postgres=# create table repack_test(id int primary key ,name varchar(10));
CREATE TABLE

postgres=# \d repack_test
                   Table "public.repack_test"
 Column |         Type          | Collation | Nullable | Default 
--------+-----------------------+-----------+----------+---------
 id     | integer               |           | not null | 
 name   | character varying(10) |           |          | 
Indexes:
    "repack_test_pkey" PRIMARY KEY, btree (id)

--插入测试数据
postgres=# insert into repack_test select generate_series(1,50000000),'a';
INSERT 0 50000000

--用pg_stattuple查看表情况
postgres=# select * from pgstattuple('repack_test');
 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
 181239808 |     5000000 | 150000000 |         82.76 |                0 |              0 |                  0 |     620336 |         0.34
(1 row)

--查看表大小postgres=# \dt+ repack_test
                       List of relations
 Schema |    Name     | Type  |  Owner   |  Size  | Description 
--------+-------------+-------+----------+--------+-------------
 public | repack_test | table | postgres | 173 MB | 
(1 row)


--更新数据

postgres=# update repack_test set name ='b' where id<2500000;
UPDATE 2499999

--再用pg_stattuple查看表情况
postgres=# select * from pgstattuple('repack_test');
 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
 271859712 |     5000000 | 150000000 |         55.18 |          2499999 |       74999970 |              27.59 |     930540 |         0.34
(1 row)

--在此执行pg_repack
[postgres@node1 contrib]$ pg_repack -p 5432 -d postgres --no-order --table repack_test
INFO: repacking table "public.repack_test"
--再用pg_stattuple查看表情况
postgres=# select * from pgstattuple('repack_test');
 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
 271859715 |     5000000 | 150000000 |         82.76 |                0 |              0 |                  0 |     620336 |         0.34
(1 row)


在线pg_repack

repack数据库

postgres@node1 contrib]$ pg_repack -p 5432 -d postgres --no-order --jobs 4  --elevel=info

repack模式

 pg_repack -p 5432 -d postgres --schema=public --no-order --jobs 4  --elevel=info

repack表和索引

pg_repack -p 5432 -d postgres --no-order --table public.repack_test --elevel=info

repack所有索引

pg_repack -p 5432 -d postgres --no-order --only-indexes --table public.repack_test --elevel=info

repack指定索引

 pg_repack -p 5432 -d postgres  --index public.repack_test_pkey --elevel=info

参考文章

https://www.cnblogs.com/zhangfx01/archive/2004/01/13/14267667.html

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值