數據庫的維護與數據庫的編程實際應用中經常會遇到不解之處,對於大數據量做的DML操作後,我們是的把Oracle undo的表空間擴展到十幾個G或是幾十個G 但是這些表空間的所占用磁盤的物理空間又不會被Oracle 所釋放,如果你用的是PC機很可能會遇到磁盤空間不足的問題。
經過個人整理經過如下操作可以重構Oracle undo表空間,同樣temp表空間也可能在你查詢大數據或則創建索引的時候無限擴大導致磁盤空間不足,同樣可以用如下方式解決此問題:
查看各表空間名稱
- select name from v$tablespace
查看某個表空間信息
- select file_name,bytes/1024/1024 from
dba_data_files where tablespace_name like 'undoTBS1';
查看回滾段的使用情況,哪個用戶正在使用回滾段的資源,如果有用戶最好更換時間(特別是生產環境)。
- 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 Segment狀態
- select usn,xacts,rssize/1024/1024/1024,hwmsize
/1024/1024/1024,shrinks from v$rollstat order by rssize;
創建新的undo表空間,並設置自動擴展參數;
- create undo tablespace undotbs2 datafile 'D:\Oracle
\PRODUCT\10.1.0\ORADATA\ORCL\undoTBS02.DBF' size 10m
reuse autoextend on next 100m maxsize unlimited;
動態更改spfile配置文件;
- alter system set undo _tablespace=undotbs2 scope=both;
等待原UNDO表空間所有Oracle UNDO SEGMENT OFFLINE;
- select usn,xacts,status,rssize/1024/1024/1024,
hwmsize/1024/1024/1024,shrinks from v$rollstat
order by rssize;
再執行看UNDO表空間所有UNDO SEGMENT ONLINE;
- select usn,xacts,status,rssize/1024/1024/1024,
hwmsize/1024/1024/1024,shrinks from v$rollstat
order by rssize;
刪除原有的UNDO表空間;
- drop tablespace undotbs1 including contents;
確認刪除是否成功;
- select name from v$tablespace;
最後需要在重啟數據庫或者重啟計算機後到存儲數據文件的路徑下刪除數據文件(為什麼要手動刪除呢:以上步驟只是刪除了Oracle 中Oracle undo表空間的邏輯關系,即刪除了數據文件在數據字典中的關聯,不會自動刪除項關聯的數據文件)。