UNDO空间满的处理方法(含UNDO的学习与相关解释)
1、查看數(shù)據(jù)庫當(dāng)前實(shí)例使用的是哪個(gè)UNDO表空間:
showparameterundo_tablespace
2、查看UNDO表空間對(duì)應(yīng)的數(shù)據(jù)文件和大小
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段中區(qū)的狀態(tài):
free: 區(qū)未分配給任何一個(gè)段
active: 已經(jīng)被分配給段,并且這個(gè)段被事務(wù)所使用,且事務(wù)沒有提交,不能覆蓋。(區(qū)被未提交的事務(wù)使用)
unexpired:事務(wù)已經(jīng)提交,但是區(qū)還在段中,還沒有被覆蓋且未達(dá)到undo_retention設(shè)定的時(shí)間。
(nogurantee的情況下,原則上oracle盡量的不覆蓋unexpired的區(qū),但是如果undo空間壓力及較大,oracle也會(huì)去覆蓋。如果是guarantee,oracle強(qiáng)制保留retention時(shí)間內(nèi)的內(nèi)容,這時(shí)候free和expired空間不足的話,新事物將失敗。)
expired:oracle希望已經(jīng)提交的事務(wù)對(duì)應(yīng)的undo表空間中的undo段中的區(qū)再保留一段時(shí)間。保留的時(shí)間就是undo_retention。
unexpired的區(qū)存在時(shí)間超過undo_retention設(shè)定的時(shí)間,狀態(tài)就會(huì)變?yōu)閑xpired。過期后的區(qū)就可以被覆蓋了。原則上expired的區(qū)一般不會(huì)釋放成free
PS:生產(chǎn)中沒有人會(huì)將UNDOTBS的retention設(shè)置成GUARANTEE這是很危險(xiǎn)的。
4、查看undo表空間當(dāng)前的使用情況:
setlines200pages200 coltablespace_namefora30selecttablespace_name, status,sum(bytes)/1024/1024MBfromdba_undo_extentsgroupbytablespace_name,status;
與一般的用戶表空間不同,undo表空間不能通過dba_free_spaces來確定實(shí)際的使用情況,undo表空間除了active狀態(tài)的extent不能被覆蓋外。其他狀態(tài)的extent都是可以空間復(fù)用的。
如果active的extent總大小很大,說明系統(tǒng)中存在大事務(wù)。如果undo資源耗盡(ACTIVE接近undotbs的總大小),可能導(dǎo)致事務(wù)失敗。
5、查看什么事務(wù)占用了過多的undo:
selectaddr,used_ublk,used_urec,inst_id fromgv$transactionorderby2desc;
ADDR: 事務(wù)的內(nèi)存你地址。
USED_UBLK:事務(wù)使用的undo block數(shù)量。
USED_UREC:事務(wù)使用的undo record (undo前鏡像的條數(shù),例如:delete刪除的記錄數(shù))
6、查看占用undo的事務(wù)執(zhí)行了什么sql:
setlines200pages200colprogramfora30 colmachinefora30selectsql_id,last_call_et,program,machinefromgv$session wheretaddr='0000000089A9E2F0';
LAST_CALL_ET: 上一次調(diào)用到現(xiàn)在為止過了多長時(shí)間,單位為秒,途中顯示過了304s (既可以理解為sql已經(jīng)運(yùn)行了304s)。
setlong99999setlines100setpages1000 select sql_fulltextfromv$sqlwhereSQL_ID='8gvp49tr474f2';
7、找到了sql,下面就可以聯(lián)系應(yīng)用做處理了:
哪臺(tái)機(jī)器,通過什么程序,發(fā)起了什么sql,占用了多少undo,是否可以殺掉,sql是否可以改寫,是否可以分批提交。。。等
關(guān)于UNDO的其他知識(shí):
1、undo的讀取方式是單塊讀的,所以事務(wù)的回滾比較慢
2、顯示undo使用情況的統(tǒng)計(jì)信息:
SELECTTO_CHAR(BEGIN_TIME,'HH24:MI:SS')BEGIN_TIME, TO_CHAR(END_TIME,'HH24:MI:SS')END_TIME, UNDOBLKSFROMV$UNDOSTAT;
3、system表空間中有一個(gè)系統(tǒng)回滾段,只有在對(duì)數(shù)據(jù)字典進(jìn)行操作時(shí)(eg:修改表結(jié)構(gòu))才用到系統(tǒng)回滾段,另外一種情況,如果undo表空間出現(xiàn)問題,oracle也可能使用system段。
一個(gè)事務(wù)開始的時(shí)候,在shared pool中分一個(gè)IMU(in memory undo) buffer,將所有的回滾信息寫到IMU buffer中
一個(gè)事務(wù)開始后,需要回滾塊的時(shí)候不需要從從磁盤讀undo block,直接從shared pool 中分IMU BUFFER,之后回滾信息寫到imubuffer中,
回滾信息寫入的時(shí)候也要產(chǎn)生redo,但是imubuffer減少了物理io
針對(duì)IMUbuffer 在shared中會(huì)生成專門供其使用的redo日志區(qū),叫做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
總結(jié)
以上是生活随笔為你收集整理的UNDO空间满的处理方法(含UNDO的学习与相关解释)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平面设计(板式设计与构图篇)
- 下一篇: 华为换届完成工商变更 增6大董事 阎力大