当前位置: 首页 > article >正文

PostgreSQL 冻结(Freeze)机制深度解析

PostgreSQL 冻结Freeze机制深度解析一、为什么需要冻结1.1 事务 ID 的本质PostgreSQL 用 32 位无符号整数表示事务 IDXID范围 0 ~ 2^32-1约 42 亿。其中有三个特殊 XIDXID 值名称含义0InvalidTransactionId无效事务1BootstrapTransactionId初始化事务2FrozenTransactionId冻结事务永远可见正常分配从 XID3 开始。1.2 XID 比较的模运算陷阱PostgreSQL 判断事务可见性使用模 2^31 的有符号比较XID A 在 XID B 之前older(B - A) mod 2^32 2^31这意味着每个 XID 只有前 2^31 个是过去后 2^31 个是未来。回绕场景时间轴… XID1亿 XID20亿 XID40亿 XID1回绕XID2亿 …↑XID 耗尽后从头分配此时 XID1亿 的旧数据对 XID2亿 的新事务来说变成了未来→ 旧数据对所有人不可见相当于数据消失1.3 冻结的本质将元组的t_xmin或t_xmax替换为FrozenTransactionId 2该值在模运算中永远被认为比任何正常 XID 更老即对所有事务永远可见彻底脱离 XID 比较逻辑。二、冻结的两种实现方式2.1 旧方式物理写入 FrozenXIDPG 9.4 之前直接将 tuple header 中的t_xmin改写为FrozenTransactionId 2。缺点每次冻结都要修改 tuple产生大量 WALI/O 开销大。2.2 新方式infomask 标志位PG 9.4当前主流不修改t_xmin的值而是在 tuple 的t_infomask中设置两个标志位标志位含义HEAP_XMIN_COMMITTEDxmin 事务已提交HEAP_XMIN_FROZENxmin 已冻结永远可见当HEAP_XMIN_FROZEN被设置时可见性检查直接返回可见无需查pg_xact原pg_clog。优点减少 WAL 量只需记录 infomask 变更而非 xmin 值变更批量冻结整页时可以只更新 VM不修改每个 tuple三、冻结触发条件3.1 元组级冻结条件当前 XID - tuple.t_xmin vacuum_freeze_min_age默认 50,000,000满足条件的 tuple 在 VACUUM 扫描时被冻结。vacuum_freeze_min_age设置较大保留旧版本更长时间减少不必要冻结设置较小更激进冻结降低回绕风险但增加 I/O。3.2 表级全量扫描冻结条件当前 XID - pg_class.relfrozenxid vacuum_freeze_table_age默认 150,000,000触发后 VACUUM 忽略 Visibility Map强制扫描所有页包括全可见页确保所有旧 tuple 都被冻结。3.3 强制 AutovacuumAggressive Vacuum当前 XID - pg_class.relfrozenxid autovacuum_freeze_max_age默认 200,000,000即使autovacuum offPostgreSQL 也会强制启动 autovacuum worker对该表执行冻结。这是最后一道防线。3.4 三个阈值的关系|–freeze_min_age(50M)–|–freeze_table_age(150M)–|–freeze_max_age(200M)–|↑ ↑ ↑开始全表扫描冻结 强制autovacuum 数据库关闭保护relfrozenxid 距回绕 1000万 XID 时PostgreSQL 在距回绕还剩约1000 万 XID时会拒绝新事务只允许 superuser 连接执行 VACUUM距回绕还剩约100 万 XID时数据库会 PANIC 关闭。四、relfrozenxid 与 datfrozenxid4.1 relfrozenxid存储在pg_class.relfrozenxid表示该表中所有 XID 小于此值的 tuple 都已被冻结。VACUUM 完成后更新此值为min(当前 XID - vacuum_freeze_min_age, 本次扫描中最老的未冻结 xmin)。4.2 datfrozenxid存储在pg_database.datfrozenxid是该数据库内所有表的 relfrozenxid 的最小值。系统级回绕风险以datfrozenxid为准。4.3 查询冻结状态sql– 数据库级别 XID 年龄SELECTdatname,age(datfrozenxid) AS xid_age,2000000000 - age(datfrozenxid) AS xid_remaining,datfrozenxidFROM pg_databaseORDER BY xid_age DESC;– 表级别 XID 年龄找出最危险的表SELECTn.nspname AS schema,c.relname AS table_name,age(c.relfrozenxid) AS xid_age,c.relfrozenxidFROM pg_class cJOIN pg_namespace n ON c.relnamespace n.oidWHERE c.relkind ‘r’ORDER BY xid_age DESCLIMIT 20;五、页级冻结优化PG 145.1 整页冻结Page-level FreezePG 14 引入了更激进的整页冻结策略当一个页内所有 tuple 都满足冻结条件时直接在 VM 中设置ALL_FROZENbit后续 VACUUM 完全跳过该页大幅减少重复扫描开销。5.2 冻结与 VM 的协作VACUUM 扫描某页│├─ 页内所有 tuple 均已冻结│ YES → 设置 VM.ALL_FROZEN bit│ → 后续 VACUUM 跳过此页无需再扫描│└─ 页内所有 tuple 对所有事务可见无死元组YES → 设置 VM.ALL_VISIBLE bit→ Index-Only Scan 可跳过回表六、MultiXact 冻结6.1 什么是 MultiXact当多个事务同时对同一行加行锁SELECT FOR SHARE等PostgreSQL 用MultiXactId替代单个 XID 存储在t_xmax中。MultiXactId 同样是 32 位整数同样面临回绕问题。6.2 MultiXact 冻结参数参数默认值说明vacuum_multixact_freeze_min_age5,000,000MultiXact 冻结的最小年龄vacuum_multixact_freeze_table_age150,000,000触发全表扫描的 MultiXact 年龄autovacuum_multixact_freeze_max_age400,000,000强制 autovacuum 的 MultiXact 年龄七、冻结相关操作7.1 手动触发冻结-- 对指定表执行冻结扫描所有页VACUUM FREEZE mytable;-- 带详细输出VACUUM FREEZE VERBOSE mytable;-- 对整个数据库执行冻结VACUUM FREEZE;7.2 观察冻结进度-- 查看 VACUUM FREEZE 进度SELECTpid,datname,relid::regclassAStable_name,phase,heap_blks_total,heap_blks_scanned,heap_blks_vacuumed,num_dead_tuples,num_frozen_tuples-- PG 16 新增字段FROMpg_stat_progress_vacuum;7.3 用 pageinspect 验证冻结状态CREATEEXTENSION pageinspect;-- 查看 tuple 的冻结标志SELECTlp,t_xmin,t_xmax,-- HEAP_XMIN_FROZEN 0x0200 (infomask bit)(t_infomask512)0ASxmin_frozen,(t_infomask256)0ASxmin_committedFROMheap_page_items(get_raw_page(mytable,0));八、冻结失败的常见原因原因说明解决方法长事务长事务持有的快照阻止旧 XID 被冻结监控并终止长事务长 Replication Slot备库 slot 持有的xmin阻止冻结推进清理不用的 slotvacuum_defer_cleanup_age延迟清理导致冻结推迟评估是否需要此参数表被锁VACUUM 无法获取锁排查锁等待检查阻塞冻结的 Replication SlotSELECTslot_name,slot_type,active,age(xmin)ASxmin_age,age(catalog_xmin)AScatalog_xmin_age,restart_lsnFROMpg_replication_slotsORDERBYage(xmin)DESCNULLSLAST;九、总结问题根源XID 是 32 位整数约 42 亿后回绕旧数据变未来数据 → 不可见解决方案冻结Freeze将 tuple 标记为 HEAP_XMIN_FROZEN→ 永远可见脱离 XID 比较触发层次由宽松到严格元组级xmin 年龄 vacuum_freeze_min_age50M→ 单 tuple 冻结表级relfrozenxid 年龄 vacuum_freeze_table_age150M→ 全表扫描冻结强制relfrozenxid 年龄 autovacuum_freeze_max_age200M→ 强制 autovacuum紧急距回绕 1000万 XID → 拒绝新事务崩溃距回绕 100万 XID → 数据库 PANIC日常运维要点✓ 监控 age(datfrozenxid) 和 age(relfrozenxid)保持远低于 200M✓ 确保 autovacuum 正常运行不被长事务/长 slot 阻塞✓ 对写入频繁的大表设置更激进的 autovacuum 参数✓ 定期检查 pg_replication_slots清理废弃 slot✓ 生产环境 XID 年龄超过 150M 时应立即人工介入执行 VACUUM FREEZEXID 分配是全局的集群级别XID 计数器是整个 PostgreSQL 实例cluster共享的所有数据库的所有事务共用同一个 XID 序列。所以回绕是集群级别的威胁不是某个库或某张表独有的。冻结进度是按表跟踪的每张表有自己的 pg_class.relfrozenxid表示这张表里所有 xmin 小于此值的 tuple 都已冻结。不同表的冻结进度完全独立一张频繁更新的表可能 relfrozenxid 很老而另一张只读表可能很新。

相关文章:

PostgreSQL 冻结(Freeze)机制深度解析

PostgreSQL 冻结(Freeze)机制深度解析一、为什么需要冻结 1.1 事务 ID 的本质 PostgreSQL 用 32 位无符号整数表示事务 ID(XID),范围 0 ~ 2^32-1(约 42 亿)。 其中有三个特殊 XID:XI…...

15秒生成12个测试用例:AI写的测试比我写的还全

说实话,我一直是个"测试拖延症患者"。每次写完功能代码,心里都清楚应该补测试,但手就是敲不下去。想着"这个功能这么简单,不会有问题的",然后安慰自己"等有空了再补"。结果呢&#xff1…...

AI性能测试:TPS之外还要关注什么?

在AI驱动的时代,性能测试已成为软件测试从业者的核心技能。传统软件测试中,TPS(Transactions Per Second,每秒事务处理量)常被视为黄金指标,用于衡量系统的吞吐能力。然而,AI系统因其独特的计算…...

教你 .NET Core API 怎么和数据库表一一对应

不用复杂理论,直接照做就能成功! 一、核心规则(记住这 4 句) 类 = 表 类名 = 表名 属性 = 字段 属性名 = 字段名 二、一步一步教你对应(超级简单) 1)数据库有一张表 → 你就写一个类 例如你数据库里有表: sql Users (Id int primary key identity,Name nvarchar(5…...

智能工单管理系统 2026 怎么挑?五款热门平台对比,适配企业各类业务场景

工单智能化应用:帮您告别工单苦海 传统工单系统的痛点,本质是信息处理效率与用户体验的矛盾。随着AI 的发展,工单智能化应用的核心逻辑转变为,通过AI技术将“人找信息”转变为“信息找人”,甚至“预测需求”。 工单管…...

OpenClaw新手避坑指南:GLM-4.7-Flash部署的5个常见错误

OpenClaw新手避坑指南:GLM-4.7-Flash部署的5个常见错误 1. 为什么写这篇指南 上周我在自己的M1 MacBook上尝试部署OpenClaw对接GLM-4.7-Flash模型时,经历了堪称"教科书级"的踩坑过程。从模型地址格式错误到端口冲突,几乎把所有新…...

Transformer在车道线检测中的实战应用:LSTR模型从理论到代码实现

Transformer在车道线检测中的实战应用:LSTR模型从理论到代码实现 自动驾驶技术的快速发展对车道线检测提出了更高要求。传统基于CNN的分割方法往往需要复杂的后处理流程,而LSTR(Lane Shape Prediction with Transformers)通过端到…...

2026年AI智能体大爆发:下一个十年风口,普通人的超级财富密码

比尔盖茨曾断言:“AI智能体(AI Agent)将彻底改变人们使用计算机的方式。”如果说2023年是大语言模型(LLM)的启蒙元年,那么到2026年,具备“感知-规划-行动”自主闭环能力的AI智能体将迎来真正的商…...

OpenDroneMap实战指南:从航拍图像到三维模型的完整技术解析

OpenDroneMap实战指南:从航拍图像到三维模型的完整技术解析 【免费下载链接】ODM A command line toolkit to generate maps, point clouds, 3D models and DEMs from drone, balloon or kite images. 📷 项目地址: https://gitcode.com/gh_mirrors/od…...

OpenClaw技能调试:GLM-4.7-Flash功能开发排错指南

OpenClaw技能调试:GLM-4.7-Flash功能开发排错指南 1. 为什么需要关注技能调试 上周我在为团队开发一个基于GLM-4.7-Flash的自动化周报生成技能时,遇到了一个棘手的问题:技能在本地测试时运行完美,但部署到OpenClaw后却频繁超时。…...

微信聊天记录备份全攻略:从环境搭建到数据安全实战指南

微信聊天记录备份全攻略:从环境搭建到数据安全实战指南 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具,提供图形界面,解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/WechatBakTool …...

紧固件包装机有哪些类型?自动化包装设备全解析_FES 2026上海紧固件展

2026第十六届上海紧固件专业展(Fastener Expo Shanghai 2026)将于6月24日至26日在国家会展中心(上海)举行。作为紧固件行业的重要展示窗口,本届展会将重点呈现制造端与后道环节的智能化升级,其中&#xff0…...

[特殊字符] 怕你停电的姐姐:UPS 还分 “直流” 和 “交流”? 今天一篇给你盘个透!

哈喽,我的老铁们!我是你们那个 “怕你停电” 的姐姐,也是专门卖 UPS 电源的姐姐!平时总有朋友问我:“姐姐,我看 UPS 有好多种,什么直流交流的,到底有啥区别?我该咋选&…...

计算机毕业设计springboot校园互助平台 基于SpringBoot的高校学生互助服务系统 SpringBoot框架下的校园协同帮助平台

计算机毕业设计springboot校园互助平台3m6f99 (配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享近年来,随着互联网技术的蓬勃发展和智慧校园建设的深入推进,高校学生对于便…...

石家庄整家定制口碑供应商

在石家庄,寻找一家值得信赖的整家定制服务商,是许多家庭在装修时的重要考量。一个优秀的定制品牌,不仅能为居者提供个性化的空间解决方案,更能将美学、功能与品质融为一体,让日常居住成为一种享受。关于我们位于石家庄…...

比亚迪多款新车激光雷达性能超越华为:千线级感知开启智驾新纪元

2026年,中国智能驾驶行业正式进入“千线级激光雷达”时代。继华为发布896线双光路激光雷达后,比亚迪携速腾聚创EM4数字化激光雷达强势反击,以1080线物理扫描、600米最远探测的硬核参数,在核心感知硬件上实现对华为的全面超越。这一突破不仅标志着比亚迪补齐了智能化短板,更…...

HBuilderX + 极光推送踩坑实录:免费版为啥息屏收不到通知?手把手教你配置与避坑

HBuilderX与极光推送免费版避坑指南:破解息屏通知失效难题 早上八点,你的咖啡还没喝完,测试组的消息就炸开了锅——"昨晚推送的版本在息屏状态下根本收不到通知!"作为使用HBuilderX开发跨平台应用的团队,这个…...

1.1 AI技术全景图:从传统ML到大模型

AI技术全景图:从传统ML到大模型本文适合谁:完全没有AI背景的读者。读完这篇,你会知道"AI/机器学习/深度学习/大模型"这几个词是什么关系,以及你将要学的东西在整个AI世界里处于什么位置。AI发展经历了三个时代——本文带…...

MATLAB Simulink代码生成全流程详解:涵盖环境配置、参数与信号配置、函数名配置、数...

matlab simulink代码生成 包括:环境配置,参数与信号配置,函数名配置,数据管理,代码生成,以及代码优化等 文档63页把Simulink模型变成可烧录的C代码,这事儿听起来挺玄乎,但只要你踩过…...

深度解析Windows微信自动化:Wechaty Puppet XP零成本架构设计与实战指南

深度解析Windows微信自动化:Wechaty Puppet XP零成本架构设计与实战指南 【免费下载链接】puppet-xp Wechaty Puppet WeChat Windows Protocol 项目地址: https://gitcode.com/gh_mirrors/pu/puppet-xp 在即时通讯自动化领域,Windows平台微信机器…...

如何通过WechatRealFriends解决微信单向好友检测难题

如何通过WechatRealFriends解决微信单向好友检测难题 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 在数字化社…...

CGAL-6.0.1在Win11与VS2019环境下的高效编译与配置指南

1. 环境准备:搭建Win11VS2019开发环境 在开始编译CGAL-6.0.1之前,我们需要确保开发环境配置正确。我实测发现,Win11系统与VS2019的组合存在一些特殊配置需求,这里分享几个关键检查点: 首先确认VS2019的安装组件。打开V…...

系统架构设计师知识点21-40

21.ABSD方法的三个基础。①功能分解,使用已有的基于模块的内聚与耦合技术②选择架构风格实现质量和业务需求③软件模板使用22.ABSD方法是一个自顶向下,递归细化的方法,软件系统的体系结构通过该方法得到细化,直到能产生软件构件和…...

Meshery 1.0正式发布,为云原生基础设施提供新的管控层

跨多云环境管理Kubernetes基础设施长期以来产生了YAML文件泛滥、配置漂移以及依赖个人而非系统的知识问题。生成基础设施配置的AI工具速度超过了团队审查能力,使这个问题更加难以控制。开源Meshery技术正是为了解决这一问题而构建的。Meshery v1.0现已发布&#xff…...

OpenClaw故障排查大全:百川2-13B量化模型接入常见报错解决

OpenClaw故障排查大全:百川2-13B量化模型接入常见报错解决 1. 当网关拒绝启动时 上周深夜调试OpenClaw时,我遇到了最棘手的网关启动失败问题。控制台反复报错Error: listen EADDRINUSE: address already in use :::18789,但用lsof -i :1878…...

GNSS说第(八)讲---自适应动态导航定位(八)---抗差估计在复杂环境下的应用实践

1. 抗差估计:GNSS定位的"防弹衣" 想象一下你在高楼林立的城市峡谷中打开手机导航,信号时断时续,定位图标像喝醉酒一样到处乱飘——这就是典型的多路径干扰场景。传统最小二乘法就像用普通尺子测量扭曲的橡皮筋,单个异常…...

全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读

全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读 在基因组学研究领域,序列比对是揭示物种间进化关系、识别保守区域和功能元件的基础操作。mVISTA作为一款专门用于全基因组序列比对的在线工具,凭借其直观的可视化界面和强…...

OpenCore Configurator:革新性黑苹果配置工具,让复杂引导设置化繁为简

OpenCore Configurator:革新性黑苹果配置工具,让复杂引导设置化繁为简 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 价值定位&#…...

OpenClaw深度配置:Qwen3.5-9B模型参数调优指南

OpenClaw深度配置:Qwen3.5-9B模型参数调优指南 1. 为什么需要关注模型参数调优? 第一次用OpenClaw对接Qwen3.5-9B模型时,我遇到了一个奇怪现象:同样的"整理桌面截图并分类归档"任务,白天执行成功率能达到8…...

某民办高校关键人才梯队建设项目成功案例纪实

——破解“断层”隐忧,构建人才梯队蓄水池【客户行业】学校、民办学校、民办高等教育【问题类型】人才梯队建设;人才培养体系;激励体系;核心人才保留【客户背景】长三角地区一所知名的民办应用型本科院校,建校25年&…...