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

Greenplum的数据库年龄检查处理

概述

Greenplum是基于Postgresql数据库的分布式数据库,而PG数据库在事务及多版本并发控制的实现方式上很特别,采用的是递增事务id的方法,事务id大的事务,认为比较新,反之事务id小,认为比较旧。

事务id的上限是21亿,正常使用时,事务id只增不减,到达一定程度时,就会触发数据库告警直至数据库只读,无法创建新事务

减少事务id的方法是执行提供的回收命令。

gp一共是21亿可以使用,使用超过5亿就告警,超过11亿就锁库

两个重要参数

postgres=# show xid_warn_limit;xid_warn_limit
----------------500000000
(1 row)postgres=# show xid_stop_limit;xid_stop_limit
----------------1000000000
(1 row)

这个两个参数是控制事务id剩余值多少时数据库会告警,或切换为只读的

注意:事务id的总值是21亿

xid_warn_limit 当距离stop的值不足5亿时,数据库会触发年龄告警
xid_stop_limit 当距离21亿总值的剩余值不足10亿时,数据库会切换为只读

简单来说,针对默认的设置:

年龄1-5亿:无年龄问题
年龄5-11亿:会触发年龄告警,但不影响数据库使用
年龄11-21亿:数据库为只读,不能创建新事务

如何检查数据库年龄?

1.执行命令时年龄告警

查询表统计数据是出现异常提示:

WARNNING:database “XXX” must be  vacuumed within 177009986 transactions 
HINT: To avoid a database shutdown,execute a database-wide VACUUM in “XXX”

当数据库查询或者日志中出现上面告警时,说明需要对GP事务id进行清理

If these warnings are ignored, the system will shut down and refuse to start any new transactions ince there are fewer than 1 million transactions left until wraparound:
ERROR: database is not accepting commands to avoid wraparound data loss in database “XXXX”

当数据库查询或者日志中出现上面告警时,说明GP停止对外提供服务

2.查询当前数据库年龄

SELECT gp_segment_id,datname, age(datfrozenxid) FROM gp_dist_random(‘pg_database’) ORDER BY 3 DESC;

例子:
比如这里查询当前年龄,最上面的值为2亿多,说明年龄在2亿左右

postgres=# SELECT gp_segment_id,datname, age(datfrozenxid) FROM gp_dist_random('pg_database') ORDER BY 3 DESC;gp_segment_id |                  datname                   |    age
---------------+--------------------------------------------+-----------0 | test01					                    | 2707979230 | test02					                    | 2707979230 | test03			                            | 270797923

如果是11亿,告警锁库了

3.如何界定年龄是否要处理

如果出现上面1 的告警,说明年龄已经到达警戒值,需要处理。
如果2 年龄超过5亿,说明即将告警,也需要处理

超过11亿,数据库就会锁库

告警年龄处理

在年龄到达告警值且未到锁库值的时候,此时数据库服务正常,就是命令会有warning输出

此时需要再master daedb用户下执行
nohup vacuumdb -F -a >/home/gpadmin/vacuumdb.log &

该命令执行时间可能很长,并且会消耗一定资源,如果过于影响客户使用,请选择执行时间,保证执行时间有5+ 小时

数据库锁库处理

还有一种情况,就是数据库已经到达只读阈值, 数据库只读了,因为vacuumdb的命令也需要创建事务,所以直接运行命令会报错,无法进行回收

就需要先修改上面的参数阈值,使其能正常运行事务

1.停止数据库

gpstop -M fast -aps  -ef|grep postgres   关闭确保进程都不在了,再继续 

2.找到所有数据目录

在master的daedb用户下执行:

gpstate -s|grep -E 'Address|Datadir'

该命令会将集群所有的数据目录及对应的主机名打印出来

另外有两台master,一般是在/gpmaster/gpseg-1 里,可以使用gpstate -f 查看

3.修改所有节点数据目录里配置文件参数

修改配置,找到所有节点的postgresql.conf,为其增加或修改参数

xid_stop_limit=800000000    #改为8亿,或者更小

全部修改完成之后,启动数据库:gpstart -a
启动完成以后,此时数据库就可以正常使用了

4.回收数据库年龄

此时需要再master 数据库用户下执行

nohup vacuumdb -F -a >/home/gpadmin/vacuumdb.log &

5.还原参数

改完还有个事,要将上面加的参数,全部注释掉 。有个简便方法,find 出来后替换

find /* -name 'postgresql.conf'|xargs sed -i  's/xid_stop_limit=500000000/#xid_stop_limit=500000000/g'

重启数据库生效:

gpstop -M fast -agpstart  -a
http://www.lryc.cn/news/241956.html

相关文章:

  • [HCIE] IPSec-VPN (IKE自动模式)
  • Qt/QML编程学习之心得:一个Qt工程的学习笔记(九)
  • c++ 课程笔记
  • ELK企业级日志分析平台——ES集群监控
  • Twincat使用:EtherCAT通信扫描硬件设备链接PLC变量
  • 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等
  • 网络互联与IP地址
  • Android设计模式--模板方法模式
  • 大语言模型——BERT和GPT的那些事儿
  • Docker 命令详解
  • ios打包,证书获取
  • linux(nginx安装配置,tomcat服务命令操作)
  • jQuery_03 dom对象和jQuery对象的互相转换
  • Mysql 中如何导入数据?
  • 深入了解前馈网络、CNN、RNN 和 Hugging Face 的 Transformer 技术!
  • Flink Table API 读写MySQL
  • Nginx 开源版安装
  • 『亚马逊云科技产品测评』活动征文|低成本搭建物联网服务器thingsboard
  • 【Pytorch】Visualization of Feature Maps(3)
  • 人工智能对我们的生活影响
  • Mysql存储引擎分类
  • 基于Python+TensorFlow+Django的交通标志识别系统
  • 【Java 进阶篇】Jedis:让Java与Redis轻松对话的利器
  • 【数据分享】我国12.5米分辨率的DEM地形数据(免费获取/地理坐标系)
  • C++设计模式之策略模式
  • spring-webflux的一些概念的理解
  • OpenCV快速入门:特征点检测与匹配
  • 旋转的数组
  • Hive VS Spark
  • SAST静态分析工具所支持的规则