查看當前回滾段表空間裏是否有活動的事物:
SQL> SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk FROM v$session s,v$transaction t WHERE s.saddr=t.ses_addr;
USERNAME XIDUSN UBAFIL UBABLK USED_UBLK
------------------------------ ---------- ---------- ---------- ----------
SYS 5 2 228 1
v$transaction記錄未commit的活動事務
列出這幾列的含義,自己可以對比一下:
XIDUSN Undo segment number -->使用的回滾段id,可以和v$rollstat對應
UBAFIL Undo block address (UBA) filenum
UBABLK UBA block number
used_ublk --> 佔用的undo block
dump出內容
SQL> alter system dump datafile 2 block 228;
udump下面看最新的那個文件,文件名包含你當前session的spid
查詢當前session的process進程
select spid from v$session s,v$process p where s.paddr=p.addr and s.username='SYS';
SQL> SELECT b.name,a.xidusn, xidslot, xidsqn FROM v$transaction a, v$rollname b where a.XIDUSN = b.usn;
NAME XIDUSN XIDSLOT XIDSQN
------------------------------ ---------- ---------- ----------
_SYSSMU5$ 5 30 331
eg:
session1:
SQL> create table test as select * from dba_objects;
表已創建。
SQL> delete from test;
已刪除49802行。
SQL> rollback;
回退已完成。
session2:
SQL> SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk FROM v$session s,v$transaction t WHERE s.saddr=t.ses_addr;
USERNAME XIDUSN UBAFIL UBABLK USED_UBLK
------------------------------ ---------- ---------- ---------- ----------
SYS 19 9 1068 283
SQL> SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk FROM v$session s,v$transaction t WHERE s.saddr=t.ses_addr;
未選定行
SQL> alter system dump datafile 9 block 1068;
系統已更改。
求回滾段正在處理的事務
select a.name,b.xacts,c.sid,c.serial#,d.sql_text
from v$rollname a,v$rollstat b,v$session c,v$sqltext d,v$transaction e
where a.usn=b.usn and b.usn=e.xidusn and c.taddr=e.addr
and c.sql_address=d.address and c.sql_hash_value=d.hash_value order by a.name,c.sid,d.piece;