在PostgreSQL的各种技术讨论和日常运维中,vacuum基本离不开讨论范围。在日常运维中由于各种原因导致数据库中产生的垃圾数据无法被回收,会造成表/索引的垃圾比例可能一直高于阈值,造成表/索引膨胀。所以在PostgreSQL数据库管理运维过程中,经常需要调整一些vacuum参数,以优化数据库的性能。在了解具体的vacuum参数前,我们更想了解下面几个问题。
vacuum 是什么?
为什么需要 vacuum?
vacuum 做哪些工作?
上面这些问题我们十分迫切的需要知道,但是在此前必须先介绍一些其他概念以便于更好的理解这些问题。
MVCC
全称为Multiversion Concurrency
Control,多版本并发控制机制。并发操作。即数据库中可以同时运行多个事务,并发控制是维护并发事务一致性和隔离性的一种机制,本身是一个指导性的概念。在MVCC中,每个写操作都会创建新版本的数据项,同时保留旧版本。当事务读取数据项时,系统会选择其中一个版本来确保单个事务的隔离。MVCC最大的优势就是读不会阻塞写,而写也从不阻塞读。
不同数据库对于MVCC的实现并不相同,
第一种,以Oracle为代表的,把旧版本数据放入UNDO,新数据放入REDO,然后更改数据。这种方式,旧版本的数据放入了UNDO,所以可以有效避免膨胀。
第二种,以SQL Server为代表的,把旧版本的数据写入专门的临时表空间,新数据写入日志,然后去更改数据。这种方式,旧版本的数据放入了专门的临时表空间,所以也可以有效地避免膨胀。
第三种,以PostgreSQL为代表的,把旧版本标示为无效,新数据写入日志,成功后把新版本的数据写入新的位置。这种实现机制是导致数据膨胀严重的一个重要原因,因为旧版本的数据虽然表示为无效状态,但是没被回收前还是占据存储空间。
在此我们不讨论哪种方式更好,不同方式只不过做了不同取舍而已。
事务回卷
该部分内容可通过链接自行了解,对理解vacuum 不可或缺。
https://blog.csdn.net/pg_hgdb/article/details/117448120
deadtuple
该部分内容可通过链接自行了解,对理解vacuum 不可或缺。
https://blog.csdn.net/pg_hgdb/article/details/117448369
vacuum
通过上面的讲解,我们知道MVCC虽然可以让我们并发的进行事务处理,但是也存在一些问题,例如deadtuple、旧事务ID(txid)的处理等。此时回顾文章开始的三个问题我们就有了自己的答案。
vacuum是一个有助于PostgreSQL的持续运行的维护进程。它的两个主要任务是 清理 dead tuples 和 冻结事务ID,除此以外还会删除clog不必要的部分,更新FSM、VM和统计信息。
原文链接:https://blog.csdn.net/pg_hgdb/article/details/118360407