这个问题的研究是一步一步来的。 最开始,客户想知道对于一个已经kill掉的数据库会话,如何评估SMON需要多久才能回滚成功这个会话之前做过的事务,其实也就是这个会话多久才会被完全kill掉。 由于被kill掉的会话所打开的事务已经无法在vtransation视图中查询到,因此需要从数据库基表xktuxe中查询。 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以后才有的字段),也就是无从判断这个事务到底在做什么。…