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

文章详细介绍了PostgreSQL数据库中的VACUUM参数,特别是vacuum_freeze_min_age、vacuum_freeze_table_age和autovacuum_freeze_max_age的含义和作用。这三个参数影响着事务ID的回收和数据库性能。文章通过例子解释了如何理解和设置这些参数,以优化数据库性能,并提到了与汽车工业无关的内容,如领克03汽车。

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

### 操作目的 - **VACUUM FULL**:主要目的是回收表中被删除或更新行所占用的磁盘空间。在 PostgreSQL数据库中,删除或更新操作并不会立即释放磁盘空间,而是标记这些行待清理。VACUUM FULL 会将表重写,把有效的数据重新排列,从而释放出被占用的磁盘空间,并且可以减少表的碎片化程度,提高后续查询的性能。 - **FREEZE**:在 PostgreSQL 中,每一行数据都有一个事务 ID(XID),用于跟踪数据的版本和可见性。随着事务的不断进行,事务 ID 会不断增长。FREEZE 操作会将表中所有行的事务 ID 冻结,防止事务 ID 回绕问题。事务 ID 回绕可能会导致数据库出现严重问题,例如数据丢失或不一致。 - **ANALYZE**:该操作会收集表的统计信息,例如每列的行数、不同值的数量、值的分布等。数据库查询优化器会根据这些统计信息来生成最优的查询执行计划。通过定期执行 ANALYZE,可以确保查询优化器生成的执行计划是基于最新的表数据情况,从而提高查询性能。 ### 用法 在 PostgreSQL 中,可以使用以下 SQL 语句对 `data_plan.edw_dim_customer_t` 表执行 `VACUUM FULL FREEZE ANALYZE` 操作: ```sql VACUUM FULL FREEZE ANALYZE data_plan.edw_dim_customer_t; ``` 需要注意的是,执行该操作需要具有相应的权限,通常是表的所有者或者具有 `VACUUM` 权限的用户。 ### 注意事项 - **锁表问题**:`VACUUM FULL` 操作会对表加排他锁,这意味着在操作执行期间,其他事务无法对该表进行读写操作。因此,建议在业务低谷期执行该操作,以避免对正常业务造成影响。 - **磁盘空间**:`VACUUM FULL` 操作会创建一个新的表副本,因此在操作执行期间,需要有足够的磁盘空间来存储新的表副本。如果磁盘空间不足,操作可能会失败。 - **性能影响**:`VACUUM FULL` 操作是一个比较耗时的操作,尤其是对于大表来说。在操作执行期间,会消耗大量的系统资源,如 CPU、内存和磁盘 I/O。因此,需要谨慎评估操作对系统性能的影响。 - **并发问题**:由于 `VACUUM FULL` 会加排他锁,在操作执行期间,其他事务无法对该表进行读写操作。如果有其他事务正在等待对该表的访问,可能会导致事务阻塞,甚至超时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值