縮小Oracle目錄下UNDOTBS01.DBF文件的大小
使用sys用戶登錄Oracle
方法一:重置表空間大小
linux下執行
ALTER DATABASE DATAFILE '/opt/oracle/oradata/res/undotbs01.dbf' RESIZE 100M;
windows下執行ALTER?DATABASE?DATAFILE?'E:\ORACLE\ORADATA\UNDOTBS01.DBF'?RESIZE?100M;
其中?'/opt/oracle/oradata/res/undotbs01.dbf' 為您系統中UNDOTBS01.DBF文件的存儲路徑;100M為重置后的大小,根據需要修改。
如果方法一無法執行,可使用方法二
方法二:新建UNDO表空間,替換原來的UNDO表空間
1. 創建一個新的小的undo表空間
linux下執行:
create?undo?tablespace?undotbs2?datafile?'/opt/oracle/oradata/res/undotbs02.dbf'? size?100M?reuse?autoextend?on; //‘/opt/oracle/oradata/res/undotbs02.dbf’為表空間文件想要存儲的位置,100M表示新的表空間的 初始大小并自動增長。 或 create?undo?tablespace?undotbs2?datafile?'/u01/app/oracle/oradata/orcl/undotbs02.dbf'? size?100M?reuse?autoextend?on?next?5m?maxsize?1024M; //‘/opt/oracle/oradata/res/undotbs02.dbf’為表空間文件想要存儲的位置。100M表示新的表空間的 初始大小,按5M增加最大到1G。
windows下執行:
CREATE?UNDO?TABLESPACE?UNDOTBS2?DATAFILE?'E:\oradata\UNDOTBS02.DBF'? SIZE?100M?REUSE?AUTOEXTEND?ON;
2. 設置新的表空間為系統的Undo表空間
--(1)動態更改spfile配置文件,設置新的表空間為系統undo_tablespace
alter?system?set?undo_tablespace=undotbs2;?
ALTER?SYSTEM?SET?UNDO_TABLESPACE=UNDOTBS2;
--(2)再次驗證數據庫的undo表空間(確定當前例程正在使用的UNDO表空間)??
show parameter undo_tablespace
--(3)等待原UNDO表空間UNDOTBS1 is OFFLINE;??
SELECT????r.status????"Status",???
r.segment_name????"Name",???
r.tablespace_name?????"Tablespace",???
s.extents?????"Extents",???
TO_CHAR((s.bytes/1024/1024),'99999990.000')?????"Size"??
FROM?????sys.dba_rollback_segs??????r,?sys.dba_segments????s???
WHERE????????r.segment_name?=?s.segment_name???
AND???????s.segment_type?IN?('ROLLBACK',?'TYPE2?UNDO')???
and???????r.tablespace_name='UNDOTBS1'??????and???????status='ONLINE';??如果上面有狀態online的對象,可以查詢具體對象的sid,serial#???--(4)查看當前是什么在使用這個回滾段???
SELECT?r.NAME,s.sid,s.serial#?Serial, s.username?,s.machine?, t.start_time,t.status?, t.used_ublk?, substr(s.program,?1,?15)?"operate"?? FROM?v$session?s,?v$transaction?t,?v$rollname?r,v$rollstat?g??? WHERE?t.addr?=?s.taddr??? AND?t.xidusn?=?r.usn??? AND?r.usn?=?g.usn??? ORDER?BY?t.used_ublk?desc;--比如:對象為:sid? 474,serial? 6794??
select?sql_text?from?v$session?a,v$sqltext_with_newlines?b? where?DECODE(a.sql_hash_value,?0,?prev_hash_value,?sql_hash_value)=b.hash_value? and?a.sid=&sid?order?by?piece;
?如果該sql不重要,可以直接kill該會話。??
--(6)kill session???
alter system kill session '474,6794';?--(7)刪除舊的Undo表空間?
依舊使用sys用戶登錄,執行?
drop tablespace undotbs1 including contents and datafiles;(drop?tablespace?undotbs1?including?contents;這個只刪除的表空間名沒有刪除掉數據文件的)
--(8)確認刪除是否成功;
select name from v$tablespace;
--(9)確定$ORACLE_HOME/dbs/spfileoinms.ora內容是否發生變更:
$more spfileoinms.ora
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS2'
?
--(10)如果沒有發生變更請執行如下語句:?
SQL> create pfile from spfile;?
File created.
--(11)刪除原UNDO表空間的數據文件,其文件名為步驟中執行的結果。
#rm $ORACLE_BASE/oradata/$ORACLE_SID/undotbs01.dbf
(雖然已經刪除了系統所對應的undo表空間的數據文件,但用df -h查看,該系統空間不能釋放。? ?
主要是由于Oracle的一個進程在訪問該文件??梢詋ill Oracle訪問進程,或者重啟數據庫后,即可釋放系統的空間。)
3. 重啟數據庫
可以使用sys用戶,從sqlplus登錄,執行startup force命令,強制重啟
若覺得強制重啟不安全的話,可以先shutdown immediate在啟動數據庫startup
至此,UNDOTBS01.DBF文件縮小完畢,如果想要還原原來的表空間名稱,重新執行方法二即可。
4.切換回UNTOTBS1表空間
--(1)新建立UNDOTBS1表空間???
create???? undo???? tablespace??? UNDOTBS1???alter system set undo_tablespace=UNDOTBS1 scope=both;?
--(3)再次驗證數據庫的undo表空間? ?
show parameter undo_tablespace
?
--(4)等待UNDO表空間UNDOTBS2 is OFFLINE;SELECT?r.status?"Status",???
r.segment_name?"Name",???
r.tablespace_name?"Tablespace",???
s.extents?"Extents",???
TO_CHAR((s.bytes/1024/1024),'99999990.000')?"Size"??
FROM?sys.dba_rollback_segs?r,?sys.dba_segments?s???
WHERE?r.segment_name?=?s.segment_name???
AND?s.segment_type?IN?('ROLLBACK',?'TYPE2?UNDO')???
and?r.tablespace_name='UNDOTBS2'??
ORDER?BY?5?DESC;?
--(5)刪除? ?
drop??? tablespace???? UNDOTBS2??? including??? contents??? and???? datafiles;?--(6)確認刪除是否成功;
select name from v$tablespace;
方法三:禁止undo tablespace自動增長
alter?database?datafile?'/u01/app/oracle/oradata/orcl/undotbs01.dbf'?autoextend?off; alter?database?datafile?'D:\app\Administrator\oradata\undotbs01.dbf'?autoextend?off;
?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。