ORACLE 11G 回滾表空間undo滿了處理方法


一.加大undo表空間:

  擴展數據文件大小

show parameter undo                                            --查看默認回滾表空間名(需在命令行下執行)
select tablespace_name,bytes/1024/1024,file_name from dba_data_files;      --查看表空間及對應的數據文件大小
alter database datafile '+DATA/rac/datafile/undotbs1.dbf' resize 30720M;    --修改數據文件大小

  增加數據文件

show parameter undo                                --查看默認回滾表空間名(需在命令行下執行)
select tablespace_name,bytes/1024/1024,file_name from dba_data_files; --查看表空間及對應的數據文件大小
alter tablespace undotbs1 add datafile '+DATA/rac/datafile/undotbs1_2.dbf' size 30G;   --增加數據文件

 

二.切換undo表空間:

  查看默認回滾表空間名(需在命令行下執行)

              

select name from v$datafile 

  創建undotbs11並將默認回滾表空間切換到undotbs11

create undo tablespace undotbs11 datafile '+DATA/rac/datafile/undotbs11_1.dbf' size 30G;
alter system set undo_tablespace=undotbs11 scope=both;

  查看是否已切換

show parameter undo

  查看正在使用的回滾表空間

select t.segment_name, t.tablespace_name, t.segment_id, t.status from dba_rollback_segs t;

  生成參數文件

create pfile from spfile;

  查看UNDOTBS1是否還在使用,當UNDOTBS1ONLINE時刪除UNDOTBS1

select t.segment_name, t.tablespace_name, t.segment_id, t.status from dba_rollback_segs t where t.tablespace_name='UNDOTBS1' and t.status='ONLINE';
drop tablespace undotbs1 including contents and datafiles;

  查看正在使用回滾段的用戶:

select s.username, u.name
  from v$transaction t, v$rollstat r, v$rollname u, v$session s
 where s.taddr = t.addr
   and t.xidusn = r.usn
   and r.usn = u.usn
 order by s.username;

 

三.查看undo段中區的狀態:

select tablespace_name, status, sum(bytes) / 1024 / 1024 MB
  from dba_undo_extents
 group by tablespace_name, status;

select TABLESPACE_NAME,STATUS,CONTENTS,SEGMENT_SPACE_MANAGEMENT,RETENTION from dba_tablespaces where CONTENTS='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為可重用undo空間(如果undo表空間100%,但是expired的空間還有,就不要緊),原則上expired的區一般不會釋放成free。
 
PS:生產中沒有人會將UNDOTBS的retention設置成GUARANTEE這是很危險的。
 

與一般的用戶表空間不同,undo表空間不能通過dba_free_spaces來確定實際的使用情況,undo表空間除了active狀態的extent不能被覆蓋外。其他狀態的extent都是可以空間復用的。

如果active的extent總大小很大,說明系統中存在大事務。如果undo資源耗盡(ACTIVE接近undotbs的總大小),可能導致事務失敗。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM