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
一、多久检查一次哪些表是否须要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,若是设置了表级参数则以表级参数为准,不然以系统参数为准。