专栏/滴水藏海/ 文章详情 /

查找大事务对应的sql操作方法

yuao 2021/11/25 2139 7 0
摘要 本文介绍当回滚段大小异常增大时,为查找大事务对应sql操作提供一种思路

有时候在一些实际项目中会遇到回滚文件异常增大的情况,一般来说都是由于大事务造成的,而如何找出这个大事务对应的操作则是比较关键的问题。达梦其实提供了关于回滚段相关的动态性能视图,V$PSEG_COMMIT_TRX会记录已经提交但还没有purge的事务信息,而V$PSEG_ITEMS 则会记录回滚系统中相应回滚项的信息,也就是正在执行的事务对应的回滚信息。
以下sql帮助我们在大事务提交后分析确定出对应的sql操作,仅限从事务提交后,回滚purge之前,因为一旦超过undo_retention后v$pseg_commit_trx中对应登记的事务信息就被清除了:

select
        i.n_used_pages*page/1024/1024 used_roll_space_MB,
        h.top_sql_text                          ,
        p.item_nth,
        p.trx_id,
        p.cmt_time,
        h.affected_rows
from
        v$pseg_commit_trx p,
        v$sql_history h    ,
        (select top 1 * from v$pseg_items order by n_used_pages desc) i
where
        p.trx_id=h.trx_id
    and i.nth   =p.item_nth
    and i.n_used_pages>0
    and affected_rows >0
    order by used_roll_space_MB desc;

复制

在做增删改查操作过程中,v$pseg_items使用到的页数是动态在增加的,但是对应的nth_item必须在此事务提交后才能在v$pseg_commit_trx中捕获到,而需要找到对应这个耗费回滚段空间的sql必须先获取到对应的trx_id,才能在v$sql_history或log_commit日志中找到对应sql,故在大事务执行过程中无法抓到对应sql操作,只要当大事务提交后才能抓到对应sql以及它使用过的roll空间大小;
需要注意的是,v$pseg_items记录的是回滚项对应正在使用的pages,而繁忙的生产系统其中一个回滚项(默认一个实例有17个回滚项)可能会有多个I/D/U操作都已提交但还没有被purge(例如还没有到undo_retention时间),所以这个联合查询查出来对应是一个回滚项中多个还没有来得及被purge的事务所占用的回滚空间总大小,具体是哪个sql还需具体分析,但这时已经把范围缩到很小了比较容易确定是哪个sql操作引发的。值得注意的是,我们不能完全按照影响行数来判断,因为call的影响行数记录值永远是1,无法得知真实影响行数;
下面举个栗子说明一下:
1.首先查看17个回滚项对应的信息,主要关注u_used_pages字段

select * from v$pseg_items;

复制

1.png
2.然后查看以下测试表T3占用空间情况:
2.png

3.执行delete操作,删除10,230,000条记录
3.png
4.再查看v$pseg_items发现nth_item=10对应使用了12522个page
我们可以换算一下,12522*32k/1024/1024=391MB,比T3表实际占用空间要稍微小一些,考虑到其他的一些空间消耗,作为查找占用回滚段空间的操作是没有问题的。
4.png

5.commit提交后,使用上述sql进行查询对应的事务操作:
5.png
上述方法虽然只能在事务提交后,且回滚purge前查到,但大事务造成的回滚文件大小增加都会相当迅猛,所以我们可以配合监控回滚文件大小来使用,则可以更加精准找到对应大事务操作。

注意:
当出现大事务时,log_commit日志中一定会出现大量分配回滚段的信息:
6.bmp
而当大事务执行完并commit后,经过UNDO_RETENTION时间后,日志一定会出现大量purge操作,与此同时我们可以发现,做purge这个操作对应的trx_id记录的就是当初大事务的trx_id:
7.bmp

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服