如何知道active transaction正在操作的对象

豆豆网   技术应用频道   2008年06月03日  【字号: 收藏本文

内容摘要:最开始,客户想知道对于一个已经kill掉的数据库会话,如何评估SMON需要多久才能回滚成功这个会话之前做过的事务,其实也就是这个会话多久才会被完全kill掉。由于被kill掉的会话所打开的事务已经无法在v$transation视图中查询到,因此需要从数据库基表x$ktuxe中查询。

  这个问题的研究是一步一步来的。

  最开始,客户想知道对于一个已经kill掉的数据库会话,如何评估SMON需要多久才能回滚成功这个会话之前做过的事务,其实也就是这个会话多久才会被完全kill掉。由于被kill掉的会话所打开的事务已经无法在v$transation视图中查询到,因此需要从数据库基表x$ktuxe中查询。  

SELECT ktuxesiz FROM x$ktuxe WHERE ktuxesta != 'INACTIVE';

  可以获得这个会话还在使用的undo block数量,然后过10秒钟,再查询一次,之后两次得到的数值相减,就是10秒内SMON回滚成功的undo block数量,这样再跟当前的ktuxesiz 值比较一下,就可以估算出大概还需要多长时间才能完成整个工作。

  Metalink Note:43653.1详细描述了x$ktuxe的各列含义,Eygle的一篇文章也描述了这个方法。

  然后,我在自己的机器上实验对这个基表的查询,忽然发现自己的机器上也有一个仍然active的transaction。但是我自己机器上的数据库我并没有做什么DML操作,为什么会有一个active transaction呢?这个transaction还使用了2个undo block。

SQL> SELECT ktuxesiz FROM x$ktuxe WHERE ktuxesta != 'INACTIVE';
 
 KTUXESIZ
----------
     2

  继续检查自己机器上的情况,确实是有一个active的事务。

SQL> select addr,xidusn,xidslot,xidsqn,status from v$transaction ;
 
ADDR     XIDUSN  XIDSLOT   XIDSQN STATUS
-------- ---------- ---------- ---------- ----------------
45270E48     4     14    371 ACTIVE

  查一下这个事务当前在执行什么SQL,SQL_ID是null(SQL_ID是Oracle10g以后才有的字段),也就是无从判断这个事务到底在做什么。

来源:IT专家网    作者:kamus    责编:豆豆技术应用

正在加载评论...