postgresql数据库表膨胀之pg_repack安装及使用

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

环境:

1)redhat-release:CentOS Linux release 7.6.1810 (Core)

2)database version:postgresql 14.6

一、部署pg_repack

--解压编译

[postgres@tencent soft]$ unzip pg_repack-master.zip

[postgres@tencent soft]$ cd pg_repack-master/

[postgres@tencent pg_repack-master]$ ll

total 36

drwxrwxr-x 3 postgres postgres 4096 Jun 15 04:53 bin

-rw-rw-r-- 1 postgres postgres 1662 Jun 15 04:53 COPYRIGHT

drwxrwxr-x 2 postgres postgres 4096 Jun 15 04:53 doc

drwxrwxr-x 3 postgres postgres 4096 Jun 15 04:53 lib

-rw-rw-r-- 1 postgres postgres 1616 Jun 15 04:53 Makefile

-rw-rw-r-- 1 postgres postgres 1381 Jun 15 04:53 META.json

drwxrwxr-x 2 postgres postgres 4096 Jun 15 04:53 msvc

-rw-rw-r-- 1 postgres postgres 2191 Jun 15 04:53 README.rst

drwxrwxr-x 4 postgres postgres 4096 Jun 15 04:53 regress

[postgres@tencent pg_repack-master]$ make &&make install

--所在数据库安装pg_repack扩展

[postgres@tencent pg_repack-master]$ psql -d testdb test

psql (14.6)

Type "help" for help.

testdb=# select * from pg_available_extensions where name like 'pg_repack*';

 name | default_version | installed_version | comment

------+-----------------+-------------------+---------

(0 rows)

testdb=# create extension pg_repack;

CREATE EXTENSION

testdb=# \dx

                         List of installed extensions

Name   | Version |   Schema   |                      Description

-------+-------+----------+---------------------------------------

 btree_gist   | 1.6     | test    | support for indexing common datatypes in GiST

 pageinspect    | 1.9     | public   | inspect the contents of database pages at a low level

 pg_freespacemap | 1.2     | test   | examine the free space map (FSM)

 pg_repack    | 1.4.8   | test    | Reorganize tables in PostgreSQL databases with minimal locks

 pg_visibility   | 1.2     | test    | examine the visibility map (VM) and page-level visibility info

 pgstattuple     | 1.5     | test     | show tuple-level statistics

 plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language

(7 rows)

--查看pg_repack包含的函数

testdb=# \dxS+ pg_repack

                       Objects in extension "pg_repack"

                              Object description

------------------------------------------------------------------

 function repack.conflicted_triggers(oid)

 function repack.disable_autovacuum(regclass)

 function repack.get_alter_col_storage(oid)

 function repack.get_assign(oid,text)

 function repack.get_columns_for_create_as(oid)

 function repack.get_compare_pkey(oid,text)

 function repack.get_create_index_type(oid,name)

 function repack.get_create_trigger(oid,oid)

 function repack.get_drop_columns(oid,text)

 function repack.get_enable_trigger(oid)

 function repack.get_index_columns(oid,text)

 function repack.get_order_by(oid,oid)

 function repack.get_storage_param(oid)

 function repack.get_table_and_inheritors(regclass)

 function repack.oid2text(oid)

 function repack.repack_apply(cstring,cstring,cstring,cstring,cstring,integer)

 function repack.repack_drop(oid,integer)

 function repack.repack_indexdef(oid,oid,name,boolean)

 function repack.repack_index_swap(oid)

 function repack.repack_swap(oid)

 function repack.repack_trigger()

 function repack.version()

 function repack.version_sql()

 schema repack

 view repack.primary_keys

 view repack.tables

(26 rows)

二、安装pgstattuple模块

(提供多种函数来获得元组层的统计信息)

testdb=# create extension pgstattuple;

CREATE EXTENSION

三、创建测试环境

3.1 创建表(表必须有主键或者唯一约束)

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

CREATE TABLE

testdb=# \d repack_test

                    Table "test.repack_test"

 Column |         Type          | Collation | Nullable | Default

--------+-----------------------+-----------+----------+---------

 id     | integer               |           | not null |

 name   | character varying(10) |           |          |

Indexes:

"repack_test_pkey" PRIMARY KEY, btree (id)

3.2 插入数据

testdb=# insert into repack_test select generate_series(1,50000000),'a';

INSERT 0 50000000

--用pg_stattuple查看表情况

testdb=# 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

------------+-------------+------------+---------------+------------------+----------------+--------------------+------------+--------------

 1812389888 |    50000000 | 1500000000 |         82.76 |                0 |              0 |                  0 |    6195196 |         0.34

(1 row)

--查看表大小

testdb=# select pg_size_pretty(pg_relation_size('repack_test'));

 pg_size_pretty

----------------

 1728 MB

(1 row)

3.3 修改表数据

--update 表repack_test

testdb=# update repack_test set name ='b' where id<2500000;

UPDATE 2499999

--用pg_stattuple查看表情况

testdb=# 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

------------+-------------+------------+---------------+------------------+----------------+--------------------+------------+--------------

 1903009792 |    50000000 | 1500000000 |         78.82 |          2499999 |       74999970 |               3.94 |    6505400 |         0.34

(1 row)

可以发现产生了2499999条死亡元组。

--查看表大小

testdb=# select pg_size_pretty(pg_relation_size('repack_test'));

 pg_size_pretty

----------------

 1815 MB

(1 row)

四、执行pg_repack

--执行pg_repack

[postgres@tencent bin]$ ./pg_repack -p 4519 -d testdb -Utest --no-order  --table test.repack_test

INFO: repacking table "test.repack_test"

# test.repack_test 表示test模式下repack_test表,默认自动查找postgres数据库下表repack_test,执行过程中会报没有发现表,所以需要指定schema。

另,此处执行没有输入密码,因为配置了.pgpass文件

--用pg_stattuple查看表情况

testdb=# 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

------------+-------------+------------+---------------+------------------+----------------+--------------------+------------+--------------

 1812389888 |    50000000 | 1500000000 |         82.76 |                0 |              0 |                  0 |    6195196 |         0.34

(1 row)

当前死亡元组数归零。

--查看表大小

testdb=# select pg_size_pretty(pg_relation_size('repack_test'));

 pg_size_pretty

----------------

 1728 MB

(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

代码随想录算法训练营第五十九天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 一、力扣123.买卖股票的最佳时机III 题目链接 思路&#xff1a;之前的类型是用数组记录当前是持有还是不持有&#xff0c;而这道题目多了两种状态&#xff0c;即为&#xff0c;第一次持…

Vue实现leafletMap自定义绘制线段 并且删除指定的已绘制的点位

效果&#xff1a;点击表格可实现选中地图点位&#xff0c;删除按钮点击可删除对应点位并且重新绘制线段&#xff0c;点击确定按钮 保存已经绘制的点位信息传给父组件 并且该组件已实现回显 完整的组件代码如下 文件名称为&#xff1a; leafletMakePointYt <!--* Descripti…

云原生周刊:Kubeflow 成为 CNCF 项目

开源项目推荐 OpenKruiseGame OpenKruiseGame&#xff08;OKG&#xff09;是简化游戏服云原生化的自定义 Kubernetes 工作负载&#xff0c;相比 Kubernetes 内置的无状态&#xff08;Deployment&#xff09;、有状态&#xff08;StatefulSet&#xff09;等工作负载而言&#…

FPGA优质开源模块 - SRIO

本文介绍一个FPGA常用模块&#xff1a;SRIO&#xff08;Serial RapidIO&#xff09;。SRIO协议是一种高速串行通信协议&#xff0c;在我参与的项目中主要是用于FPGA和DSP之间的高速通信。有关SRIO协议的详细介绍网上有很多&#xff0c;本文主要简单介绍一下SRIO IP核的使用和本…

SIFT算法原理:SIFT算法详细介绍

前面我们介绍了Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。…

机器学习完整路径

一个机器学习项目从开始到结束大致分为 5 步&#xff0c;分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。是一个循环迭代的过程&#xff0c;优秀的模型都是一次次迭代的产物。 定义问题 要剖析业务场景&#xff0c;设定清晰的目标…

Excel技巧 - 管理规则设置一行变色

如何设置某一列单元格的值大于一个值时&#xff0c;该单元格所在的一整行都变色呢&#xff1f; 1、先框选内容区域&#xff0c;点击开始&#xff0c;条件格式&#xff0c;新建规则 2、如果销量大于20&#xff0c;则该行都变为绿色 编辑格式选择&#xff1a;使用公式确定要设置…

【MySQL】存储过程(十一)

🚗MySQL学习第十一站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的工作,可以减少数据在数据库和应用服务器之间的传输,…

大数据技术之Clickhouse---入门篇---SQL操作、副本

星光下的赶路人star的个人主页 积一勺以成江河&#xff0c;累微尘以崇峻极 文章目录 1、SQL操作1.1 Insert1.2 Update 和 Delete1.3 查询操作1.4 alter操作1.5 导出数据 2、副本2.1 副本写入流程2.2 配置步骤 1、SQL操作 基本上来说传统关系型数据库&#xff08;以 MySQL 为例…

九五从零开始的运维之路(其二十七)

文章目录 前言一、SQL语句类型1.DDL2.DML3.DCL4.DQL 二、数据库操作1.查看数据库2.创建数据库3.进入数据库4.删除数据库5.更改数据库 三、数据表操作1.数据类型&#xff08;一&#xff09;数值类型&#xff08;二&#xff09;时间\日期类型&#xff08;三&#xff09;字符串类型…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Android中的ContentProvider

Android中的ContentProvider 在Android中&#xff0c;ContentProvider是四大组件之一&#xff0c;用于在不同应用程序之间共享和管理数据。它提供了一种标准化的方式来访问和管理应用程序的数据&#xff0c;使得多个应用程序可以安全地共享数据&#xff0c;而无需直接访问彼此…

phpstudy 进行 composer 全局配置

背景 因为注意到&#xff0c;使用 phpStudy 进行环境搭建时&#xff0c;有时需要使用 composer 每次都需要查找资料进行配置&#xff0c; 在此进行记录笔记&#xff0c;方便有需要的道友借鉴 配置 版本&#xff1a;composer1.8.5&#xff08;phpStudy8 当前只能安装这一个版本…

Flink作业调度的9种状态

1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot&#xff0c;每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成&#xff0c;比如并行度为 n 的 MapFunction 和 并行度为 n 的…

省份数量(力扣)深度优先 JAVA

有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市。 给你一个 …

前端面试的性能优化部分(3)每篇10题

21.如何优化移动端网页的性能&#xff1f; 优化移动端网页的性能是提升用户体验、降低用户流失的关键。以下是一些优化移动端网页性能的常见方法&#xff1a; 压缩和合并资源&#xff1a; 压缩 CSS、JavaScript 和图片等静态资源&#xff0c;减少文件大小&#xff0c;同时合并…

作为一个老程序员,想对新人说什么?

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

git管理工具学习(二)——git图谱git常用命令

git操作目录 Git的安装和图谱版本控制工具介绍git图谱详解 Git基本配置git 的最小配置查看Git的文件类型以及文件内容 Git的本地仓库基本使用创建一个git仓库创建并提交一个文件给文件重命名的简便方法工作区直接提交从缓存区清除一个文件通过git log 查看历史变化 工作区&…

CNVD-2023-12632 泛微e-cology9 sql注入 附poc

目录 漏洞描述影响版本漏洞复现漏洞修复 众亦信安&#xff0c;中意你啊&#xff01; 微信搜索&#xff1a;众亦信安&#xff0c;回复关键字&#xff1a;230317 领批量检测脚本。 声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法…

【Golang】Golang进阶系列教程--Go 语言 context 都能做什么?

文章目录 前言核心是 Context 接口&#xff1a;包含四个方法&#xff1a;遵循规则WithCancelWithDeadlineWithTimeoutWithValue 前言 很多 Go 项目的源码&#xff0c;在读的过程中会发现一个很常见的参数 ctx&#xff0c;而且基本都是作为函数的第一个参数。 为什么要这么写呢…