死事务判断smon回滚速度

来源:这里教程网 时间:2026-03-03 21:44:16 作者:

昨天碰到一个问题,在启用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 这是非常有用的一个内部表,大家可以参考一下。

相关推荐