一、表膨胀查询与处理

1、创建扩展

create extension pgstattuple;

2、表膨胀查询

pgstattuple提供了pgstatetuple()和pgstatindex()两个统计表和索引的方法,较系统表pg_class的表统计信息,pgstatetuple()还统计了表中的dead tuples。

如下查询出来表的怕膨胀系数为81%。

select *, 1.0 - tuple_len::numeric table_len as bloat from pgstattuple('tab_brin1');

select * from pg_relpages('tab_brin1');

占用2414个page。

3、表膨胀处理

vacuum (verbose,full,analyze) tab_brin1;

回收完后,膨胀系数降到3%。

select *, 1.0 - tuple_len::numeric table_len as bloat from pgstattuple('tab_brin1');

select * from pg_relpages('tab_brin1');

表占用473个page。

二、数据库防止事务回卷

1、

当前事务只能看到比表上xmin事务号小的记录,txid(事务id)的最大值为32位,即2^32为4294967296(约40亿),当数据库的事务号到达最大值后事务号就用尽了,此时需要重新使用,又从3(0、1、2为保留的事务id,后面会讲)开始。

这就会导致任何原来表上的数据的xmin均大于当前事务号,造成看不到以前的数据现象,这就违背了mvcc的原则。当然postgresql数据库系统不会让这种情况发生,当数据库的年龄到达20亿(后面会讲为什么是20亿)时就要采取措施了,数据库中的表就需要清理事务号(使用vacuum freeze),以此来降低数据库表的年龄。降低数据库的年龄是autovacuum 进程在表的年龄到达阀值后自动进行的,也可以vacuum freeze命令手动执行。autovacuum 操作也有可能会进行部分行freeze而不是全表freeze。

2、VacuumFreeze

为了保证同一个数据库中的最新和最旧的两个事务之间的年龄不超过2^31,postgresql引入了冻结(freeze)功能。

涉及到的术语:

表年龄:当前事务号距上一次执行freeze操作的事务id的差值。

元组年龄:当前元组的xmin距上一次执行freeze操作的事务id的差值。

如果发生当新老事务id差超过21亿的时候,事务号会发生回卷,此时数据库会报出如下错误并且拒绝接受所有连接,必须进入单用户模式执行vacuumfreeze操作。

事务冻结操作:vacuum freeze tab_brin1;

查看指定表的年龄:

SELECT relname, age(relfrozenxid) as xid_age,pg_size_pretty(pg_table_size(oid)) as table_size FROM pg_class WHERE relname = 'tab_brin1';

查询所有数据库的年龄:

select datname, age(datfrozenxid) from pg_database;

3、参数设置

在postgresql中,vacuum是一个比较耗费io的过程,而vacuumfreeze更是被称为“冻结炸弹”,因为涉及到了大量的读写io,读io(datafile)和写io(datafile以及写wal)。对于业务繁忙的库,可能会出现如下情况:

可能有很多大表的年龄会先后到达2亿,数据库的autovacuum会开始对这些表依次进行vacuumfreeze,从而集中式的爆发大量的读写io,数据库和操作系统响应迟缓,如果又碰上业务高峰,会出现很不好的影响。

所以设置好参数尤为重要:

  • 设置vacuum_cost_delay为一个比较高的数值(例如50ms),这样可以减少普通vacuum对正常数据查询的影响。
  • autovacuum_freeze_max_age和vacuum_freeze_table_age的值也不适合设置过大,因为过大会造成pg_clog中的日志文件堆积,来不及清理。我们把autovacuum_freeze_max_age设置为最大值20亿。

  • vacuum_freeze_table_age设置为0.95* autovacuum_freeze_max_age。

  • vacuum_freeze_min_age不宜设置过小,比如我们freeze某个元组后,这个元组马上又被更新,那么之前的freeze操作其实是无用功,freeze真正应该针对的是那些长时间不被更新的元组。

  • 生产环境中做好pg_database.frozenxid的监控,当快达到触发值时,我们应该选择一个业务低峰期窗口主动执行vacuumfreeze操作,而不是等待数据库被动触发。

  • 分区,把大表分成小表。每个表的数据量取决于系统的io能力,前面说了vacuumfreeze是扫全表的,现代的硬件每个表建议不超过32gb,单表数据不要超过3000w。

  • 对大表设置不同的vacuum年龄

  • 用户自己调度 freeze,如在业务低谷的时间窗口,对年龄较大,数据量较大的表进行vacuumfreeze。

  • 年龄只能降到系统存在的最早的长事务即 min(pg_stat_activity.(backend_xid,backend_xmin))。因此也需要密切关注长事务。

PostgreSQL处理膨胀与事务回卷的更多相关文章

  1. KingbaseES应对表年龄增长过快导致事务回卷

    背景 前几天碰到这样一个场景,在KingbaseES数据库当作数据同步节点.其特点是接收过来的数据量巨大,其更新超级频繁,最大的数据库达到6TB.这还不是主要的,主要导致问题发生原因是同步数据库有很多 ...

  2. [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践

    本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...

  3. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  4. SQL 事务回滚

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服 ...

  5. Spring异常抛出触发事务回滚

    Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...

  6. 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

    一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...

  7. SqlServer事务回滚(2)

    SQL Server 2008中SQL应用系列--目录索引 SQL事务 一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是 ...

  8. jfinal 基本应用 --事务回滚

    事务回滚 1.当时需要用到事务回滚,但是看到网上只有问题,没有真实的到底怎么用法. 2.我看了一下文档,结合了网上的大神的博客. 第一种方法: Db.tx(new IAtom(){ @Override ...

  9. Spring @Transactional ——事务回滚

    工作原理运行配置@Transactional注解的测试类的时候,具体会发生如下步骤1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与Dat ...

  10. MySQL(22):事务管理之 事务回滚

    1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时 ...

随机推荐

  1. 七个步骤覆盖 API 接口测试

    接口测试作为最常用的集成测试方法的一部分,通过直接调用被测试的接口来确定系统在功能性.可靠性.安全性和性能方面是否能达到预期,有些情况是功能测试无法覆盖的,所以接口测试是非常必要的.首先需要对接口测试 ...

  2. jmeter websocket 接口测试环境准备

    1.下载jdk并进行安装配置环境 2.下载jmeter,解压可直接使用,无需安装 3.进入下载地址下载plugins-manager.jar 插件 4.将下载好plugins-manager.jar ...

  3. Java基础类String学习分析

    目录 1 String不可变性 2 不可变的好处 3 String+和StringBuilder效率差异 4 String, StringBuffer and StringBuilder 5 Stri ...

  4. 2022年7月10 第四组 周鹏 CSS的基本认识

    CSS 层叠样式表 网页美观 html相当于原材料,css用来加工好看 如何嵌入? 样式如何显示html元素? 样式通常存储在样式表中 把样式表添加到html元素里 定义CSS方式 1,行内样式,可以 ...

  5. Js文件名 排序

    参考了别人帖子后,调整之后的排序方法,更加精确.(参考链接在底部) 压缩版 function strCompare(str1,str2){if(str1==undefined&&str ...

  6. gRPC入门与实操(.NET篇)

    为什么选择 gRPC 历史 长久以来,我们在前后端交互时使用WebApi + JSON方式,后端服务之间调用同样如此(或者更久远之前的WCF + XML方式).WebApi + JSON 是优选的,很 ...

  7. 让 Win8.1 微软拼音新体验模式支持 Metro 应用

    内容回顾: [1]十个步骤找回 Win8 中的微软拼音新体验模式 [2]发布个工具,一键恢复Win8/8.1中的微软拼音长句模式(新体验模式) 在 [1] 中,我们找回了 Win8 里的微软拼音新体验 ...

  8. MySQL中多种排名实现

      一.数据库表结构以及数据 CREATE TABLE `forlan_score` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', ...

  9. Unity - 无限滚动

    今天学习:Unity - UGUI - 无限滚动 目录 今天学习:Unity - UGUI - 无限滚动 版本: 一:思路分享(Share idea) 二:脚本编写(Scripts) 三:场景面板布置 ...

  10. Unity跑在Awake之前的方法

    Unity跑在Awake之前的方法 一.前言 相信大家和小黑一样,在写项目的时候遇到过以下这中情况: ____两个脚本的Awake中,都有获取信息的函数被调用.可是A脚本在B脚本获取到信息之后,才可以 ...