postgre事务id用完后,如何解决这个问题

在PG中事务年龄不能超过2^31 (2的31次方=2,147,483,648),如果超过了,这条数据就会丢失。
PG中不允许这种情况出现,当事务的年龄离2^31还有1千万的时候,数据库的日志中就会
有如下告警:

warning:database “UniMonDB” must be vacuumed within 177000234 trabnsactions
HINT: To avoid a database shutdown,execute a database-wide VACUUM in “UniMonDB”.

如果不处理,当事务的年龄离2^31还有1百万时,数据库服务器出于安全考虑,将会自动
禁止任何来自任何用户的连接,同时在日志中是如下信息:(某个现场服务器的pg日志截图)
请添加图片描述
然后我们去查看这个表的事务id
请添加图片描述
请添加图片描述
也是因为某个表的事务id用完了,出现的这个问题,我们的程序使用了otlv4的相关数据库接口,会导致程序操作数据库的时候崩溃。所以不管怎样都需要解决事务id用完这个问题。看过其他方案,进入pg的单用户模式对全表进行vacuum freeze或者vacuum full。我们根据自身情况做对应处理,以下是实际生产环境上的操作步骤。

对于事务id消耗较少的表:

先回收空间

1)、停止数据库服务
2)、备份数据库,确定数据库停止后,可以直接copy一份main目录
tar -cvzf /var/lib/postgresql/9.1/main_back.tar /var/lib/postgresql/9.1/main
3)、备份好后,启动数据库
4)、查询死元组数据的十张表,并将表名记录下来
select relname, coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup+n_dead_tup end), 2),0.00) as dead_tup_ratio, n_dead_tup ,n_live_tup, last_vacuum, last_autovacuum from pg_stat_all_tables where relname like ‘tbl_%’ order by n_dead_tup desc limit 10;
在这里插入图片描述

5)、一张表一张表清理,清理命令(vacuum full 表名)
在这里插入图片描述

6)、vacuum执行完后,再查看死元组数量,表名用第四步查出来的表名
select relname, coalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup+n_dead_tup end), 2),0.00) as dead_tup_ratio, n_dead_tup ,n_live_tup, last_vacuum, last_autovacuum from pg_stat_all_tables where relname in (‘tbl_formconfig’,‘tbl_userpermission’,‘tbl_iniext’,'tbl_processlistinfo ',‘tbl_userloginerror’,‘tbl_devchangeinfo’,‘tbl_secpolicysetinfo’,‘tbl_devbaseinfo’,‘tbl_pcidevinfo’,‘tbl_ini’);

7)、这是因为pg_stat_all_tables的数据没有几十更新,也就是第四步查询的数据不会变,如下
在这里插入图片描述

8)、这时候需要手动更新相关表数据才行,表名用第四步查出来的表名
analyze tbl_formconfig, tbl_userpermission, tbl_iniext, tbl_processlistinfo , tbl_userloginerror, tbl_devchangeinfo, tbl_secpolicysetinfo, tbl_devbaseinfo, tbl_pcidevinfo, tbl_ini;
然后再用第6步的命令查询就ok了。
在这里插入图片描述

而后再回收事务id
1)、停止数据库服务
2)、备份数据库,确定数据库停止后,可以直接copy一份main目录
3)、tar -cvzf /var/lib/postgresql/9.1/main_back.tar /var/lib/postgresql/9.1/main
4)、备份好后,启动数据库
5)、查出表年龄最大的十张表,记住表名
select relname,age(relfrozenxid) from pg_class where relkind in (‘t’,‘r’) and relname like ‘tbl_%’ order by age(relfrozenxid) desc limit 10;
在这里插入图片描述

6)、处理表事务id ,第五步记住的表名
vacuum freeze 表名;
在这里插入图片描述

7)、查询处理后的状态,第五步记住的表名
select relname,age(relfrozenxid) from pg_class where relkind in (‘t’,‘r’) and relname in (‘tbl_acaccountinfo’, ‘tbl_acaccountmgm’, 'tbl_acaccountmgmresult ', 'tbl_acagentaccessaudit ', ‘tbl_acagentinfo’, ‘tbl_acauditinfo’, ‘tbl_acauditsecpolicy’, ‘tbl_acbaseparam’, ‘tbl_acl’, ‘tbl_aclentry’);
在这里插入图片描述

而如果事务id的使用情况是tbl_devprofile这种情况。vacuum可能会非常的耗时,并且可能会失败并且出现一系列的其他问题,增加处理的负担。

在这里插入图片描述
对此不妨尝试重建新库的方式来重置事务id

pg迁移旧数据库内容到新库
注!!/var/lib/pgsql/是linux用户postgres的家目录,不同环境可能会不通,请自己修改nohup pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -f /root/backup.sql &             --先导出原UniMonDB的所有数据
chmod 777 /root/backup.sql ; chown leagsoft:leagsoft /root/backup.sql               --修正权限
mv /root/backup.sql /var/lib/pgsql/                                                 --把备份数据放到postgres的家目录下
然后
su - postgres                                                                       --切换至postgres
/usr/pgsql-11/bin/initdb -d ~/main                                                  --初始化一个全新的库,面子也叫main,暂时放在postgres的家目录下
cp /var/lib/postgresql/9.1/main/postgresql.conf ~/
cp /var/lib/postgresql/9.1/main/postgresql.auto.conf ~/
cp /var/lib/postgresql/9.1/main/pg_hba.conf ~/                                      --将旧库的是哪个配置文件先先放到postgres的家目录chmod 600 postgresql.conf postgresql.auto.conf pg_hba.conf                          --修正权限
cp postgresql.conf postgresql.auto.conf pg_hba.conf ~/main                          --替换新库的配置文件vi ~/main/postgresql.conf                                                           --把里面的端口从5432改成别的,比如6432
/usr/pgsql-11/bin/pg_ctl -D main  start                                             --手动启动的方式启动新库
psql -p 6432                                                                        --进入新库控制台
\i backup.sql                                                                       --导入备份的数据到新库
\q                                                                                  --退出控制台
vi ~/main/postgresql.conf                                                           --把里面的端口改回5432切回root
systemctl stop postgresql                                                           --软件将/var/lib/postgresql/9.1/main的启动注册称为了系统服务,停止旧库
mv /var/lib/postgresql/9.1/main /var/lib/postgresql/9.1/main_old                    --将旧库备份
mv /var/lib/pgsql/main /var/lib/postgresql/9.1/main                                 --将新库放到系统服务的指定路径
systemctl start postgresql                                                          --启动新库一切恢复正常

所以实际生产中可以定期去做收缩回收操作

以上是从同事那偷学的解决方案

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

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

相关文章

js获取当前浏览器地址,ip,端口号等等

前言: js获取当前浏览器地址,ip,端口号等等 window.location属性查询 具体属性: 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…

【机器学习】基于层次的聚类方法:理论与实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 基于层次的聚类方法:理论与实践引言1. 层次聚类基础1.1 概述1.2 距离…

讨论Nginx服务器的反爬虫和反DDoS攻击策略

Nginx服务器是一个高性能的Web服务器和反向代理服务器,具有强大的反爬虫和反DDoS攻击能力。本文将讨论Nginx服务器的反爬虫和反DDoS攻击策略,并给出相关的代码示例。 一、反爬虫策略 爬虫是一种自动化程序,用于从互联网上收集特定网站的数据…

【产品运营】Saas的核心六大数据

国内头部软件公司的一季度表现惨不忍睹,为啥美国的还那么赚钱呢?其实核心是,没几个Saas产品经理是看数据的,也不知道看啥数据。 SaaS 行业,天天抛头露面、名头叫的响的 SaaS 产品,真没有几个赚钱的。 那为…

笔记101:OSQP求解器的底层算法 -- ADMM算法

前言1:这篇博客仅限于介绍拉格朗日乘子法,KKT条件,ALM算法,ADMM算法等最优化方法的使用以及简版代码实现,但不会涉及具体的数学推导;不过在下面我会给出具体数学推导的相关文章和截图,供学有余力…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

CCAA:认证通用基础 10(审核的概念、审核有关的术语、审核的特征、审核原则)

10.审核的概念、审核有关的术语、审核的特征、审核原则 10.1审核的基本概念 第一章 审核基础知识 第一节 概述 1.什么是审核 审核是认证过程中最基本的活动,是审核方案的重要组成部分,其实施效果直接影响到审核方案的意图和审核目标的达成。 在认证…

葡萄串目标检测YoloV8——从Pytorch模型训练到C++部署

文章目录 软硬件准备数据准备数据处理脚本模型训练模型部署数据分享软硬件准备 训练端 PytorchultralyticsNvidia 3080Ti部署端 fastdeployonnxruntime数据准备 用labelimg进行数据标注 数据处理脚本 xml2yolo import os import glob import xml.etree.ElementTree as ETxm…

DSPy:变革式大模型应用开发

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模…

ADS1220IRVAR 模数转换器(ADC) TI德州仪器 封装 国产替代

ADS1220IRVAR 模数转换器(ADC) TI德州仪器 封装 国产替代

docker 多网卡指定网卡出网

前言 宿主机中有多个网卡 ens160 192.168.4.23/20 内网通信用 ens192 10.31.116.128/24 出公网访问-1 ens193 10.31.116.128/24 出公网访问-2 现在需要不同容器中不同出网访问,举例 容器1 192.168.0.1/20 网段走宿主机 ens160网卡,否则全部走ens192 网…

vue根据文字长短展示跑马灯效果

介绍 为大家介绍一个我编写的vue组件 auto-marquee ,他可以根据要展示文本是否超出展示区域,来判断是否使用跑马灯效果,效果图如下所示 假设要展示区域的宽度为500px,当要展示文本的长度小于500px时,只会展示文本&…

1077 韩信点兵

这是一个中国剩余定理的问题。中国剩余定理是数论中的一个定理,它给出了一组同余方程的解的存在性和唯一性。在这个问题中,我们需要找到一个数,使得它对给定的每个质数取余的结果等于给定的余数。 以下是一个使用C实现的解决方案&#xff1a…

【每日一练】Python遍历循环

1. 情节描述:上公交车(10个座位),并且有座位就可以坐下 要求:输入公交卡当前的余额,只要超过2元,就可以上公交车;如果车上有空座位,才可以上。 seat 10 while seat > 0:money int(input(…

CentOS修复OpenSSH漏洞升级到openssh 9.7 RPM更新包

在做政府和学校单位网站时,经常需要服务器扫描检测,经常被OpenSSH Server远程代码执行漏洞(CVE-2024-6387)安全风险通告,出了报告需要升级OpenSSH。 使用yum update openssh是无法更新到最新的,因为系统里的…

JsonCpp:更简洁的序列化及反序列化

简介 jsoncpp 提供了一组简单易用的 API&#xff0c;使得在 C 程序中处理 JSON 数据变得更加方便和高效。 安装 linux环境下安装jsoncpp sudo apt-get update sudo apt-get install --reinstall libjsoncpp-dev建立软链接确保编译器找到头文件 #include <json/json.h>…

Vue原生写全选反选框

效果 场景&#xff1a;Vue全选框在头部&#xff0c;子框在v-for循环内部。 实现&#xff1a;点击全选框&#xff0c;所有子项选中&#xff0c;再次点击取消&#xff1b;子项全选中&#xff0c;全选框自动勾选&#xff0c;子项并未全选&#xff0c;全选框不勾选&#xff1b;已选…

LVM核心概念

1. LVM简介 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。 优点&#xff1a; 可以灵活分配…

大数据学习之Clickhouse

Clickhouse-23.2.1.2537 学习 一、Clickhouse概述 clickhouse 官网网址&#xff1a;https://clickhouse.com/ ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 OLTP(联机事务处理系统)例如mysql等关系型数据库&#xff0c;在对于存储小数据量的时候&#xff…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言&#xff1a; 最近AI爆发式的火&#xff0c;忆往昔尤记得16,17那会移动互联网是特别火热的&#xff0c;也造富了一批公司和个人&#xff0c;出来了很多精妙的app应用。现在轮到AI发力了&#xff0c;想想自己也应该参与到这场时代的浪潮之中&#xff0c;所以就找了开源的…