PG的事务ID回卷逻辑

PG到目前为止使用的事务ID仍然是32位的,在内存计算时虽然已经使用64位事务ID,但是存储在页中tuple仍然使用32位事务ID,这就是说,事务ID回卷仍然是必须处理的问题。

所谓PG事务ID回卷,简单地说,就是在数据库频繁运行中,事务ID不断增加,32位的事务ID不够用了,怎么办?PG的处理方法,简单的说,就是在事务ID还没用完以前,把数据库中所有的tuple处理一遍,将以前的事务(不活跃的事务)修改的(包括插入)tuple中的事务ID改为2(或设置infomask),表示这个tuple对于以后的事务(不管是多少的事务ID)都是可见的,即freeze。

这样,当前事务达到2^32后,再从3开始(0、1、2保留做特殊事务ID),就不会有什么问题了,即就不会导致很旧的事务修改过的tuple不可见了。

这里有个隐含背景知识,就是PG内部读写tuple时,tuple中的事务ID,在当前事务ID之前  ,这个tuple对于当前事务才是可见的。

网上有一张图片,来说明“之前”、“之后”和回卷的概念,但是我觉得都没说明白,我来尝试理解一下,我觉得问题的关键是PG源码中比较事务ID的函数:

TransactionIdPrecedes() 和 TransactionIdFollows()

按照上面代码的算法,对于任何事物ID,例如100,如果另一个事务ID比它大,但是没有超过这个事务ID后的半圆,例如2^31+100,就认为是在它的后面,那么事务100的tuple,对事务2^31+100就是可见的。

按照上面代码的算法,对于任何事物ID,例如100,如果另一个事务ID比它大,还超过了事务ID后的半圆,例如2^31+101,就认为是在它前面,那么事务100的数据,对事务2^31+101就是不可见的。

这导致对任何事务ID,它只能看到它之前的 2^31 个事务的数据,而不是 2^32 个事务的数据,而且不同事务的可见事务集合也是不同的。

这种算法叫做 “模算数” (modulo-2^32 arithmetic)

这个和freeze有什么关系呢?

想象事务ID一直在增加,穿过圆心的线顺时针转动,每转动一个事务ID,就有一个事务ID变的不可见,要想不丢失这个事务ID的数据,就要对它的tuples做freeze,这一岂不是freeze太频繁了吗?

实际上,PG对于past部分的tuple,早就做了freeze了,例如下图,一般X之前的tuple已经freeze过了,而当前事务ID不断增加,每隔一段时间做一次freeze,将与当前事务ID有一定差值(5千万)的past tuple,做freeze。

并不是在穿过圆心的直线另一端,快到达某个事物ID时(未做freeze的tuple事务ID与当前事务ID差值已经非常大了),才对这个事物ID做freeze。

总结一下vacuum,最近看pgvector索引代码时,对vacuum有了新的理解,pgvector有个接口:hnswbulkdelete,是删除了表的一些记录后,做vacuum时,删除索引中对应条目用的。

PG删除记录时,不是真的删除,而是在tuple上标记删除,此时也不会删除对应的索引项,真的删除是vacuum时做的。

vacuum是以表为单位进行的,就是说最小可以只对一个表进行vacuum,它主要有两个工作:

1、删除 dead tuple

2、将记录设置frozen xid

这两个工作都有,lazy和eager两种模式,它们的触发条件不同,对系统的影响也不同。

1、lazy模式,删除dead tuple,跳过没有dead tuple的page(参考vm),对于有dead tuple的page,物理删除dead tuple和对应索引项,页内碎片整理。

2、eager模式,删除dead tuple,不会参考vm,直接重建一份表数据,从旧的表数据的page中逐个tuple拷贝,重建索引,表内碎片整理。它的触发条件就是用FULL VACUUM命令。

3、lazy模式,freeze,跳过没有dead tuple和所有tuple都已经freeze的page(参考vm),对其他page中的tuple设置frozen txid,但是又不是每个tuple都设置,只有xmin小于特定值的tuple才设置。

4、eager模式,freeze,跳过所有tuple都已经freeze的page(参考vm),对其他page中的tuple设置frozen txid,但是又不是每个tuple都设置,只有xmin小于特定值的tuple才设置。这里面还有个特殊情况,就是vacuum时有FREEZE选项,则用eager模式,但是并不是只有xmin小于特定值的tuple才设置frozen,而是所有小于当前事务ID的tuple都设置frozen。

触发条件:粗糙的说,当前事务ID与数据库中最小的(未freeze的)事务ID,的差达到一定值后,就会触发。这个“当前事务ID”是指OldestXmin ,“数据库中最小的事务ID”是指pg_database.datfrozenxid,差值是Vacuum_freeze_table_age。

5、autovacuum触发条件,既可以是事务ID的改变,也可以是dead tuple的比例的改变,也可以是新插入的tuple的比例达到一定阈值。

参考:

6.3. Freeze Processing :: Hironobu SUZUKI @ InterDB

postgresql - About "Transaction ID Wraparound" - Database Administrators Stack Exchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/695461.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…

python如何单步调试

Python怎么单步调试?下面给大家介绍一下单步调试: 方法一:执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试,这时你能够看看帮助。 方法二:在所调试程序的开头中:import pdb 并在你…

Vue入门到关门之Vue3学习

一、常用API 注意:本文项目均使用脚手架为 Vite 1、setup函数 (1)介绍 如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的&#xff1a…

电脑提示找不到ffmpeg.dll无法继续执行代码怎么办?

电脑提示找不到找不到ffmpeg.dll无法继续执行代码怎么办,有什么好的解决办法,出现这样的弹出就会导致软件无法打开或者是异常关闭,找不到dll文件,是一个非常重要的电脑使用问题,会给使用者带来许多的麻烦。那么找不到d…

PyWebIO,用 Python 写网站

在Python的世界里,PyWebIO是一个简单而强大的库,它能让你的Python脚本快速拥有一个交互式的网页界面。想象一下,你不需要懂得前端开发,就能创建出用户友好的网页应用,这是多么酷的一件事!今天,我…

uni-app条件编译和网页打包

在项目打包时,存在打包微信小程序、h5网页端或者其他平台小程序的情况,但是有些api是某些小程序中特有的,例如wx.requestPayment(),微信支付、授权等功能。 这时,若不做条件编译,打包成非微信小程序的项目…

新闻资讯微信小程序开发后端+php【附源码,文档说明】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 宿舍管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库…

气膜建筑送风装置特点是什么样的—轻空间

气膜建筑作为一种新型建筑结构,其送风装置在保证建筑内部空气压力和稳定性方面发挥着至关重要的作用。以下是对气膜建筑送风装置特点的详细介绍: 1. 提供稳定内压: 气膜建筑的送风装置利用送风形成内部压力,赋予建筑物必要的刚度和…

0506libMaven项目

0506libMaven项目包-CSDN博客 数据库字段 界面需求

极氪速度:70亿市值登陆纽交所,这家纯电豪华品牌开启弹射模式

作者 |老缅 编辑 |德新 北京时间5月10日晚,极氪智能科技在美国纽交所挂牌上市,股票代码为「ZK」。 因获超额认购,极氪扩大了IPO规模,以每股21美元的价格累计发行2100万股美国存托股票(每份ADS 对应 10 份普通股&…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词,近些年被玩坏了,共享单车,共享充电宝,共享办公室,共享雨伞… 甚至还有共享女朋友,真是人有多大胆,共享有多大产。但凡事太尽就容易恶心到人,自己也一度被 共享内存 恶心到了&am…