点击上方蓝字关注我

PostgreSQL数据库表在删除数据后磁盘空间未释放,该怎么办?
主流的压缩表工具有哪些?该如何选择?

1、从空间未释放说起

近期生产环境出现一张表占用size已达2T,且会定期删除记录,但是,空间一直未释放,是何原因?

原因就在于vacuum,而vacuum怎么存储,清理数据的可参考官方文档进行查看。https://www.postgresql.org/docs/current/routine-vacuuming.html

出现表一直膨胀,该如何处理?开源社区的魅力就在于很多大神会提供很多工具来解决对应的问题,而本问题则有2种主要的工具:pg_repackpgcompacttable

2. 工具对比

2.1 pg_repack

pg_repack的处理方式是创建一张新表,再将历史数据从原表中拷贝一份到新表。在拷贝过程中为了避免表被锁定,会创建了一个额外的日志表来记录原表的改动,并添加了一个涉及INSERT、UPDATE、DELETE操作的触发器将变更记录同步到日志表。当原始表中的数据全部导入到新表中,索引重建完毕以及日志表的改动全部完成后,pg_repack会用新表替换旧表,并将原旧表Drop掉。此工具过程简单且靠谱,单需要额外的磁盘空间来报错临时创建的中间表。

2.2 pgcompacttable

pgcompacttable利用了PostgreSQL的一个有趣特性:在执行INSERT和UPDATE操作时,会将所有新版本的行移到表最开始的可用空间。此为pgcompacttable工具的关键,因为如果从末端反向开始更新所有行,最终所有可用空间被这些行填充,并将表尾部的空间全部释放以便让定期vacuum进行truncate。这样一来,pgcompacttable通过批量更新和vacuum强制移动,最终整个表被重新整理,达到压缩的效果。此工具对磁盘空间要求低,且性能影响可控。

2.3 对比

为了便于大家选择工具,简单做了一个对比说明供参考。

pg_repack pgcompacttable
是否需要保证性能
是否移动表/索引
是否有足够空间
压缩速率是否高

小结:因很多场景下磁盘空间有限,因而经常选择使用pgcompacttable较多,下面就记录一下pgcompacttable的安装及使用。

3. pgcompacttable部署及使用实例

3.1 添加pgstattuple

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

yum install perl-Time-HiRes perl-DBI perl-DBD-Pg -y
cd contrib/
make
make  install

编译完成后会产生几个文件

lib/pgstattuple.so

share/extension/pgstattuple*

之后在所需要使用的数据库里添加pgstattuple

psql -d testdbtestdb=# create extension if not exists pgstattuple;
CREATE EXTENSION

3.2 部署pgcompacttable

下载依赖及安装包后即可使用

# yum install perl-Time-HiRes perl-DBI perl-DBD-Pg -y
# su - postgres
$ git clone https://github.com/dataegret/pgcompacttable.git

3.3 pgcompacttable使用

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

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

往期精彩回顾

1.  MySQL高可用之MHA集群部署

2.  mysql8.0新增用户及加密规则修改的那些事

3.  比hive快10倍的大数据查询利器-- presto

4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

5.  PostgreSQL主从复制--物理复制

6.  MySQL传统点位复制在线转为GTID模式复制

7.  MySQL敏感数据加密及解密

8.  MySQL数据备份及还原(一)

9.  MySQL数据备份及还原(二)

扫码关注

PostgreSQL表膨胀终结者相关推荐

  1. PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack

    PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack 作者 digoal 日期 2016-10-30 标签 PostgreSQL , pg_repack , pg ...

  2. PostgreSQL 磁盘空间的保护伞 PG_repack VS 表膨胀

    PG 最近的使用中,发现这个数据库确确实实是一个无底洞,东西太多了,但学习一样东西都是通过主干和分支的方式来学习,后续的学习其实有的时候是靠自觉和运气. 今天要说的pg_repack,这个插件,如果您 ...

  3. 关于PostgreSQL空间膨胀的研究

    首先,我们先启用一个数据库自带的控件方便对数据情况进行分析 create extension pgstattuple; 然后,还需要一个存储过程方便快速的制造数据 create function f1 ...

  4. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  5. PostgreSQL表的行数统计

    PostgreSQL表的行数统计 在很多情况下我们需要知道一个表的记录数有多少.如果你发现你有这样的需求,你还应该问问这样的统计的精确度到底又多高.如果你在做会计报表,你需要非常的精确.如果你做一个网 ...

  6. 金仓数据库 KingbaseES Sys_repack 解决金仓数据库 KingbaseES 表膨胀的问题

     关键字 表膨胀 vacuum 索引膨胀 无锁处理 问题描述 详细描述问题现象,必要时可添加图片.表或索引发生膨胀后,用户可以使用vacuum full重建表,但是vacuum full需要持有排它锁 ...

  7. postgresql 表分区

    postgresql 表分区 背景 一个大表查询性能往往不高, 其原因在于数据加载 data load,扫描数据 table scans ,内存交换 memory swap 等等操作的时间成本会随着数 ...

  8. Greenplum查看表/库大小、进程、表膨胀处理(sql语句)

    查询表相关进程 select a.pid from pg_locks a, pg_class b, pg_stat_activity c where a.relation = b.oid and a. ...

  9. Postgresql 表bloating 怎么办 ---pg_bloat_check 你造(知道)吗?

    基于PG 的原理表膨胀的问题估计现在就算是PG的边缘人士都知道了,这实际上也不是什么缺点, 只是集中和分散的设计理念的不同而已. 但监控表的bloating 那倒是一项必须的工作. 在PG内部通过SQ ...

最新文章

  1. python利用管道popen调用.exe进行交互
  2. 如何修改SAP标准数据元素文本
  3. 【趣话编程】如果张东升是个程序员
  4. python求n的阶乘_python求n的阶乘
  5. 7怎样设置禁网_怎样才能提升网站内页的收录?
  6. c语言网络定向拉取数据,用C模拟了一个http请求,但是recv函数接收的数据不完整且欠安顺序获取信息...
  7. 美国喜提刷脸登机,官方开心发通告,竟马上引发公民不适
  8. 和秋叶一起学Excel 阿里云盘
  9. java获取民族代码
  10. 【Spark NLP】第 5 章:处理词
  11. JavaScript高级学习之彩色小球球
  12. vue-router 如何在新窗口打开页面
  13. 工单流转 指派 php,第三节 工单的指派和处理
  14. 2022年京东618店庆活动优惠力度怎么样?
  15. The Things Network LoRaWAN Stack V3 学习笔记 2.7.1 Web 前端开发调试
  16. 在 macOS 中如何使用 XPC 实现跨进程通讯?
  17. Voyager的Roles和Pemissions
  18. 最新整理Q萌回合手游/青灯奇缘+GM授权后台
  19. 全网最详细的Gephi安装与使用教程
  20. 插画喵课程 玫瑰花怎么画教程(详细步骤)

热门文章

  1. CPU占用率爆满,服务器遭遇挖矿如何排查
  2. 宏基因组分析步骤Linux,宏基因组--简单流程(代码)
  3. 黑客逆向破解基础-3:如何识别程序加的什么壳
  4. ubuntu快捷复制粘贴
  5. 阿里云数据库与传统数据库有何区别?
  6. [论文阅读] ICCV2015 Joint Fine-Tuning in Deep Neural Networks for Facial Expression Recognition
  7. Project中最常用的注意点
  8. 三肽Gly-Cys-Gly、88440-55-5
  9. 软件测试简历上的职业技能怎么写,测试工程师岗位个人简历个人技能范文
  10. SpringCloud微服务项目的api文档聚合