一、一次更新或者刪除大量數據,這些數據需要保存在undo表空間中(直到提交或回滾后這些undo表空間中的數據才允許被覆蓋),如果undo表空間不足,就會報ORA-30036錯誤。
下面是兩種解決辦法:
1、增加undo表空間大小,或將undo表空間數據文件設置為自動擴展(如果磁盤空間不足也會導致該問題)
2、批量更新或刪除數據
二、數據庫中存在大量未提交的事物(更新或刪除操作)
解決辦法:
1、找出這些占用undo回滾段的操作(使用下面語句)
SELECT s.username,
s.sid,
pr.PID,
s.OSUSER,
s.MACHINE,
s.PROGRAM,
rs.segment_id,
r.usn,
rs.segment_name,
r.rssize/1024/1024,
sq.sql_text
FROM v$transaction t, v$session s, v$rollstat r, dba_rollback_segs rs ,v$sql? sq,v$process pr
WHERE s.saddr = t.ses_addr
AND t.xidusn = r.usn
AND rs.segment_id = t.xidusn
AND s.sql_address=sq.address
AND s.sql_hash_value = sq.hash_value
AND s.PADDR=pr.ADDR
ORDER BY t.used_ublk DESC;
USERNAME?? SID?? ? PID OSUSER? MACHINE? PROGRAM?? ??? ??? ?? SEGMENT_ID? USN? SEGMENT_NAME????????? R.RSSIZE/1024/1024? SQL_TEXT
--------?? ---?? --- ------? -------? -------???????????????????? ----------? ---? ------------????????? ------------------? ------------------------
SCOTT?? ??? 36?? ? 25 oracle?? rhel5??? sqlplus@rhel5 (TNS V1-V3)?? ????? 14?? ?????? 14?? _SYSSMU14_55430887$??? 5.3671875????? update t set object_name='aaaa' where rownum<10000
SCOTT????? 30?? ? 23 oracle?? rhel5??? sqlplus@rhel5 (TNS V1-V3)?? ????? 12?? ??????? 12? _SYSSMU12_2606085817$?? 2.6171875???? update b set object_name='aaaa'
找出導致這些語句未提交的原因(如調用存儲過程邏輯問題),進行處理
三、在使用數據泵導入數據時,如果數據中存在大量約束和索引,導入數據時維護索引會產生大量undo數據
Import datapump will perform index maintenance and this can increase undo usage especially if there is other DML occurring on the database。
解決辦法:導入數據時使用下面兩個參數排除約束和索引,導入數據成功后再創建相應的約束和索引:
EXCLUDE=CONSTRAINT
EXCLUDE=INDEX
備注:
關于undo表空間的大小,可以根據下面的計算做一個預算
1.計算業務高峰期每秒產生undo數據塊的個數:
select max(undoblks / ((end_time - begin_time)*24*3600)) from v$undostat;
2.得到undo數據塊在undo表空間中可以保留的最長時間
show parameter undo_retention
3.得到數據塊大小
show parameter db_block;
4.將以上三者的數據相乘就是所需undo表空間的大小數。
查看undo數據塊的歷史使用情況(每10分鐘使用的數據塊數量)
SQL> select begin_time,end_time,undoblks from v$undostat;
16-MAY-16?? ??? 16-MAY-16?? ??? ????? 827
16-MAY-16?? ??? 16-MAY-16?? ??? ???? 1065
16-MAY-16?? ??? 16-MAY-16?? ??? ?????? 23
16-MAY-16?? ??? 16-MAY-16?? ??? ???? 2279
16-MAY-16?? ??? 16-MAY-16?? ??? ???? 8665
16-MAY-16?? ??? 16-MAY-16?? ??? ???? 3245
16-MAY-16?? ??? 16-MAY-16?? ??? ???? 1011
......
......
......
查看正在運行的事物所需要的undo數據塊
SQL> select addr,used_ublk from v$transaction;
ADDR?? ??? ?? USED_UBLK
---------------- ----------
000000007DC55940?? ?296
000000007DC5F108?? ?580
查看UNDO表空間占用情況
SQL> select tablespace_name,status,round(sum(bytes)/1024/1024,2) MB,count(*) extent_count from dba_undo_extents group by tablespace_name,status order by tablespace_name,status;
TABLESPACE_NAME ?? ??????? STATUS?? ??? ? MB EXTENT_COUNT
------------------------------ --------- ---------- ------------
UNDOTBS1?? ??? ??????? ACTIVE?? ?????? 10.69?? ?????? 36
UNDOTBS1?? ??? ??????? EXPIRED?? ??? ? .5?? ??????? 8
UNDOTBS1?? ??? ??????? UNEXPIRED????? 72.81?? ????? 112
UNDOTBS2?? ??? ??????? EXPIRED?? ??????? 2.94?? ?????? 32
UNDOTBS2?? ??? ??????? UNEXPIRED?????? 3.44?? ?????? 10
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/30373263/viewspace-2100947/,如需轉載,請注明出處,否則將追究法律責任。