死事务判断smon回滚速度

昨天碰到一个问题,在启用SMON的串行恢复后,对于一个死事务,如何观察其恢复进度。


由于死事务已经无法通过v$transaction来观察,所以必须通过内部表来进行判断。

这个内部表是x$ktuxe,该表会记录Dead事务的恢复进度:


17:30:37 SQL> select distinct KTUXECFL,count(*) from x$ktuxe group by KTUXECFL;


KTUXECFL                  COUNT(*)

------------------------ ----------

DEAD                              1

NONE                          2393

SCO|COL                          8



KTUXESIZ用来记录事务使用的回滚段块数,可以通过观察这个字段来评估恢复进度:

    16:59:47 SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ

                2 from x$ktuxe where  KTUXECFL ='DEAD';

 

    ADDR              KTUXEUSN  KTUXESLT  KTUXESQN  KTUXESIZ

    ---------------- ---------- ---------- ---------- ----------

    FFFFFFFF7D07B91C        10        39    2567412    1086075



    17:02:12 SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ

                2 from x$ktuxe where  KTUXECFL ='DEAD';

 

    ADDR              KTUXEUSN  KTUXESLT  KTUXESQN  KTUXESIZ

    ---------------- ---------- ---------- ---------- ----------

    FFFFFFFF7D07B91C        10        39    2567412    1086067




可以通过观察KTUXESIZ字段来评估恢复进度:

16:59:47 SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ 

            2 from x$ktuxe where  KTUXEUSN=10 and KTUXESLT=39;


ADDR              KTUXEUSN  KTUXESLT  KTUXESQN  KTUXESIZ

---------------- ---------- ---------- ---------- ----------

FFFFFFFF7D07B91C        10        39    2567412    1086075

17:02:12 SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ 

            2 from x$ktuxe where  KTUXEUSN=10 and KTUXESLT=39;


ADDR              KTUXEUSN  KTUXESLT  KTUXESQN  KTUXESIZ

---------------- ---------- ---------- ---------- ----------

FFFFFFFF7D07B91C        10        39    2567412    1086067


根据评估,这个事务回滚需要大约2.55天,我Ft:

17:08:28 SQL> declare

17:10:22  2  l_start number;

17:10:22  3  l_end    number;

17:10:22  4  begin

17:10:22  5    select ktuxesiz into l_start from x$ktuxe where  KTUXEUSN=10 and KTUXESLT=39;

17:10:22  6    dbms_lock.sleep(60);

17:10:22  7    select ktuxesiz into l_end from x$ktuxe where  KTUXEUSN=10 and KTUXESLT=39;

17:10:22  8    dbms_output.put_line('time est Day:'|| round(l_end/(l_start -l_end)/60/24,2));

17:10:22  9  end;

17:10:22  10  /

time est Day:2.55


这是非常有用的一个内部表,大家可以参考一下。


请使用浏览器的分享功能分享到微信等