PostgreSQL Freeze 风暴预测续 - 珍藏级SQL

标签

PostgreSQL , Freeze , 风暴git

背景

PostgreSQL 目前默认的存储引擎,事务可见性须要依赖行头的事务号,由于事务号是32位的,会循环使用。github

在一条记录产生后,若是再次经历了20亿个事务,必须对其进行freeze,不然数据库会认为这条记录是将来事务产生的(可见性判断)。数据库

所以FREEZE操做是数据库在32位事务号的状况下,常常要作的。post

对全表进行FREEZE操做时,会扫描整表,将大于指定阈值least(autovacuum_freeze_min_age, 表级参数vacuum_freeze_min_age)年龄的记录设置为freeze。可能致使大量的读IO,写IO(主要是写数据文件,WAL日志, full page write WAL)。spa

一些参数决定数据库在何时触发FREEZE,以及触发FREEZE时,冻结哪些记录,以及是否涉及到调度(sleep)。日志

同时不少参数有库级、表级选项。表级优先,而后是库级,最后是实例级。code

《PostgreSQL GUC 参数级别介绍》blog

一、多久检查一次哪些表是否须要FREEZE事务

postgres=# show autovacuum_naptime ;    
 autovacuum_naptime     
--------------------    
 1s    
(1 row)

二、哪些表须要被自动FREEZE,get

超过以下阈值,若是设置了表级参数则以表级参数为准,不然以系统参数为准。

表级参数    
autovacuum_freeze_max_age    
autovacuum_freeze_table_age    
    
系统级参数    
autovacuum_freeze_max_age

三、手工执行普通vacuum时,哪些表会被扫描全表,并freeze

超过以下阈值

系统级参数    
vacuum_freeze_table_age

注意,如今PG支持VM文件里面记录一个PAGE是否须要被FREEZE,因此即便全表扫描,也会根据VM标记位,跳过一些BLOCK,因此FREEZE并不必定会产生大量读IO。根据表的状况而定。

三、触发FREEZE时,哪些记录须要被FREEZE

超过以下阈值的记录被FREEZE,若是设置了表级参数则以表级参数为准,不然以系统参数为准。

相关文章
相关标签/搜索