1、查看資料庫當前實例使用的是哪個UNDO表空間: 2、查看UNDO表空間對應的數據文件和大小 3、查看undo表空間屬性: 解釋: undo段中區的狀態: free: 區未分配給任何一個段 active: 已經被分配給段,並且這個段被事務所使用,且事務沒有提交,不能覆蓋。 (區被未提交的事務使用) ...
1、查看資料庫當前實例使用的是哪個UNDO表空間:
show parameter undo_tablespace
2、查看UNDO表空間對應的數據文件和大小
set lines 200 pages 200 col file_name for a60 col tablespace_name for a20; select tablespace_name,file_name,bytes/1024/1024 MB from dba_data_files where tablespace_name like '%UNDOTBS%';
3、查看undo表空間屬性:
show parameter undo
select retention,tablespace_name from dba_tablespaces where tablespace_name like '%UNDOTBS%';
解釋:
undo段中區的狀態: free: 區未分配給任何一個段 active: 已經被分配給段,並且這個段被事務所使用,且事務沒有提交,不能覆蓋。 (區被未提交的事務使用) unexpired:事務已經提交,但是區還在段中,還沒有被覆蓋且未達到undo_retention設定的時間。 (nogurantee的情況下,原則上oracle儘量的不覆蓋unexpired的區,但是如果undo空間壓力及較大,oracle也會去覆蓋。如果是guarantee,oracle強制保留retention時間內的內容,這時候free和expired空間不足的話,新事物將失敗。) expired:oracle希望已經提交的事務對應的undo表空間中的undo段中的區再保留一段時間。保留的時間就是undo_retention。 unexpired的區存在時間超過undo_retention設定的時間,狀態就會變為expired。過期後的區就可以被覆蓋了。原則上expired的區一般不會釋放成free PS:生產中沒有人會將UNDOTBS的retention設置成GUARANTEE這是很危險的。
4、查看undo表空間當前的使用情況:
set lines 200 pages 200 col tablespace_name for a30 select tablespace_name,status,sum(bytes)/1024/1024 MB from dba_undo_extents group by tablespace_name,status;
與一般的用戶表空間不同,undo表空間不能通過dba_free_spaces來確定實際的使用情況,undo表空間除了active狀態的extent不能被覆蓋外。其他狀態的extent都是可以空間復用的。
如果active的extent總大小很大,說明系統中存在大事務。如果undo資源耗盡(ACTIVE接近undotbs的總大小),可能導致事務失敗。
5、查看什麼事務占用了過多的undo:
select addr,used_ublk,used_urec,inst_id from gv$transaction order by 2 desc;
ADDR: 事務的記憶體你地址。
USED_UBLK:事務使用的undo block數量。
USED_UREC:事務使用的undo record (undo前鏡像的條數,例如:delete刪除的記錄數)
6、查看占用undo的事務執行了什麼sql:
set lines 200 pages 200 col program for a30 col machine for a30 select sql_id,last_call_et,program,machine from gv$session where taddr='0000000089A9E2F0';
LAST_CALL_ET: 上一次調用到現在為止過了多長時間,單位為秒,途中顯示過了304s (既可以理解為sql已經運行了304s)。
set long 99999 set lines 100 set pages 1000 select sql_fulltext from v$sql where SQL_ID='8gvp49tr474f2';
7、找到了sql,下麵就可以聯繫應用做處理了:
哪台機器,通過什麼程式,發起了什麼sql,占用了多少undo,是否可以殺掉,sql是否可以改寫,是否可以分批提交。。。等
關於UNDO的其他知識:
1、undo的讀取方式是單塊讀的,所以事務的回滾比較慢
2、顯示undo使用情況的統計信息:
SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME, TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME, UNDOBLKS FROM V$UNDOSTAT;
3、system表空間中有一個系統回滾段,只有在對數據字典進行操作時(eg:修改表結構)才用到系統回滾段,另外一種情況,如果undo表空間出現問題,oracle也可能使用system段。
一個事務開始的時候,在shared pool中分一個IMU(in memory undo) buffer,將所有的回滾信息寫到IMU buffer中 一個事務開始後,需要回滾塊的時候不需要從從磁碟讀undo block,直接從shared pool 中分IMU BUFFER,之後回滾信息寫到imubuffer中, 回滾信息寫入的時候也要產生redo,但是imubuffer減少了物理io 針對IMUbuffer 在shared中會生成專門供其使用的redo日誌區,叫做private redo
4、undo segment的信息:
SELECT a.name, b.xacts, b.writes, b.extents FROM v$rollname a, v$rollstat b WHERE a.usn=b.usn;USN Rollback segment number XACTS Number of active transactions EXTENTS Number of extents in the rollback segment WRITES Number of bytes written to the rollback segment