PostgreSQL 为什么怕听到 FREEZEN 这个词的解释与"盯着"他

本文深入探讨了PostgreSQL中由于32位事务ID限制带来的问题及其解决方案。当事务ID接近耗尽时,PostgreSQL通过HALFBYHALF策略和FREEZING过程来管理事务ID,避免系统停止。FREEZING包括lazy和eager两种模式,通过VACUUM过程回收事务ID。此外,介绍了如何监控和预防事务ID耗尽,以及如何调整参数以防止系统冻结。监控数据库中oldest_current_txid和autovacuum_freeze_max_age的关系是关键,及时执行VACUUM或调整设置能有效避免问题发生。

完美无缺的系统是不存在的,或者认为某个系统很完美的你,不完美,今天就的开始talk一下Postgresql 的一个“不可回避的问题”, FREEZEN.

POSTGRESQL FREEZEN 到底是什么,为什么提到这个事情心里总有些惴惴不安,的从POSTGRESQL 的原理开始,POSTGRESQL 中的事务ID 是32位组成的,也就是说系统分配的事务的ID是有限的.

在一个繁忙的系统中,事务的ID被用完怎么办,系统就停止了?  POSTGRESQL 通过HALF BY HALF 的方式来解决这个问题,就是一半可用一半不可用,将可用的事务的ID 变成2.1亿.

通过下面粗略的比喻的图, 我们这样讲解,如果我就有12个事务的ID, 那么我不能说我把事务号都分了,然后我的事务分到12,下面就没有号了,我就的想着我需要将这些号分成两个部分, 一部分为不能见人的(不让你用), 一部分是被使用的.

然后我们通过增加的模式,我当前的事务号如果用到了2 ,下一个就是1 ,但是原来7 号可见, 那如果1号可见了,7号就必须要回收,变成不可见.

那么这里就会产生

我从数字1 开始使用依次为   1   12  11  10  9  8  , 当我用到 7 的时,我已经达到一半一半的状态了, 此时我就需要回收的TIX 事务号了, 1 12  11 10 9 8  这些数字我的回收了. 

听上去回收事务号并不太难,但这些事务的ID 在哪里,在每行tuple 上, 那21亿个事务,并且使用这些事务的行,都要对回收的这个事情进行响应.  每行上都有 t_xmin 和 t_xmax 两个值并且这些值都存储了事务ID

那么此时系统是不是应该处于这个状态.

PostgreSQL 有三个特殊的事务的ID , 

0 是不可见的事务ID 

1 是数据库初始化时的事务ID

2 是冻结的事务的ID ,这个ID 比任何的事务的ID 都老,也就是不可见,并且POSTGRESQL 会掌握处于"冻结"的

那么此时有同学会问,虽然2.1一个亿的数字也是蛮大的,但是我还是不想去脑瘫,那我应该怎么办.

POSTGRESQL 这么聪明的数据库当然有办法解决问题,怎么解决, 一个字, "滚". 滚动的滚.

vacuum_freeze_min_age 这个参数将帮助你,解决上面的问题, 默认是5000万,当你的事务的ID 使用的数量达到5000万的时候, 那么frozen的动作就开始了, 

大白话就是我如果从7开始使用 我不会说用到2的时候,在进行FROZEN,而是我在用到4的时候我就将6  ,7 就变成不可见,将 1  ,12 变成可见.

那么接下来的问题是,他怎么进行冻结的活动,也就是 frozen processing, forzen 的方式有两种, 我们可以叫他们 lazy 和 eager 两种模式,这两种模式中的区别是,前者lazy模式中,是通过vacuum process的方式来处理,扫描dead tuple 来进行冻结的活动,而采用eager的方式将扫描所有的PAGE来进行FROZEN的活动,  并且更新相关系统的VIEW,和清理不在使用的CLOG文件。

怎么计算那些事务的ID 是可以被回收的

可以回收的TXID = 当前最老的xmin - vacuum_freeze_min_age,普通的vacuum进程逐个扫描页面,同时与vm可见性映射协作跳过没有死元组的页面,并将元组t_infomask (xmin小于freezelimit_txid)设置为XMIN_FROZEN。清理完成后,n_live_tuple、n_dead_tuple、vacuum_count、autovacuum_count、last_autovacuum、last_vacuum等统计信息将被更新。

对于表来说,通过PG_CLASS 中的 relfrozenxid来鉴别表中的最小的xmin id  ,对于数据库也是一样通过pg_database  的字段datfrozenxid 来判别。

触发数据库的急冻datfrozenxid < oldestxmin-vacuum_freeze_table_age,

怎么监控

WITH max_age AS (    
SELECT 2000000000 as max_old_txid
, setting AS autovacuum_freeze_max_age        
FROM pg_catalog.pg_settings        
WHERE name = 'autovacuum_freeze_max_age' ),
per_database_stats AS (    
SELECT datname        ,
m.max_old_txid::int        , m.autovacuum_freeze_max_age::int        ,
age(d.datfrozenxid) AS oldest_current_txid    
FROM pg_catalog.pg_database d   
 JOIN max_age m ON (true)    
 WHERE d.datallowconn )
 SELECT max(oldest_current_txid) AS oldest_current_txid    ,
 max(ROUND(100*(oldest_current_txid/max_old_txid::float))) ASconsumed_txid_pct    ,
 max(ROUND(100*(oldest_current_txid/autovacuum_freeze_max_age::float)))AS consumed_autovac_max_age
 FROM per_database_stats;

 oldest_current_txid 表示为当前所有数据库中最老的事务ID,

asconsumed_trix_pct 为当前消耗了多少事务ID 占据的百分比,数字越大,就说明距离危险越近了。

consumed_autovac_max_age 参数说明你距离触发FREAZON的距离还有多远

那如果发现了上面的情况不大对头的情况下,怎么办

SELECT datname, age(datfrozenxid) AS frozen_xid_age , ROUND(100*(age(datfrozenxid)/2000000000.0::float)) consumed_txid_pct , current_setting('autovacuum_freeze_max_age')::int - age(datfrozenxid) AS remaining_aggressive_vacuum FROM pg_database;

赶紧针对数据库去查看那个数据库要出事. 最后去定位那个表要出事,然后下一步就是解决他

实际上POSTGRESQLVACUUM 以及 AUTOVUCUUM  和事务ID内卷化的参数调整,还需要继续一段文字的描述,  不过首先我们先认识他,以及他的危害,并通过手段来监控,是第一步.

<think>好的,我需要帮助用户解决在统信UOS 1040系统和华为麒麟990芯片上安装PostgreSQL的问题,以及解释`sudo apt install postgresql-contrib -y`命令的作用。首先,回顾之前的对话,用户已经询问过适配的版本,我给出了使用Docker、源码编译和社区维护的包等建议。现在用户提供了新的引用内容,我需要结合这些信息来调整回答。 首先,统信UOS是基于Debian的,所以引用中的Ubuntu安装信息可能有参考价值。引用2提到添加PostgreSQL官方APT仓库的步骤,这可能适用于统信系统,但需要确认系统版本是否兼容。用户提到的问题是关于datlastsysoid字段的,但用户当前的问题是关于版本选择和命令解释,所以需要确保推荐的版本不会存在类似的问题,比如避免Navicat版本冲突。 用户现在明确想了解统信1040上适合麒麟990的PostgreSQL版本,以及postgresql-contrib的作用。麒麟990是ARM架构,所以需要确认PostgreSQL的ARM兼容性。官方APT仓库可能提供ARM架构的二进制包,如引用2中的步骤,但需要确认统信是否支持。另外,引用1中的yum安装是针对RPM包的,而统信使用APT,所以可能不适用,但可以说明不同的包管理工具。 关于版本选择,根据引用3,Postgres 15移除了某些字段,导致旧版Navicat出错,所以如果用户使用Navicat,需注意版本兼容性。但用户现在的问题可能更关注系统兼容性而非客户端工具,所以需要综合考虑。 建议用户通过官方APT仓库安装最新稳定版,如PostgreSQL 15,但需确认是否有ARM构建。若没有,可能需要源码编译或使用Docker。同时,解释postgresql-contrib包的作用,包含扩展功能,如附加模块和工具。 需要确保回答结构清晰,分点说明版本选择和命令作用,并引用提供的引用内容,比如引用2的APT仓库步骤,但需调整以适合统信系统。同时,提醒用户注意系统架构和可能的依赖问题,如引用3中的兼容性问题。 最后,生成相关问题,帮助用户进一步了解安装步骤、验证安装和贡献包内容。</think>### 统信UOS 1040系统适配PostgreSQL版本命令解析 #### 一、版本选择建议 针对**华为麒麟990芯片(ARM架构)**和**统信UOS 1040系统(基于Debian)**,推荐以下PostgreSQL版本及安装方式: 1. **官方APT仓库安装(推荐)** 统信UOS支持通过APT包管理工具安装PostgreSQL。根据引用[2],可添加PostgreSQL官方仓库并安装最新稳定版。以下为适配步骤: ```bash # 添加PostgreSQL官方仓库(需确认统信系统版本是否匹配) sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update # 安装PostgreSQL(默认最新版或指定版本,如postgresql-15) sudo apt install postgresql-15 -y ``` **注意**: - 统信UOS的底层依赖可能标准Debian存在差异,若官方仓库安装失败,需尝试源码编译。 - PostgreSQL 15已移除部分旧字段(如`datlastsysoid`,引用[3]),若使用旧版客户端工具(如Navicat <15.0.29),需升级客户端或选择PostgreSQL 14等旧版本。 2. **源码编译(备选方案)** 若官方仓库未提供ARM架构的二进制包,可从[PostgreSQL官网](https://www.postgresql.org/download/)下载源码编译: ```bash # 安装编译依赖 sudo apt install build-essential libreadline-dev zlib1g-dev flex bison -y # 解压并编译 ./configure --prefix=/usr/local/pgsql make && sudo make install ``` 3. **Docker容器化部署** 使用ARM优化的Docker镜像可避免环境依赖问题: ```bash docker run --name postgres-arm -e POSTGRES_PASSWORD=your_password -d postgres:15-alpine ``` --- #### 二、`sudo apt install postgresql-contrib -y`命令解析 此命令用于安装**PostgreSQL附加功能包**(`postgresql-contrib`),主要包含以下内容: 1. **扩展模块** 如`pgcrypto`(加密函数)、`hstore`(键值对存储)、`uuid-ossp`(UUID生成工具)等,增强数据库功能。 2. **管理工具** 包括`pg_standby`(备份恢复工具)、`pgbench`(性能测试工具)等。 3. **插件支持** 为第三方插件(如PostGIS)提供基础依赖库(引用[1]中`postgresql96-devel`类似功能,但通过APT管理)。 **典型应用场景**: - 需要扩展SQL功能时(如地理空间数据处理)。 - 执行性能压测或高级备份操作。 - 开发基于PostgreSQL的定制化应用。 --- ### 注意事项 1. **架构验证** 执行`uname -m`确认系统架构为`aarch64`(ARM64),确保所选版本兼容。 2. **客户端兼容性** 若使用图形化工具(如Navicat),需匹配PostgreSQL版本(引用[3]问题示例)。 3. **生产环境建议** 优先通过官方仓库或Docker部署,避免源码编译带来的维护成本。 --- ### 相关问题 1. 如何验证PostgreSQL是否成功安装并运行在ARM架构的统信系统上? 2. 统信UOS 1040系统安装PostgreSQL时遇到依赖错误应如何解决? 3. `postgresql-contrib`包含哪些具体扩展模块?如何启用它们?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值