postgresql表膨胀处理之pgcompacttable部署及使用

环境:

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

2)database version:postgresql 14.6

一、添加pgstattuple

pgcompacttable工具使用过程中需要依赖pgstattuple,因此需先添加pgstattuple。如果是源码安装的postgresql,则源码里包含了postgresql-contrib,因此,进行编译及安装即可。

--编译

cd /postgresql/soft/postgresql-14.6/contrib/pgstattuple

make

make  install

本次实验没有编译也可以直接使用。

--在所需要使用的数据库里添加pgstattuple。

[postgres@tencent ~]$ psql -d testdb -Utest

psql (14.6)

Type "help" for help.

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

    name     | default_version | installed_version |           comment

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

 pgstattuple | 1.5             |               | show tuple-level statistics

(1 row)

testdb=#create extension pgstattuple;

CREATE EXTENSION

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

    name     | default_version | installed_version |           comment

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

 pgstattuple | 1.5             | 1.5               | show tuple-level statistics

(1 row)

安装完成后,installed_version显示安装的版本

--查看pgstattuple可使用的函数

testdb=# \dxS+ pgstattuple

  Objects in extension "pgstattuple"

          Object description

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

 function pg_relpages(regclass)

 function pg_relpages(text)

 function pgstatginindex(regclass)

 function pgstathashindex(regclass)

 function pgstatindex(regclass)

 function pgstatindex(text)

 function pgstattuple_approx(regclass)

 function pgstattuple(regclass)

 function pgstattuple(text)

(9 rows)

二、部署pgcompacttable

安装前需要安装pgstattuple插件,因为要基于该插件去查找膨胀的表,所以如果有大表的情况下,因为pgstattuple会扫全表,所以会比较耗时,这个在使用的时候一定要注意一下。

原理:

从表的头部填充新的行,在普通vacuum时候,截断表末尾的空page,达到收缩空间的效果。不需要占用额外的空间,使得表文件更加紧凑。而且不会加比较重的锁。对性能影响较小。

--安装依赖包

[root@tencent ~]# yum install perl-Time-HiRes perl-DBI perl-DBD-Pg –y

--上传解压安装包

上传pgcompacttable-master.zip 到/postgresql/soft目录,unzippgcompacttable-master.zip

--查看文件

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

[postgres@tencent pgcompacttable-master]$ ls

bin  README.md

[postgres@tencent pgcompacttable-master]$ cd bin

[postgres@tencent bin]$ ls

Pgcompacttable

三、准备测试环境

3.1 创建表

--创建表

testdb=#create table test (id in,sex char(2),name varchar(10),now_address text,address text);

--插入数据

testdb=# insert into test values(generate_series(1,10000),repeat(chr(int4(random()*26)+65),1),repeat(chr(int4(random()*26)+65),6),repeat(chr(int4(random()*26)+65),30),repeat(chr(int4(random()*26)+65),30));

INSERT 0 10000

--创建索引

testdb=# create index on test(id,sex);

CREATE INDEX

testdb=# create index on test(name,now_address,address);

CREATE INDEX

--查看表大小

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

 pg_size_pretty

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

 1072 kB

(1 row)

testdb=# select count(*) from test;

 count

-------

 10000

(1 row)

3.2 模拟修改数据

创建脚本:

[postgres@tencent scripts]$ vi test_mod.sh

#!/bin/bash

#version:  1.0

#function: bulk update data

for((i=1;i<=10000;i++));

do

    a=`tr -dc A-Z[ < /dev/urandom | head -c1`

    psql -Utest -h 127.0.0.1 -d testdb -c "update test set name=repeat( chr(int4(random()*26)+65),6),now_address=repeat( chr(int4(random()*26)+65),30),address=repeat( chr(int4(random()*26)+65),30)  where sex='$a';" >>/dev/null

    if [ $? == 0 ]

       then

           echo "$a is ok" >>update.log

       else

           echo "$a is close" >>update.err.log

       exit 1;

    fi

done

3.3 膨胀再现

为了执行脚本不输入密码,创建了.pgpass文件

--查看postgres家目录

[postgres@tencent bin]$ grep postgres /etc/passwd

postgres:x:601:601::/home/postgres:/bin/bash

--创建.pgpass

touch /home/postgres/.pgpass

chown postgres. /home/postgres/.pgpass

chmod 600 /home/postgres/.pgpass

--配置.pgpass

[postgres@tencent ~]$ echo "127.0.0.1:4519:testdb:test:test" >>./.pgpass

--连接测试

[postgres@tencent ~]$ psql -h 127.0.0.1 -d testdb -Utest

psql (14.6)

Type "help" for help.

testdb=#

连接成功。

--执行批量修改脚本

[postgres@tencent scripts]$ sh test_mod.sh

--查看元组的统计信息

testdb=# SELECT * FROM pgstattuple('test');

 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent

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

 27795456 | 10258 | 1025800 | 3.69 | 19617 |  1961700 | 7.06 | 24071216 |   86.6

(1 row)

pgstattuple 输出列如下:

    字段              类型            描述

table_len           bigint       物理关系长度,以字节计

tuple_count         bigint       活的元组的数量

tuple_len           bigint       活的元组的总长度,以字节计

tuple_percent       float8       活的元组的百分比

dead_tuple_count    bigint       死的元组的数量

dead_tuple_len      bigint       死的元组的总长度,以字节计

dead_tuple_percent  float8       死的元组的百分比

free_space          bigint       空闲空间总量,以字节计

free_percent        float8       空闲空间的百分比

 

--查看表的大小

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

 pg_size_pretty

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

 27 MB

(1 row)

存1w条数据原表大小1096 KB,目前27MB

四、pgcompacttable使用

pgcompacttable可以对database级别、schema级别、table级别进行压缩

./pgcompacttable -h localhost -U postgres -d testdb

./pgcompacttable -h localhost -U postgres -d testdb  -n test

./pgcompacttable -h localhost -U postgres -d testdb -n test -t test

[postgres@tencent bin]$ ./pgcompacttable -h 127.0.0.1 -U test -d testdb

 

--查看压缩后的表

testdb=# SELECT * FROM pgstattuple('test');

 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent

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

1114112 |    10000 |   1000000 |    89.76 |     0 |      0 |                  0 |   12456 |     1.12

(1 row)

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

 pg_size_pretty

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

 1088 kB

(1 row)

恢复至源表大小。

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

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

相关文章

服务器排查并封禁ip访问

前言 购买的服务器难免会遇到被攻击的情况&#xff0c;当我们发现服务器状态异常时&#xff0c;可以通过连接当前服务器的ip排查一下&#xff0c;并对可疑ip进行封锁禁止。我们可以通过路由跟踪来查看可疑ip。以下是两种解决方案。 解决方案 iptables netstat是一个用于监视…

spring总结

目录 什么是Spring? Spring的优缺点&#xff1f; 优点&#xff1a; 缺点&#xff1a; Spring IOC的理解 Spring AOP的理解 事务的边界为什么放在service层&#xff1f; Spring Bean的生命周期 什么是单例池&#xff1f;作用是什么&#xff1f; 单例Bean的优势 Bean…

企业微信小程序在调用wx.qy.login时返回错误信息qy.login:fail

原因是大概是绑定了多个企业但是在开发者工具中没有选择正确的企业 解决方法&#xff1a; 重新选择企业后即可成功获取code

《Zookeeper》从零开始学Zookeeper源码(二)之数据序列化与通信协议

目录 序列化与反序列化通信协议请求头的数据结构响应头的数据结构 序列化与反序列化 zookeeper的客户端与服务端、服务端与服务端之间会进行一系列的网络通信&#xff0c;在进行数据的传输过程中就涉及到序列化与反序列化&#xff0c;zookeeper使用Jute作为它的序列化组件&…

文字转语音

键盘获取文字&#xff0c;转化为语音后保存本地 from win32com.client import Dispatch from comtypes.client import CreateObject from comtypes.gen import SpeechLib speakerDispatch(SAPI.SpVoice) speaker.Speak(请输入你想转化的文字) datainput(请输入&#xff1a;)#s…

拥抱创新:用Kotlin开发高效Android应用

拥抱创新&#xff1a;用Kotlin开发高效Android应用 引言 在当今数字时代&#xff0c;移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理&#xff0c;移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强&#xff0c;A…

深入了解速卖通详情API:提升商品数据获取与处理效率

1. 速卖通详情API概述 速卖通详情API是通过接口方式获取商品详细信息的一种方法。它可以让开发者按需获取商品的标题、描述、价格、库存等详细数据&#xff0c;为后续的数据分析和处理提供基础。通过API&#xff0c;开发者可以实现自动化的商品数据管理&#xff0c;提高工作效…

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可独立运行。通常与版本管理工具(SCM)、构…

django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏

一、实现的效果 在django项目中,需要使用bootstrap 实现一个左右分布的布局,左侧区域可以折叠隐藏起来,使得右侧的显示区域变大。(为了区分区域,左右加了配色,不好看的修改颜色即可) 点击折叠按钮,左侧区域隐藏,右侧区域铺满: 二、实现思路 1、使用col-md属性,让左…

unity行为决策树实战详解

一、行为决策树的概念 行为决策树是一种用于游戏AI的决策模型&#xff0c;它将游戏AI的行为分解为一系列的决策节点&#xff0c;并通过节点之间的连接关系来描述游戏AI的行为逻辑。在行为决策树中&#xff0c;每个节点都代表一个行为或决策&#xff0c;例如移动、攻击、逃跑等…

助力618-Y的混沌实践之路 | 京东云技术团队

一、写在前面 1、混沌是什么&#xff1f; 混沌工程&#xff08;Chaos Engineering&#xff09;的概念由 Netflix 在 2010 年提出&#xff0c;通过主动向系统中引入异常状态&#xff0c;并根据系统在各种压力下的行为表现确定优化策略&#xff0c;是保障系统稳定性的新型手段。…

K8s中的ConfigMap

ConfigMap作用&#xff1a;存储不加密数据到etcd&#xff0c;让Pod以变量或者Volume挂载到容器中 场景&#xff1a;配置文件 3.以Vlolume挂载到Pod容器中

前端实习day20

今天解决了不少bug&#xff0c;成就感满满&#xff0c;有几个问题困扰了我很久&#xff0c;我查阅了很多博客&#xff0c;终于找到解决思路&#xff0c;顺利解决&#xff0c;这里记录一下解决思路。 1、在通过this.$refs.layoutSide.style设置<a-layout-sider>的宽度时&…

计算机网络-三种交换方式

计算机网络-三种交换方式 电路交换(Circuit Switching) 电话交换机接通电话线的方式称为电路交换从通信资源分配的角度来看&#xff0c;交换(Switching)就是按照某种方式动态的分配传输线路的资源 电话交换机 为了解决电话之间通信两两之间连线过多&#xff0c;所以产生了电话…

TSINGSEE青犀视频汇聚平台EasyCVR多种视频流播放协议介绍

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。今天我们来说一说&#xff0c;EasyCVR平台支持分…

自定义MVC增删改查

目录 mymvcdemo是自定义mvc框架的使用示例 1.1 实体类 1.2 dao方法 1.3 写Service / biz 三层架构 1.4 建action 相当于selvert 1.5 con连接MySQL 8.0 版本 1.6 配置文件 XML 1.7 主界面布局 1.8 增加界面布局 1.9 写tld配置文件 2.0 注意架包 我是已经打包好的 mymv…

ffmpeg-ffplay代码架构简述

全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小&#xff0c;并不需要太频繁…

ELK日志分析系统

文章目录 一. ELK日志分析系统概述1.ELK 简介2.ELK日志分析系统2.1 ElasticSearch2.1.1 ElasticSearch概述2.1.2 ElasticSearch核心概念&#xff08;作用&#xff09; 2.2 Kiabana2.2.1 Kiabana 概念2.2.2 Kiabana 主要功能 2.3 Logstash2.3.1 Logstash 概念2.3.2 Logstash主要…

侧边栏的打开与收起

侧边栏的打开与收起 <template><div class"box"><div class"sideBar" :class"showBox ? : controller-box-hide"><div class"showBnt" click"showBox!showBox"><i class"el-icon-arrow-r…

【爬虫实践】使用Python从网站抓取数据

一、说明 本周我不得不为客户抓取一个网站。我意识到我做得如此自然和迅速&#xff0c;分享它会很有用&#xff0c;这样你也可以掌握这门艺术。【免责声明&#xff1a;本文展示了我的抓取做法&#xff0c;如果您有更多相关做法请在评论中分享】 二、计划策略 2.1 策划 确定您…