POSTGRESQL vacuum_freeze系列中 三个参数与 vacuum的关系

news/2024/7/9 22:44:38 标签: postgresql, 数据库, mysql

127a7e03723aa80b4c9394e463d59205.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700人左右 1 + 2)。

最近在整理VACUUM 相关知识的时候,发现一个问题对于 vacuum_freeze 的3个参数的概念掌握的不牢固,那么只能进行恶补了。本次的三个参数是

vacuum_freeze_min_age   

vacuum_freeze_table_age    

autovacuum_freeze_max_age

——————————————————————————————

c4d902a87b328a3a62d87845db1c6620.png

我看看下图,下图中的一个圆是有缺口的,并且缺口的位置一直在变化,vacuum_freeze_min_age 就是这个缺口的  弧长。这个参数是针对表的,对于表,想到这里,根据图,大家应该会提出第二个问题,

e0dfb39f26c926e30b278fdd4ad5b27b.png

eb1918927fdd3483fe8c854047d50534.png

图中的 A  和 B 两个位置,在PG的数据库中代表了什么

eb184c6628c58b798fe9250e5fd04275.png

通过下图我们就可以很清晰的来理解 A  B 两个点是从哪里来的 首先说A点,A点是来自于。

下面先简单说一下过程,我们查询了pgbench_tellers 的表,然后我们查看了xmin, xmax 两个部分,对于这个表倒排我们发现当前已经使用的事务号在这个表上已经到了  1199,查询了这个表的relfrozenxid 数值是 1046 ,那么我们做了一次 vacuum freeze ,然后在查看  relfrozenxid 的值是1200

9e4d6e7e0eb0f6290a391ac422393985.png

实际上我们运行了vacuum  freeze 的时候是将 vacuum_freeze_min_age  视为0 ,在运行的时刻,会将此表的事务ID 全部回收。

而这个参数设置的大小有关于,系统的性能的问题,设置较大会导致一次较大的回收扫描,消耗 IOPS 会较大,设置较小,会频繁在autovacuum上进行事务ID 的冻结操作。

普通的vacuum 使用visibility map来快速定位哪些数据页需要被扫描,只会扫描那些脏页,其他的数据页即使其中元组对应的xmin非常旧也不会被扫描。而在freeze的过程中,我们是需要对所有可见且未被all-frozen的数据页进行扫描,这个扫描过程PostgreSQL 称为aggressive vacuum。

何时进行aggressive vacuum 这个就是我们要说到的第二个参数vacuum_freeze_table_age  ,vacuum_freeze_table_age  这个参数默认是1.5亿,最大值是20亿,

322e897062e70d1ea20d226af2e9a007.png

我们下面做一个关于 table age的例子,我们首先查看当前的事务的ID

6e5a6a629d9a767e90551424cb6441de.png

postgres=# select * from txid_current();
 txid_current
--------------
         1200
(1 row)

然后我们针对当前的所有的数据库的  age 进行检测,

postgres=# SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY 2 DESC LIMIT 20;
  datname  | age
-----------+-----
 template1 | 475
 template0 | 475
 postgres  | 162
 dvdrental |  92
(4 rows)

最后我们针对某个数据库中的表进行 age的检测

dvdrental=# \c postgres
You are now connected to database "postgres" as user "postgres".
postgres=# SELECT c.relname as table_name, c.relkind as type, age(c.relfrozenxid) as age, c.relfrozenxid FROM pg_classgbench%';
    table_name    | type | age | relfrozenxid
------------------+------+-----+--------------
 pgbench_accounts | r    | 144 |         1057
 pgbench_branches | r    | 157 |         1044
 pgbench_history  | r    | 156 |         1045
 pgbench_tellers  | r    |   1 |         1200
(4 rows)

那么当这些age 达到我们在参数vacuum_freeze_table_age 中设置的值的情况下,就会发生 aggressive vacuum. 那么发生了 av 的情况下,当时的系统的消耗会较大,所以在PG的数据库运行维护中,是可以在非业务时间段,对一些特殊的表,进行事务ID的回收。

回收的命令很简单,在vacuum中加入 freeze  就可以对表或对整体的数据库进行事务ID的回收,降低 age. 从下图可以看出,在做完整体数据库的ID freezen 后,数据库postgres 的 age 已经降低到 0 。

449385bbf74d1f6d07ea6050a2e502a7.png

最后说说  autovacuum_freeze_max_age,autovacuum_freeze_max_age 的主要作用是从全局来进行控制,对于全局的事务ID ,进行判断,当最新的和最旧的事务ID之间差距超过设置的值,则会强制进行事务ID的回收工作。

这里会一般会产生两个问题

2f95f9d5fa457d79883b65c377348d25.png

1  vacuum_freeze_table_age 的值怎么设置,上面提到 FREEZN的操作是非常消耗IOPS的,因为他要针对页面进行扫描,所以vacuum_freezn_table_age的值,必须小于 autovacuum_freeze_max_age ,否则将起不到减少页面扫描的作用,但如果将vacuum_freeze_table_age 编辑的太小的情况下,将频繁产生 aggressive vacuum ,影响系统的性能。

2  vacuum_freeze_table_age  与 autovacuum_freeze_max_age 之间的值应该怎么设置,是否有一些官方的建议

从源代码中可以看到源代码中,强制对于  vacuum_freeze_table_age 中的值进行限制,限制的方式是, vacuum_freeze_table_age 的值,或者说table age  不能大于 autovacuum_freeze_max_age  的 0.95倍,从源代码也证明了,vacuum_freeze_table_age 必须要比  autovacuum_freeze_max_age 小。

ad12a225e8941cc0c0551f8e5989ee0c.png

到此为止,对于这三个参数的关系,以及相关的关联性我又重新的梳理和学习。

bc4ea61e9f0fde78dc86eddc7a4cabf7.png

——————————————————————————————

本期继续写写自己的爱好,上次说了不能惹的德国大众高尔夫,这期说说国产钢炮也是中国汽车工业之光的领克03。在没这个车出现之前,中国的汽车工业在钢炮这个层面是 0 ,大多国产车就是低廉和没有性能的代名词,但在吉利收购了沃尔沃后,这一切就不一样了,领克作为国产汽车的一个系列,成为高端和高品质的代名词,尤其领克系列中的 03 03+ 03+CYAN  , 填补了国产车钢炮的空白。

9c598b8e8118ea8d3d97ac5627a77381.png

在马路上你或许经常见到 领克03 或 03+的汽车,见谁蹦谁的场面,什么奥迪,宝马,奔驰,都不含糊,最快的03+ CYAN已经可以 5.7秒破百,03 +的马力,已经到了 254 匹,这款车带有博格华纳的 4驱系统,起步很稳的领克03+ 是家用,赛用的结合,普通的03车型的马力也有190匹,同时据传,即将研发的 领克03 ++ TCR 将要达到350匹,将成为中国性能车之光,暴打一众欧洲超跑也不是没有可能。

另外领克 03+ CYAN 就是下面这个图中的车,是非改装车,也就是从4S店你买到就是这个样子,带有全碳纤维的可调整的尾翼,下唇,四驱,以及机械可调的10段避震,百公里加速 5.7秒,20多万就可以买到跑车的水准,你还要什么自行车,开上他,就俩字,刺激,三字真拉风

49d0c14dd985327c58f85d75e8e24e1a.png


http://www.niftyadmin.cn/n/207599.html

相关文章

【Java动态规划引入】P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles

[USACO1.5][IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 …

CMake入门教程【基础篇】2.aux_source_directory添加源文件

文章目录 知识点实例代码目录代码实现知识点 查找目录中的所有源文件。 aux_source_directory(<dir> <variable>)收集指定目录中所有源文件的名称,并将列表存储在提供的 中。 此命令旨在供使用显式模板实例化的项目使用。 模板实例化文件可以存储在 Templates 子…

一文带你了解MES系统性能需求

追求生产的更高效能是人类的本能。 不管是从最原始的“使用双手”处理食物到自然而然的开始“寻找器具”代替肢体劳作&#xff0c;还是劳动工具从石器、玉器、青铜器&#xff0c;到后来的铁器的不断迭代更新&#xff0c;都在证明降本增效对人类的致命吸引力。 提及制造类企业…

豪赚83亿,长城汽车还在渴望一场新能源“狂飙”

文|螳螂观察 作者| leo陈 关于最近的国内汽车市场&#xff0c;最大的变化是品牌的降价潮&#xff0c;应该无他了。降价从新能源车开始&#xff0c;由特斯拉发起&#xff0c;逐渐蔓延到燃油车&#xff0c;形成30家汽车品牌加入价格混战。 在车市紧缩大背景下&#xff0c;车企…

Linux 触摸屏 (IIC驱动详解)

前言&#xff1a; 本文使用触摸屏iic驱动&#xff0c;驱动编写中要使用总线&#xff0c;设备&#xff0c;驱动分层的思想&#xff0c;IIC总线&#xff0c;触摸屏驱动&#xff0c;触摸屏设备&#xff0c; IIC总线驱动 一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的&…

java集合框架及其背后的数据类型 - 包装类

介绍 java集合框架 java Collection Framewrok &#xff0c; 又称为容器 container&#xff0c;是定义在 java.util包下的一组接口 interfaces 和其实现的类 classes 。都是工具包。 其主要表现的是将多个元素 element 置于一个单元中&#xff0c;用于对这些元素的快速&…

torch.permute方法使用,后需要加.contiguous()方法

参考&#xff1a;Pytorch之permute函数 https://zhuanlan.zhihu.com/p/76583143 pytorch的permute方法用于调整矩阵的维度。同numpy的transpose()方法&#xff0c;但需要注意的是使用permute后需要使用contiguous方法。在PyTorch中&#xff0c;permute()方法可以重新排列张量的…

IBM Semeru Runtime 17.0.6.0 在 Linux 下的安装

我们将在服务器上安装 17.0.6.0 JDK。 因为我们服务器还跑了 11 的 JDK&#xff0c;所以实际上有 2 套 JDK 在运行。 下载 rpm 包 我们使用的是 rpm 的安装方式&#xff0c;下载地址为&#xff1a;IBM Developer 运行下面的命令来进行下载&#xff1a; wget https://githu…