this scripts is used to monitor transaction rolling back progress
——————————————————————————-
—
— Script: rolling_back.sql
— Purpose: to predict when transactions will finish rolling back
— For: 9.0+
—
— Copyright: (c) Ixora Pty Ltd
— Author: Steve Adams
—
——————————————————————————-
spool save_sqlplus_settings
set serveroutput on
set feedback off
prompt
prompt Looking for transactions that are rolling back …
prompt
declare
cursor tx is
select
s.username,
t.xidusn,
t.xidslot,
t.xidsqn,
x.ktuxesiz
from
sys.x$ktuxe x,
sys.v$transaction t,
sys.v$session s
where
x.inst_id = userenv(‘Instance’) and
x.ktuxesta = ‘ACTIVE’ and
x.ktuxesiz > 1 and
t.xidusn = x.ktuxeusn and
t.xidslot = x.ktuxeslt and
t.xidsqn = x.ktuxesqn and
s.saddr = t.ses_addr;
user_name varchar2(30);
xid_usn number;
xid_slot number;
xid_sqn number;
used_ublk1 number;
used_ublk2 number;
begin
open tx;
loop
fetch tx into user_name, xid_usn, xid_slot, xid_sqn, used_ublk1;
exit when tx%notfound;
if tx%rowcount = 1
then
sys.dbms_lock.sleep(10);
end if;
select
sum(ktuxesiz)
into
used_ublk2
from
sys.x$ktuxe
where
inst_id = userenv(‘Instance’) and
ktuxeusn = xid_usn and
ktuxeslt = xid_slot and
ktuxesqn = xid_sqn and
ktuxesta = ‘ACTIVE’;
if used_ublk2 < used_ublk1
then
sys.dbms_output.put_line(
user_name ||
'''s transaction ' ||
xid_usn || '.' ||
xid_slot || '.' ||
xid_sqn ||
' will finish rolling back at approximately ' ||
to_char(
sysdate + used_ublk2 / (used_ublk1 - used_ublk2) / 6 / 60 / 24,
'HH24:MI:SS DD-MON-YYYY'
)
);
end if;
end loop;
if user_name is null
then
sys.dbms_output.put_line('No transactions appear to be rolling back.');
end if;
end;
/
prompt
exit;
eg:
SQL*Plus: Release 11.2.0.3.0 Production on Sat Jul 7 14:54:02 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @rollback
Looking for transactions that are rolling back …
SYS’s transaction 10.3.25785 will finish rolling back at approximately 14:55:52
07-JUL-2012
SQL> begin
2 for i in 1..1000000 loop
3 insert into t1 values (i);
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> rollback
2 ;
Rollback complete.
SQL> !date
Sat Jul 7 14:55:59 CST 2012
非常准确的时间估算 cool scripts 🙂