对于数据库系统的并发控制,PostgreSQL采用MVCC(多版本并发控制)进行处理。这种机制有一个缺点,就是随着时间的推移,数据文件中积累的dead tuples会越来越多。怎么去清理这些dead tuples,这个时候就需要vacuum处理。

PostgreSQL系统的vacuum是一个例行性的维护过程,系统也会在启动服务时启动autovacuum守护进程对此进行维护,当然也有vacuum命令可以让用户进行手动执行vacuum操作。除了清理dead tuples,vacuum还有冻结事务ID的功能,因为现在PostgreSQL的事务ID只支持32位(大概40亿个事务),当事务ID达到最大值后,它会重新从0开始,这时以前的事务都会变成“未来”的事务变得不可见。

下面主要介绍vacuum清理dead tuples的过程。 在清理dead tuples时,系统有两种处理方式:vacuum 和 vacuum full。主要区别在如下:

vacuum

vacuum full

只是把表中的dead tuples进行删除标记,并没有真正物理删除;vacuum过程中,可以正常访问数据表

物理删除表中的dead tuples,释放空间给操作系统;vacuum full过程中,表被锁定,不允许访问

Vacuum过程

vacuum的执行过程主要分为以下三步:

1. 清除dead tuples指向的index tuples

该过程中,vacuum会顺序扫描目标表,并构建一个dead tuples组成的list链表,该list链表会存储在maintenance_work_mem缓存中。然后vacuum根据dead  tuples list移除dead tuples指向的index。

2. 移除dead tuples,更新VM和FSM

这里的移除dead tuples只是标记为可重用该空间,并没有真正物理删除。所以vacuum清理表后,表的实际空间并没有减小。dead tuples在做移除标记后,vacuum会重新排列剩余的元组以进行碎片化整理。然后,需要更新目标表的VM(可见性映射文件)和FSM(空闲空间映射文件)。

3. 更新统计信息和相关系统表

最后,需要更新vacuum目标表的统计信息(以适应最新的查询优化)和相关系统表。

Vacuum Full过程

Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。其处理过程和vacuum大不相同,处理步骤如下:

1.  vacuum full开始执行时,系统会先对目标创建一个AccessExclusiveLock ,不允许外界再进行访问(为后面拷贝做准备),然后创建一个表结构和目标表相同的新表。

2. 扫描目标表,把表中的live tuples 拷贝到新表中。

3. 删除目标表,在新表上,重新创建索引,更新VM, FSM以及统计信息,相关系统表等。

所以,vacuum full的本质是生成一个新的数据文件,然后把原有表的live tuples存放到该数据文件中。对比vacuum, vacuum full缺点就是在执行期间不能对表进行访问,由于需要往新表中导入live tuples数据,其执行效率也会很慢。优点是执行后,表空间只存放live tuples,没有冗余的dead tuples,在执行查询效率上会有所提高。

AutoVacuum守护进程

由于vacuum是数据库系统的一个例行性维护,所以系统启动后,会开启一个autovacuum守护进程专门对此处理。autovacuum清理进程一般用vacuum而避免使用vacuum full。理由是,vacuum尽管可以保持表的最小尺寸,但是如果表还有继续增长的空间,这么做就意义不大了,特别是对于频繁写入的表。而且vacuum在执行效率上也比vacuum full好。

上面所说的autovacuum进程是一个launcher进程,它不进行vacuum操作,它负责启动vacuum worker进程,然后由vacuum worker进程进行相应的vacuum和analyze操作。

autovacuum进程会在每autovacuum_naptime时间间隔内为数据库启动autovacuum worker进程。然后每个worker进程会检查数据库中的每一个表,在需要时执行vacuum或analyze操作。如果有N个数据库,则每 autovacuum_naptime/N秒将启动一个新worker进程,在同一时间只允许最多autovacuum_max_workers 个worker进程运行,如果有超过autovacuum_max_workers 个数据库需要被处理,下一个数据库将在第一个worker结束后马上被处理。

mysql vacuum_Vacuum 和 Vacuum Full 的处理过程相关推荐

  1. MySQL利用xtrabackup进行增量备份详细过程汇总

    1,创建mysql备份用户 mysql -uroot --password="" -e"CREATE USER 'backup'@'192.168.%' IDENTIFI ...

  2. MySQL 5.7.18 zip 文件安装过程

    MySQL 5.7.18 zip 文件安装过程 安装MySQL:5.7.18(千万注意路径问题,不要直接照抄) 1.下载路径 https://dev.mysql.com/downloads/mysql ...

  3. mysql cannot connect_【IT专家】mysql远程访问cannot connect(10038) 问题解决的过程

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 mysql 远程访问 cannot connect(10038) 问题解决的过程 2016/05/23 9309 今天用 Navicat 访问虚拟 ...

  4. mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)

    mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式) 首先将要导入的数据文件top5000W.txt放入到数据库数据目录/var/local/mysql/data/${d ...

  5. linux jdk1.7 tomcat mysql_RedHat Linux 下安装JDK 1.7+MySQL 5.0+Tomcat 7.0.27过程

    RedHat Linux 下安装JDK 1.7+MySQL 5.0+Tomcat 7.0.27过程记录: tar -zxvf jdk-7u3-linux-i586.tar.gz /解压gz文件 rpm ...

  6. mysql修改root密码及修改密码过程中报错的解决方案

    mysql修改root密码及修改密码过程中报错的解决方案 参考文章: (1)mysql修改root密码及修改密码过程中报错的解决方案 (2)https://www.cnblogs.com/codema ...

  7. MySQL 利用xtrabackup进行增量备份详细过程汇总

    Xtrabackup下载.安装以及全量备份请参考:http://blog.itpub.net/26230597/viewspace-1465772/ 1,创建mysql备份用户 mysql -uroo ...

  8. MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程

    原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...

  9. Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节 【转】

    文章出处:Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节 [转]             mysql数据库高可用高扩展性架构方案实施[原] Heartbeat+DRBD+MySQ ...

最新文章

  1. DFS、栈、双向队列:CF264A- Escape from Stones
  2. .NET Framework终于开源了!
  3. String比较? 用==判断两个字符串,有时为true有时为false
  4. java comparator_Java基础之String漫谈(二)
  5. DeepLearning - Forard Backward Propogation
  6. Linux防蓝光(Redshift)
  7. Vue 使用 fraola——vue-froala-wysiwyg
  8. matlab图片纹理特征直方图,常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。...
  9. 第十篇:React 中的“栈调和”(Stack Reconciler)过程是怎样的?
  10. ESP32实现Wave(.wav)音频文件输出
  11. c语言用fun函数求最大公约数,c语言求最大公约数
  12. 计算机时间小于会计期间错误,会计期间手工记账和电脑记账不一样问题
  13. “139邮箱”练好内功比发电影票更重要
  14. excel生成动态进度条
  15. css图片按键变手指,CSS-悬停button标签时如何使光标变为手形
  16. Unity 游戏的String interning优化
  17. MATLAB画图-plot-线形、颜色、数据点形状的选择
  18. JS Knockoutjs 简单使用
  19. 通过PyFMI读取FMU文件及PyFMI的安装教程
  20. c# 将EF查询出的日期格式化

热门文章

  1. 无法确认设备和计算机之间的连接打印机,我无法从计算机上通过USB 进行打印...
  2. 微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
  3. 银行业法律法规与综合能力-- 知识点总结
  4. unity实现坦克对战
  5. 摩拜单车地图显示的红点是什么_找到最近的摩拜单车——高德地图API的应用
  6. 读取存储《哈姆雷特》英文剧本的文件,分析统计其中单词出现的频率,实现以下结果:给出前10个人物出现的次数使用turtle模块绘制词频统计结果;使用wordcloud库会出词云图;
  7. 计算机硬件经常使用十六,[单选,A型题] 桂枝在桂枝加桂汤、桂苓五味甘草汤中的主要作用是()...
  8. 如何使用m3u8格式下载快手直播回放的视频?自动转换MP4
  9. VMware启动报错Attempting to start up from:EFI VMware Virtual SCSI Hard Drive(0.0)
  10. 计算机网络-快速搞懂HTTP和HTTPS