一、表膨胀查询与处理

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. 5、基于EasyExcel的导入导出

    一.Apach POI处理Excel的方式: 传统Excel操作或者解析都是利用Apach POI进行操作,POI中处理Excel有以下几种方式: 1.HSSFWorkbook: HSSFWorkbo ...

  2. 网络监测工具之Zabbix的搭建与测试方法(三) ---Zabbix Agent

    安装客户端 在官方网站下载最新版本zabbix agent v6.2.6,然后默认安装,其中配置服务端的界面如下图: 其他一律默认即可. 启用发现功能 如上图所示,开启发现规则,默认搜索zabbix ...

  3. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...

  4. 学习.NET MAUI Blazor(四)、路由

    Web应用程序的可以通过URL将多个页面串联起来,并且可以互相跳转.Web应用主要是使用a标签或者是服务端redirect来跳转.而现在流行的单页应用程序 (SPA) ,则通过路由(Router)来实 ...

  5. css、js 缓存清除

    此种方式完美达到了清除缓存的效果 css引入标签可在一个引号内完成,js引入标签由于解析原因需要将两个标签拆开再组 使用:按照此格式,放在原 <link /> 或 <script&g ...

  6. CodeForces 构造题专项解题报告

    CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...

  7. Linux 查找某一线程是否已运行,并启动的方法

    参考资料:(3条消息) [Linux]守护线程自动重启某个程序的3种常用办法_L7256的博客-CSDN博客_守护进程 自动重启 方法一:使用编写一个监控APP的脚本 start.sh脚本如下:exp ...

  8. lock 和 Monitor (转载)

    Lock和Monitor都是对被操作对象同步控制的方法 Lock 是 Monitor的简化版本,IL callvirt ...Monitor.Enter(object)...leave.s.... c ...

  9. (20)go-micro微服务Elasticsearch使用

    目录 一 Elasticsearch介绍 二 Elasticsearch的主要功能及应用场景 1.Elasticsearch 主要具有如下功能: 2.Elasticsearch 的主要应用场景如下: ...

  10. 双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG

    <template> <div class="mycanvas-container"> <vue-drag-resize :isActive = 't ...