首页 > 其他分享 >KingbaseES V8R6 最老事务阻止vacuum freeze

KingbaseES V8R6 最老事务阻止vacuum freeze

时间:2023-05-09 19:47:45浏览次数:35  
标签:事务 最老 V8R6 t2 freeze vacuum test select

前言

最近生产环境发生几次由于长事务导致表、库年龄没法回收的情况。我们要规避这种情况的发生,不要等发生了再去强制中断会话连接。

当数据库中存在最老事务版本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进行。

标签:事务,最老,V8R6,t2,freeze,vacuum,test,select
From: https://www.cnblogs.com/kingbase/p/17370143.html

相关文章

  • KingbaseES V8R6 sys_squeeze 使用
    sys_squeeze介绍sys_squeeze是KingbaseES的一个扩展插件,该组件将提供人工调用命令实现对表deadtuple的清理工作。该组件在清理表空间的过程中,不会全程加排他锁,能保证业务运行期间尽可能不影响对目标表的访问。而vacuumfull也可实现死亡元组占用空间释放,但是缺点是会锁表,阻止业......
  • KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障
    ​KingbaseESV8R6备份恢复案例之---system-Id不匹配备份故障案例说明:在KingbaseESV8R6执行备份时,在sys_log日志中出现system-id不一致的故障并伴随有归档失败,故障如下图所示:适用版本:KingbaseESV8R6一、问题分析1、查看当前数据库system-id可以通过sys_controldata-D......
  • KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
    案例说明:相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点。适用版本:KingbaseESV8R6、MySQL8.0一、MySQL的排序规则1、排序规则(collation)排序规则是依赖于字符集,字符集是用来定义MySQL存储不......
  • KingbaseES V8R6 等待事件之LWLock Buffer_IO
    等待事件含义当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共享缓冲区外部检索页。此锁用于处理多个会......
  • pip freeze >requirements.txt
    python项目中必须包含一个requirements.txt文件,用于记录所有依赖包及其精确的版本号。以便重新环境部署。使用pip生成:pipfreeze>requirements.txt会生成一个requirem......
  • KingbaseES V8R6 运维案例 --flashback drop table
    一、KingbaseESV8R6flashbackdroptable介绍使用FLASHBACK删除和恢复表删除表时,数据库不会立即删除与该表关联的空间。数据库重命名表,并将其和任何关联的对象放在回......
  • KingbaseES V8R6 集群运维系列 -- 命令行部署repmgr管理集群+switchover测试
    本次部署未使用securecmd/kbha工具,无需普通用户到root用户的互信。一、环境准备1、创建OS用户建立系统数据库安装用户组及用户,在所有的节点执行。root用户登陆服务器,创......
  • KingbaseES V8R6集群运维系列 --sys_monitor.sh stop关闭集群分析
    案例说明:对于KingbaseESV8R6集群关闭整个集群通过执行‘sys_monitor.shstop’命令完成,本案例解析了在执行‘sys_monitor.shstop’后,数据库的关闭方式及数据库访问带来......
  • KingbaseES V8R6 运维系列 --单机小版本升级
    ​案例说明:在KingbaseESV8R6版本提供了sys_upgrade的升级工具,本案例描述了KingbaseESV8R6单机环境下数据库的小版本升级操作,案例涉及的版本从‘(Kingbase)V008R006C0......
  • KingbaseES V8R6 逻辑恢复到新的 schema
    前言本文介绍一下KingbaseESV8R6版本中逻辑恢复时,将原有的对象恢复到新的schema。sys_restore命令中如果只加入了-g(原schema)-G(新schema)参数那么导入数据后,表的schema......