UNDO空间满的处理方法(含UNDO的学习与相关解释)
1、查看數據庫當前實例使用的是哪個UNDO表空間:
showparameterundo_tablespace
2、查看UNDO表空間對應的數據文件和大小
setlines200pages200colfile_namefora60 coltablespace_namefora20;selecttablespace_name,file_name,bytes/1024/1024MBfromdba_data_fileswheretablespace_namelike'%UNDOTBS%';
3、查看undo表空間屬性:
showparameterundo
selectretention,tablespace_namefromdba_tablespaceswheretablespace_namelike'%UNDOTBS%';
解釋:
undo段中區的狀態:
free: 區未分配給任何一個段
active: 已經被分配給段,并且這個段被事務所使用,且事務沒有提交,不能覆蓋。(區被未提交的事務使用)
unexpired:事務已經提交,但是區還在段中,還沒有被覆蓋且未達到undo_retention設定的時間。
?。╪ogurantee的情況下,原則上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表空間當前的使用情況:
setlines200pages200 coltablespace_namefora30selecttablespace_name, status,sum(bytes)/1024/1024MBfromdba_undo_extentsgroupbytablespace_name,status;
與一般的用戶表空間不同,undo表空間不能通過dba_free_spaces來確定實際的使用情況,undo表空間除了active狀態的extent不能被覆蓋外。其他狀態的extent都是可以空間復用的。
如果active的extent總大小很大,說明系統中存在大事務。如果undo資源耗盡(ACTIVE接近undotbs的總大?。?,可能導致事務失敗。
5、查看什么事務占用了過多的undo:
selectaddr,used_ublk,used_urec,inst_id fromgv$transactionorderby2desc;
ADDR: 事務的內存你地址。
USED_UBLK:事務使用的undo block數量。
USED_UREC:事務使用的undo record (undo前鏡像的條數,例如:delete刪除的記錄數)
6、查看占用undo的事務執行了什么sql:
setlines200pages200colprogramfora30 colmachinefora30selectsql_id,last_call_et,program,machinefromgv$session wheretaddr='0000000089A9E2F0';
LAST_CALL_ET: 上一次調用到現在為止過了多長時間,單位為秒,途中顯示過了304s (既可以理解為sql已經運行了304s)。
setlong99999setlines100setpages1000 select sql_fulltextfromv$sqlwhereSQL_ID='8gvp49tr474f2';
7、找到了sql,下面就可以聯系應用做處理了:
哪臺機器,通過什么程序,發起了什么sql,占用了多少undo,是否可以殺掉,sql是否可以改寫,是否可以分批提交。。。等
關于UNDO的其他知識:
1、undo的讀取方式是單塊讀的,所以事務的回滾比較慢
2、顯示undo使用情況的統計信息:
SELECTTO_CHAR(BEGIN_TIME,'HH24:MI:SS')BEGIN_TIME, TO_CHAR(END_TIME,'HH24:MI:SS')END_TIME, UNDOBLKSFROMV$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$rollnamea,v$rollstatb WHEREa.usn=b.usn;
USNRollbacksegmentnumber
XACTSNumberofactivetransactions
EXTENTSNumberofextentsintherollbacksegment
WRITESNumberofbyteswrittentotherollbacksegment
作者:Nathon-wang
原文鏈接:https://www.cnblogs.com/nathon-wang/p/10293919.html
總結
以上是生活随笔為你收集整理的UNDO空间满的处理方法(含UNDO的学习与相关解释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平面设计(板式设计与构图篇)
- 下一篇: 我们在tool里给ui element设