Postgresql页面xmax与multixact
结论1:
- xmax和Infomask匹配使用,可能保存修改者的xid,也可能保存读或写行锁的xid。
- 如果保存读写行锁的xid,只要加过行锁,就算释放了xmax也会一直记录xid。
- 如果保存读行锁的xid,如果有多个事务加行锁,xmax会保存multixact数组的位置,具体信息存在multixact结构中(SLRU页面同CLOG)。
结论2:
注意到PG使用xmax记录行锁的事务ID,那么判断行锁还有没有就依赖xid的状态了,也就是CLOG。
在vacuum freeze的时候如果看到xmax上记录的事务ID过旧,也需要freeze的:
- vacuum_multixact_freeze_min_age 同 autovacuum_freeze_max_age : 五千万开始正常vacuum freeze,用最新xid-五千万=Limit,扫描页面如果有脏数据顺便freeze。
- autovacuum_multixact_freeze_max_age 同 autovacuum_multixact_freeze_max_age : 两亿开始eager freeze取oldxmin为Limit,用Limit来freeze所有页面。
正常保存
create table m7(id int primary key, info text);
insert into m7 select generate_series(1,10), md5(random()::text);
select lp,lp_off,lp_flags,lp_len,t_xmin,t_xmax,t_field3,t_ctid,t_infomask2,t_infomask,t_hoff,t_bits,t_oid from heap_page_items(get_raw_page('m7',0));lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid
----+--------+----------+--------+------------+--------+----------+--------+-------------+------------+--------+--------+-------1 | 8128 | 1 | 61 | 1477538885 | 0 | 0 | (0,1) | 2 | 2050 | 24 | | 2 | 8064 | 1 | 61 | 1477538885 | 0 | 0 | (0,2) | 2 | 2050 | 24 | | 3 | 8000 | 1 | 61 | 1477538885 | 0 | 0 | (0,3) | 2 | 2050 | 24 | | 4 | 7936 | 1 | 61 | 1477538885 | 0 | 0 | (0,4) | 2 | 2050 | 24 | | 5 | 7872 | 1 | 61 | 1477538885 | 0 | 0 | (0,5) | 2 | 2050 | 24 | | 6 | 7808 | 1 | 61 | 1477538885 | 0 | 0 | (0,6) | 2 | 2050 | 24 | | 7 | 7744 | 1 | 61 | 1477538885 | 0 | 0 | (0,7) | 2 | 2050 | 24 | | 8 | 7680 | 1 | 61 | 1477538885 | 0 | 0 | (0,8) | 2 | 2050 | 24 | | 9 | 7616 | 1 | 61 | 1477538885 | 0 | 0 | (0,9) | 2 | 2050 | 24 | | 10 | 7552 | 1 | 61 | 1477538885 | 0 | 0 | (0,10) | 2 | 2050 | 24 | | postgres=# select lp,lp_len,t_xmin,t_xmax,t_ctid,t_infomask2,t_infomask,t_hoff from heap_page_items(get_raw_page('m7',0));lp | lp_len | t_xmin | t_xmax | t_ctid | t_infomask2 | t_infomask | t_hoff
----+--------+------------+------------+--------+-------------+------------+--------1 | 61 | 1477538885 | 1477538886 | (0,1) | 8194 | 258 | 242 | 61 | 1477538885 | 0 | (0,2) | 2 | 2050 | 243 | 61 | 1477538885 | 0 | (0,3) | 2 | 2050 | 244 | 61 | 1477538885 | 0 | (0,4) | 2 | 2050 | 245 | 61 | 1477538885 | 0 | (0,5) | 2 | 2050 | 246 | 61 | 1477538885 | 0 | (0,6) | 2 | 2050 | 247 | 61 | 1477538885 | 0 | (0,7) | 2 | 2050 | 248 | 61 | 1477538885 | 0 | (0,8) | 2 | 2050 | 249 | 61 | 1477538885 | 0 | (0,9) | 2 | 2050 | 2410 | 61 | 1477538885 | 0 | (0,10) | 2 | 2050 | 24
id=1删除提交
id=2删除回滚
id=3行读锁
id=4行写锁
id=5行2读锁
postgres=# select lp,lp_len,t_xmin,t_xmax,t_ctid,t_infomask2,t_infomask,t_hoff from heap_page_items(get_raw_page('m7',0));lp | lp_len | t_xmin | t_xmax | t_ctid | t_infomask2 | t_infomask | t_hoff
----+--------+------------+------------+--------+-------------+------------+--------1 | 61 | 1477538885 | 1477538886 | (0,1) | 8194 | 258 | 242 | 61 | 1477538885 | 1477538887 | (0,2) | 8194 | 258 | 243 | 61 | 1477538885 | 1477538889 | (0,3) | 2 | 466 | 244 | 61 | 1477538885 | 1477538890 | (0,4) | 8194 | 450 | 245 | 61 | 1477538885 | 343 | (0,5) | 2 | 4562 | 246 | 61 | 1477538885 | 0 | (0,6) | 2 | 2050 | 247 | 61 | 1477538885 | 0 | (0,7) | 2 | 2050 | 248 | 61 | 1477538885 | 0 | (0,8) | 2 | 2050 | 249 | 61 | 1477538885 | 0 | (0,9) | 2 | 2050 | 2410 | 61 | 1477538885 | 0 | (0,10) | 2 | 2050 | 24t_infomask
258: HEAP_HASVARWIDTH | HEAP_XMIN_COMMITTED
466: HEAP_HASVARWIDTH | HEAP_XMAX_KEYSHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED
450: HEAP_HASVARWIDTH | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED
4562: HEAP_HASVARWIDTH | HEAP_XMAX_KEYSHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_LOCK_ONLY | HEAP_XMIN_COMMITTED | HEAP_XMAX_IS_MULTI
2050: HEAP_HASVARWIDTH | HEAP_XMAX_INVALIDt_infomask2
8194: 0010000000000010 : HEAP_KEYS_UPDATED | 低11位保存元素数量,这里是两列
2 : 0000000000000010 : 低11位保存元素数量,这里是两列
Postgresql页面xmax与multixact相关推荐
- PostgreSQL B+树索引---页面删除
PostgreSQL B+树索引-页面删除 预备知识 <PostgreSQL Blink-tree ReadMe-翻译> <PostgreSQL Buffer ReadMe-翻译&g ...
- PostgreSQL重启恢复---XLOG 2.0
XLOG 2.0 预备知识 <PostgreSQL重启恢复-XLOG 1.0> 概述 在<PostgreSQL重启恢复-XLOG>中,我们查询的XLOG的组织结构.XLOG写入 ...
- Confluence 6 已经存在的安装配置数据库字符集编码
2019独角兽企业重金招聘Python工程师标准>>> 针对已经存在的 Confluence 安装,如果你安装的 Confluence 版本是 6.4 或者早期的版本,我们在安装的时 ...
- sql 最外层传值给最内层查询_腾讯云高级工程师如何玩转PG查询处理与执行器算法...
作者介绍 孙旭,腾讯云高级工程师.10年数据库内核研发经验,熟悉PostgreSQL.Teradata数据库内核,熟悉数据库的查询优化.执行.事务并发以及存储等子系统:对分布式数据库有深入的研究和研发 ...
- Ora2Pg 工具介绍
文章目录 官方地址:http://ora2pg.darold.net Ora2Pg 是一个免费工具,用于将 Oracle 或者 MySQL 数据库迁移到 PostgreSQL.它通过连接 Oracle ...
- postgresql源码学习(十三)—— 行锁①-行锁模式与xmax
一. 四种行锁 1. 简介与兼容性分析 pg采用元组级常规锁+xmax结合的方式实现行锁.我们曾经提到过常规锁是有很多类TAG的(typedef enum LockTagType),其中 LOCKTA ...
- PostgreSQL如何实现MVCC (基于xmin、xmax、cmin、cmax)
声明:本文是<PostgreSQL实战>读书笔记,参考了http://www.jasongj.com/sql/mvcc/ 部分,可以参考该书事务与并发控制章节 和 http://www.j ...
- PostgreSQL XMAX深入探究
PostgreSQL每张表中都包含系统字段,详见:PostgreSQL表的系统字段 对于XMAX字段,其官方文档的解释如下: The identity (transaction ID) of the ...
- postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax
os: centos 7.4 db: postgresql 10.11 oid.tableoid.ctid.xmin.xmax.cmin.cmax 这些都是 postgresql 数据库表的隐藏列. ...
最新文章
- 20以内混合加减法100题_一年级数学20以内加减法混合运算练习题,寒假练习巩固!...
- 如何管理并设计你的口令
- excel对比_质量管理误区:SPC软件与微软Excel的应用对比
- Java程序运行纳秒级差值计算
- java listen_Java进阶-IO基础
- 超乎想象,数据揭示自学成才的码农为何备受青睐
- git 提交_GIT提交规范的使用和总结
- 【体系结构】Oracle表空间的简单理解
- Objective-C ---JSON 解析 和 KVC
- Spring 实现发送电子邮件的两种方法
- javaScript 对象访问属性的另一种方式
- bootstrap-wysiwyg中JS控件富文本中的图片由本地上传到服务器(阿里云、七牛、自己的数据库)...
- linux把程序添加到全局环境变量
- Sqlite日期查询
- 智能车摄像头组怎么在OLED屏画出中线
- ROS进阶功能—action通信机制
- 软件类大学生求职就业攻略(四)——求职面试
- 启动3ds Max报 d3dx9_43.dll丢失 解决方法
- 关于Mysql出现1045错误的方法
- 模糊数学 4、模糊模式识别
热门文章
- 基于Token的身份验证的原理
- Gitea服务搭建指南
- WIN2003 R2安装EPSON6200L打印机问题解决
- 2021年日本互联网服务业发展现状:ZHD和LINE 的合并将改变日本互联网行业格局[图]
- 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)
- android wifi增强,Android增强WiFi性能
- 大连python薪酬_大连Python开发靠谱吗
- r7 6800u核显相当于什么显卡
- 学3D建模要注意什么问题?入行好几年,踩过的坑后的经验
- 重装系统(GHO)镜像介绍及下载