最近搞了一个公众号PostgreSQL运维技术,欢迎来踩~
悄悄放一张:
PostgreSQL运维技术
我在之前的一篇介绍MVCC的文章中提到,MVCC有事务ID回卷的问题,它的解决方案是VACUUM。但是没有展开讲。这章的话,会详细地介绍下VACUUM。
VACUUM的两个主要任务是删除死亡元组和冻结事务ID。
为了删除死亡元组,VACUUM提供了两种模式,即Concurrent Vacuum和Full Vacuum。
Concurrent Vacuum通常简称为VACUUM。它在删除表文件中的死亡元组时,其他事务仍可以在此进程运行时读取表。而Full VACUUM在运行时其他事务不能访问表。
本章将主要描述以下内容
VM(可见性映射)
Freeze
删除不必要的clog
AutoVacuum
Full VACUUM
注:本文是The Internals of PostgreSQL第六章
6.1. VACUUM的概述
VACUUM对数据库中的表执行以下的任务:
1、删除死亡元组
删除死亡元组和整理每个页面的活元组。
删除指向死元组的索引元组。
2、冻结old txids
如有必要,冻结元组的old txids。
更新冻结的txid相关的系统目录(pg_database和pg_class)。
如果可能,清除clog不必要的部分。
3、其他
更新已处理表的FSM和VM。
更新一些统计信息(pg_stat_all_tables等)。
下面的伪代码描述了VACUUM处理。
(1) FOR each table
(2) Acquire ShareUpdateExclusiveLock lock for the target table
/* The first block */
(3) Scan all pages to get all dead tuples, and freeze old tuples if necessary
(4) Remove the index tuples that point to the respective dead tuples if exists
/* The second block */
(5) FOR each page of the table
(6) Remove the dead tuples, and Reallocate the live tuples in the page
(7) Update FSM and VM
END FOR
/* The third block */
(8) Clean up indexes
(9) Truncate the last page if possible
(10 Update both the statistics and system catalogs of the target table
Release ShareUpdateExclusiveLock lock
END FOR
/* Post-processing */
(11) Update statistics and system catalogs
(12) Remove both unnecessary files and page