Greenplum的数据库年龄检查处理

news/2024/7/9 21:05:01 标签: 数据库, postgresql, 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					                    | 270797923
             0 | test02					                    | 270797923
             0 | 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 -a

ps  -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 -a

gpstart  -a

http://www.niftyadmin.cn/n/5208088.html

相关文章

【实验】配置用户自动获取IPv6地址的案例

【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等​编辑https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

(四)C语言之符号常量概述

(四)C语言之符号常量概述 一、符号常量概述 一、符号常量概述 在程序中使用像300,20等这样的等类似的“幻数”不是一个好的习惯,它们无法向阅读该程序的人提供更多有用的信息,从而使得修改程序变得困难。处理这种幻数的一种方法是…

『RabbitMQ』入门指南(安装,配置,应用)

前言 RabbitMQ 是在 AMQP(Advanced Message Queuing Protocol) 协议标准基础上完整的,可复用的企业消息系统。它遵循 Mozilla Public License 开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,建立在 Erlang …

JSP过滤器和监听器

什么是过滤器 Servlet过滤器与Servlet十分相似,但它具有拦截客户端(浏览器)请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要。 对于程序开发人员而言,过滤器实质就是在Web应用服务器…

什么是网关和链路追踪,以及怎么使用?

在云计算中,网关和链路追踪也是非常重要的。云服务提供商通常会提供网关和链路追踪等相关服务来帮助用户管理和优化云计算网络。 云计算中的网关通常包括以下几种: 虚拟网络网关:用于将云中不同虚拟网络之间相互连接,实现云内不同…

【Java】实现阻塞队列-生产者/消费者模型

上文中我们讲了Java库中自带的阻塞队列,并且讲了如何用阻塞队列来实现生产者消费者模型 【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型 下面我们来讲如何用代码实现一个阻塞队列 1、实现一个阻塞队列 阻塞队列 普通队列 线程安全 阻…

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入,主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据,使用Insert语句插入性能较低,此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …

Flink之状态TTL机制内容详解

1 状态TTL机制 状态的 TTL机制就是Flink提供的自动化删除状态中的过期数据,配置 TTL的 API可以做到对状态中的数据进行冷热数据分离,将热数据一直保存在状态存储器中,将冷数据进行定期删除. 1.1 API简介 TTL常用API如下: API注解setTtl(Time.seconds(…))配置过期时长,当状态…