KingbaseES V8R6 最老事务阻止vacuum freeze
前言
最近生产环境发生几次由于长事务导致表、库年龄没法回收的情况。我们要规避这种情况的发生,不要等发生了再去强制中断会话连接。
当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为frozen,如果在最老事务之后产生的快照版本,不被标记为frozen。
这个最老事务通常被认为是数据库中的长事务,长事务不结束,其后产生的版本都不能被vacuum。那么如果这段时间数据库产生大量事务,就会消耗表,数据库的age。age达到21亿就会强行进入单用户模式vacuum freeze整个数据库才能保证数据库正常运行。
最老事务不仅阻止age的frozen,还阻止表的死亡行回收,所以尽量要避免数据库中产生长事务。
查看长事务的sql:
1、查询长事务语句比较灵活,我们可以加入order by ,limit限定结果集,有很多时候可以加入查询条件 query like‘’ 查到可能阻止vacuum的表涉及的sql语句,但有的时候,其他表的长事务也会阻止不相关的表进行vacuum freeze:
select * from sys_stat_activity where state<>'idle' and sys_backend_pid() != pid and (backend_xid is not null or backend_xmin is not null ) and extract(epoch from (now() - xact_start)) > 3; <时间阈值,单位秒> ;
select * from sys_stat_activity where state<>'idle' and sys_backend_pid() != pid and (backend_xid is not null or backend_xmin is not null ) and query like '%tablename%' ;
或 select datname,usename,query,xact_start,now()-xact_start xact_duration,query_start,now()-query_start query_duration,state from sys_stat_activity where state<>$$idle$$ and (backend_xid is not null or backend_xmin is not null) and now()-xact_start > interval $$30 min$$ order by xact_start;
2、prepare预备语句视图也需要查看:
select * from sys_prepared_statements where now()-prepare_time > interval $$30 min$$ order by prepare_time;
测试
1、需要准备一个产生事务的压测脚本
vi test.sql
select txid_current();
2、新建一个事务,不结束事务
test=# create table t1(id int);
CREATE TABLE
test=# begin;
BEGIN
test=# insert into t1 values (1);
INSERT 0 1
test=# select txid_current();
txid_current
--------------
1668525
(1 row)
3、新建t2表,写入一条记录,注意这条记录的版本是在最老事务之后产生的。
test=# create table t2 (id int);
CREATE TABLE
test=# insert into t2 values (100);
INSERT 0 1
4、执行压测脚本,目的是消耗大量事务号
kbbench -U SYSTEM -d test -M prepared -n -r -P 1 -f ./test.sql -c 16 -j 16 -T 10
5、然后,再新建另一个事务,不结束事务
test=# begin;
BEGIN
test=# insert into t1 values (2);
INSERT 0 1
test=# select txid_current();
txid_current
--------------
1788896
(1 row)
6、下面继续消耗大量事务
kbbench -U SYSTEM -d test -M prepared -n -r -P 1 -f ./test.sql -c 16 -j 16 -T 10
7、freeze t2这个表,我们看到年龄始终降不下来。因为前面说过:表的tuple如果是在最老事务之前产生的,它可以被标记为frozen,而在最老事务之后产生的tuple,必须保留版本,不能被标记为frozen。
test=# vacuum (freeze,verbose) t2;
INFO: aggressively vacuuming "public.t2"
INFO: "t2": found 0 removable, 1 nonremovable row versions in 1 out of 1 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 1668525
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM
查看表年龄没有下降
test=# select age(relfrozenxid),relname,pg_size_pretty(pg_total_relation_size(oid)) from sys_class where relname='t2';
age | relname | pg_size_pretty
----------+---------+----------------
244389 | t2 | 40 kB
(1 row)
8、释放第一个事务,再次freeze t2。注意这个时候最老的事务是在t2的所有记录版本之后产生的。所以理论上执行vacuum freeze后,这个表的年龄应该可以降到0.
test=# vacuum (freeze,verbose) t2;
INFO: aggressively vacuuming "public.t2"
INFO: "t2": found 0 removable, 1 nonremovable row versions in 1 out of 1 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 1788896
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM
表年龄有下降,但是没有降到0
test=# select age(relfrozenxid),relname,pg_size_pretty(pg_total_relation_size(oid)) from sys_class where relname='t2';
age | relname | pg_size_pretty
---------+---------+----------------
124048 | t2 | 40 kB
(1 row)
第二次vacuum t2,oldest xmin: 1788896,因为第一个事务版本1668525被释放了。
释放第二个事务,再次freeze t2,这时候查看t2年龄已经降到0
TEST=# select age(relfrozenxid),relname,pg_size_pretty(pg_total_relation_size(oid)) from sys_class where relname='t2';
age | relname | pg_size_pretty
-----+---------+----------------
0 | t2 | 40 kB
(1 row)
总结
在实际生产环境中,无论主库备库,应尽量避免长事务,作为DBA我们要充分和客户沟通,长事务可能对数据库系统带来的隐患。由于KingbaseES数据库中过去的MVCC版本和表放在一起,而不像oracle,mysql数据库那样利用undo表空间单独存储回滚段,所以面对vacuum问题,我们需要注意把vacuum dead tuple,以及vacuum freeze可能遇到的问题。参考文档《KingbaseESV8R6 垃圾回收原理以及如何预防膨胀》
本案例中,在结束第一个事务后,t2表的事务之后产生的是t1表有关的事务,也就是说t1表的事务不释放也会阻止t2表的vacuum freeze进行。
KingbaseES V8R6 最老事务阻止vacuum freeze的更多相关文章
- Postgresql vacuum freeze相关参数
先看3个参数:autovacuum_freeze_max_age | 500000vacuum_freeze_min_age | 10vacuum_fr ...
- KingbaseES V8R6集群维护案例之---停用集群node_export进程
案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...
- KingbaseES V8R6集群维护案例之---将securecmdd通讯改为ssh案例
案例说明: 在KingbaseES V8R6的后期版本中,为了解决有的主机之间不允许root用户ssh登录的问题,使用了securecmdd作为集群部署分发和通讯的服务,有生产环境通过漏洞扫描,在88 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- KingbaseES V8R6兼容Oracle的exp-imp导出导入工具使用
说明: KingbaseES V8R6版本中的兼容Oracle的exp-imp导入导出工具,支持完全模式.用户模式和表模式的导出功能. 本次案例数据库版本: test=# select version ...
- KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障
案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...
- KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份
案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...
- kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份
案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...
- KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份
案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...
随机推荐
- Spring源码之容器的功能拓展-ApplicationContext
目录 一.解析预备 刷新上下文环境 例如对系统属性或者环境变量进行校验和准备 二.初始化 BeanFactory 并进行 Xml 配置文件的读取 三.对BeanFactory 各种功能填充 四.激活以 ...
- Rock Pi开发笔记(三):Rock Pi 4B plus(基于瑞星微RK3399)板子硬件资源介绍
前言 上一篇,概览了整个的rock pi大致系列,我们开始定位为RK3399做评估,入手RK3399,对基本的外设进行解说. 板载外设 USB3.0 × 2 USB2.0 × 2 千 ...
- xml开发笔记(一):tinyXml2库介绍、编译和工程模板
前言 Qt开发Xml相关技术,使用到tinyxml2库. TinyXML TinyXML是一个简单的.小的C++的XML解析器,可以集成到其他程序中.它是ROS的标准XML解析器. 最新 ...
- 【Java复健指南02】方法的注意事项
[方法] 方法基本内容 √访问修饰符 (作用是控制方法使用的范围) 可选,[有四种:public\protected\默认\private],具体在后面说 √返回类型 1.一个方法最多有一 ...
- 名校 AI 课程|斯坦福 CS25:Transformers United 专题讲座
自 2017 年提出后,Transformer 名声大噪,不仅颠覆了自然语言处理(NLP)领域,而且在计算机视觉(CV).强化学习(RL).生成对抗网络(GANs).语音甚至是生物学等领域也大显锋芒, ...
- 第131篇:如何上传一个npm包
好家伙, NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准. NPM是世界上最大的软件注册表. 1.首先我们 ...
- SpringCloud组件:Feign之日志输出
目录 Feign之日志输出 Feign日志输出说明 前期准备 构建项目 tairan-spring-cloud-feign-logger配置 源码位置 Feign之日志输出 在我们日常开发过程中,经常 ...
- 【Azure 服务总线】如何批量删除Azure Service Bus中的Topics(数量较多,需要过滤后批量删除)
问题描述 Azure Service Bus 的门户操作页面上,是否可以批量删除其中的Topics呢? 问题解答 Azure Service Bus门户或Service Bus Explorer工具没 ...
- C++11新特性的一些用法举例②
/** C++11 * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝构造函数 拷贝赋值重载 取地址重载 const 取地址重载 最后重要的是前4个,后两个用处不大.默认 ...
- C++ //STL---常用算法 //常用遍历 for_each //transform
1 //STL---常用算法 2 //常用遍历 for_each 3 //transform 4 #include<iostream> 5 #include<string> 6 ...