PostgreSQL: 事务年龄
排查
在 PostgreSQL 数据库中,事务年龄(也称为事务 ID 年龄)是一个重要的监控指标,因为 PostgreSQL 使用事务 ID(XID)来保持事务的隔离性。每个事务都会被分配一个唯一的事务 ID,这个 ID 随着每个新事务的创建而递增。当事务 ID 达到一定上限时,如果没有及时处理,可能会导致问题,比如无法创建新的事务。
你提到的 autovacuum_freeze_max_age 是 PostgreSQL 中的一个参数,它指定了在自动冻结(autovacuum freeze)发生之前,最旧活跃事务 ID 与当前事务 ID 之间的最大差值。当表的事务年龄超过这个值时,autovacuum 进程会自动对表进行冻结,以回收不再需要的事务 ID。
你提供的查询是用来监控数据库和表的事务年龄的:
-
数据库事务年龄监控:
SELECT datname, age(datfrozenxid) AS age FROM pg_database WHERE upper(datname) NOT IN ('TEMPLATE0', 'TEMPLATE1', 'TEMPLATE2', 'SAMPLES') ORDER BY 2 DESC;这个查询显示了每个数据库的名称和其
datfrozenxid的年龄,即最旧的事务 ID。 -
表事务年龄监控:
SELECT c.oid::regclass AS table_name, greatest(age(c.relfrozenxid), age(t.relfrozenxid)) AS age FROM pg_class c LEFT JOIN pg_class t ON c.reltoastrelid = t.oid WHERE c.relkind IN ('r', 'm') ORDER BY age DESC;这个查询显示了每个表(包括主表和 toasted 表)的名称和其
relfrozenxid的年龄。
对于手动清理方式,你提到了两种方法:
-
使用
VACUUM FREEZE:vacuum freeze table_name;这个命令可以手动对指定的表进行冻结,回收不再需要的事务 ID。
-
使用
pg_squeeze:
pg_squeeze是一个第三方工具,它可以在不锁定表的情况下回收空间。它通过重写表来实现,这通常涉及到创建一个新表,将数据从旧表复制到新表,然后替换旧表。这种方法可以在不影响应用程序的情况下进行,但是它可能会更复杂,并且需要更多的系统资源。
在处理事务年龄问题时,应该考虑以下几点:
- 确保
autovacuum进程正在运行,并且配置得当,以便它能够及时地对数据库进行维护。 - 定期监控数据库和表的事务年龄,以便在问题变得严重之前采取行动。
- 在高负载的系统中,可能需要更频繁地运行
VACUUM或VACUUM FREEZE。 - 在使用
pg_squeeze之前,确保你了解其工作原理和可能的影响,并且已经做好了适当的备份。
最后,如果你的数据库事务数量经常接近上限,可能需要考虑增加 max_connections 参数,或者优化应用程序以减少长事务的数量。
模拟事务ID回卷:
在测试环境中,可以通过重置WAL日志文件来模拟事务ID的回卷,这将导致事务ID快速增加,从而触发告警。但请注意,这种方法需要在控制的环境中进行,以避免对生产数据造成影响。
设置数据库参数:
调整数据库参数,如xid_warn_limit和xid_stop_limit,这些参数控制事务ID剩余值多少时数据库会告警或切换为只读。例如,当距离xid_stop_limit的值不足一定数量时,数据库会触发年龄告警
。
监控
要设置具体的命令来监控和告警 PostgreSQL 数据库的事务年龄,你可以按照以下步骤操作:
-
监控数据库事务年龄:
使用以下 SQL 命令来获取数据库的事务年龄:SELECT datname, age(datfrozenxid) AS age FROM pg_database WHERE upper(datname) NOT IN ('TEMPLATE0','TEMPLATE1','TEMPLATE2','SAMPLES') ORDER BY 2 DESC; -
设置告警阈值:
假设你希望在事务年龄超过 500,000,000 时触发告警,你可以使用这个值作为告警阈值。 -
编写脚本:
创建一个 shell 脚本,比如check_db_age.sh,用于检查事务年龄并发送告警:#!/bin/bash# 数据库连接参数 DB_HOST="localhost" DB_USER="your_username" DB_PASS="your_password" DB_NAME="your_database"# 告警阈值 ALERT_THRESHOLD=500000000# 获取事务年龄 DB_AGE=$(psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT age(datfrozenxid) FROM pg_database WHERE datname = current_database()" -t -A)# 检查是否超过告警阈值 if [ "$DB_AGE" -gt "$ALERT_THRESHOLD" ]; thenecho "Alert: Database age is too high: $DB_AGE"# 发送告警,这里以发送邮件为例echo "Database age alert for $DB_NAME" | mail -s "Database Age Alert" your_admin_email@example.com elseecho "Database age is within acceptable limits: $DB_AGE" fi -
设置定时任务:
使用cron定时任务来定期执行脚本。编辑crontab文件:crontab -e添加以下行来每5分钟执行一次脚本:
*/5 * * * * /path/to/check_db_age.sh -
邮件发送配置(如果使用邮件告警):
确保服务器上配置了邮件发送工具,如mail命令或sendmail。 -
测试脚本:
在生产环境之外的测试环境中运行脚本,确保它按预期工作。 -
监控工具集成:
如果你使用的是监控工具,如 Prometheus,你可以设置一个告警规则,当事务年龄超过阈值时触发告警。这通常涉及到编写一个 Prometheus 表达式,并在 Prometheus 的告警管理器中设置。 -
日志记录:
在脚本中添加日志记录功能,以便记录每次检查的结果,这对于事后分析非常有用。
请注意,这些命令和脚本需要根据你的实际环境进行调整,包括数据库连接信息、告警接收者、邮件发送配置等。此外,确保脚本具有执行权限:
chmod +x /path/to/check_db_age.sh
模拟
在 PostgreSQL 中,事务年龄(Transaction ID age)是指当前事务 ID(Transaction ID,简称 XID)与数据库中最小的活跃 XID(即 datfrozenxid)之间的差值。要模拟事务年龄超过 500,000,000 的情况,你需要执行以下步骤:
-
创建长时间运行的事务:
创建一个或多个长时间运行的事务,这些事务将占用 XID,从而增加事务年龄。你可以使用以下 SQL 命令来创建一个长时间运行的事务:BEGIN; -- 执行一些操作,例如: SELECT * FROM your_table WHERE condition; -- 保持事务打开,不要提交或回滚 -
监控 XID 的增长:
使用txid_current()函数来获取当前的 XID,然后计算它与datfrozenxid的差值。你可以使用以下 SQL 命令来监控 XID 的增长:SELECT txid_current() - datfrozenxid AS xid_age FROM pg_database WHERE datname = 'your_database'; -
增加 XID 的消耗:
为了模拟 XID 快速增长,你可以在事务中执行大量的插入、更新或删除操作,这将消耗更多的 XID。 -
使用
pg_stat_activity视图:
监控长时间运行的事务,确保它们没有被自动提交或回滚:SELECT * FROM pg_stat_activity WHERE state = 'active' AND query != '<IDLE>'; -
模拟
autovacuum冻结操作:
autovacuum进程会定期执行冻结操作,以回收不再需要的 XID。你可以通过调整autovacuum_freeze_max_age参数来控制冻结操作的频率。例如,将其设置为一个较小的值,以减少冻结操作的频率:ALTER SYSTEM SET autovacuum_freeze_max_age TO '100000000'; -
监控
datfrozenxid的变化:
使用以下 SQL 命令来监控datfrozenxid的变化:SELECT datname, datfrozenxid FROM pg_database WHERE datname = 'your_database'; -
触发告警:
当事务年龄超过 500,000,000 时,你可以设置一个告警机制。这可以通过编写一个脚本,定期检查事务年龄,并在超过阈值时发送通知。 -
结束长时间运行的事务:
在模拟结束后,确保结束所有长时间运行的事务,以避免对数据库性能造成影响:COMMIT; -- 或者 ROLLBACK;
请注意,模拟长时间运行的事务可能会对数据库性能产生负面影响,因此在生产环境中进行此类操作需要谨慎。建议在测试环境中进行模拟,以评估其对系统的影响。此外,确保在进行此类测试之前,已经对数据库进行了备份。
相关文章:
PostgreSQL: 事务年龄
排查 在 PostgreSQL 数据库中,事务年龄(也称为事务 ID 年龄)是一个重要的监控指标,因为 PostgreSQL 使用事务 ID(XID)来保持事务的隔离性。每个事务都会被分配一个唯一的事务 ID,这个 ID 随着每…...
C# 识别二维码
文章目录 一. 二维码识别技术概述二 维码识别的步骤图像预处理二维码的定位和检测二维码解码 三 常用的二维码识别库1. OpenCV2. ZXing.Net 一. 二维码识别技术概述 二维码是一种通过黑白矩阵排列来编码数据的图形符号,它的编码方式具有较强的容错性,可以…...
KeepAlive与RouterView缓存
参考 vue动态组件<Component>与<KeepAlive> KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…...
RK3588 , mpp硬编码rgb, 保存MP4视频文件.
RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp...
使用 Wireshark 和 Lua 脚本解析通讯报文
在复杂的网络环境中,Wireshark 凭借其强大的捕获和显示功能,成为协议分析不可或缺的工具。然而,面对众多未被内置支持的协议或需要扩展解析的场景,Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…...
ElasticSearch08-分析器详解
零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。 (1ÿ…...
【IN、NOT、AND、OR】在 MySql 中的使用方法,使用场景、注意事项
目录 IN NOT AND OR 注意事项: 使用场景: IN 用于指定某个字段的值在一个预定义的列表中。 SELECT * FROM users WHERE age IN (20, 25, 30);查询返回 age 字段 是20、25 、30 的用户记录。 NOT 用于对条件进行否定。 查询将返回与指定 条件相…...
Face to face
1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...
宝塔配置python项目提示python版本与安装的不符
用宝塔的网站添加了项目,配置选择了python3.8,但是在终端并且进入了虚拟环境查看python的版本居然还是默认是2.7.5版本。 官方是举列说明,这张图是用python管理器生成的 而我用的 网站--python项目, 那么虚拟路径在 /www/serve…...
Restaurants WebAPI(一)—— clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
c++数据结构算法复习基础--13--基数算法
基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位(个位、十位。。。),所以取值范围就为0-9。 根据该特点,设计桶的概念 – 0号桶、1号桶… 1、思想 1)找出最长的数字,确定要处理的…...
ntp设置
NTP(Network Time Protocol)简介 ntp授时定义 - NTP是一种用于在计算机网络中同步时间的协议。它确保网络中的各个设备(如服务器、客户端计算机、网络设备等)的时钟保持准确一致。 - 其工作原理是通过分层的时钟源体系ÿ…...
如何在Java中使用封装好的API接口?
1.选择合适的 HTTP 库 在 Java 中,可以使用多种库来进行 HTTP 请求。java.net.HttpURLConnection是 Java 标准库中的类,能够满足基本的 HTTP 请求需求,但使用起来相对复杂。另外,还有一些第三方库,如OkHttp和Apache H…...
AWS EKS 相关错误修复 - remote error: tls: internal error - CSR pending
现象 升级aws eks的kubernetes版本后执行kubectl logs 或者kubectl exec相关命令会出现报错 remote error: tls: internal error 执行kubectl get csr -A查看csr出现一直pending的状态,并且出现问题的pod都在新创建出来的eks node节点上 kubectl get csr -A NAME AGE …...
浏览器事件循环机制
JavaScript 是单线程运行的语言,同一时间只能执行一个任务。单线程意味着: 如果某个任务执行时间过长,后续任务会被阻塞。 同步任务和异步任务的调度需要一种机制来管理。 为了解决这个问题,事件循环应运而生,它可以…...
ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程
本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…...
概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。
目录 1 例子1:最典型的,最简单的数组的均值,方差的求法 2 例子1的问题:例子1只是1个特例,而不是普遍情况。 2.1 例子1各种默认假设,导致了求均值和方差的特殊性,特别简单。 2.2 我觉得 加权…...
【排序算法】——插入排序
目录 前言 简介 基本思想 1.直接插入排序 2.希尔排序 代码实现 1.直接插入排序 2.希尔排序 总结 1.时空复杂度 2.稳定性 尾声 前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列&…...
MySQL的并发控制与MVCC机制深度解析
目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC(多版本并发控制)机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点:缺点: 7. MVCC在…...
Qt编译MySQL数据库驱动
目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 (1)先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 (2)在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
