Oracle 19c 線上縮減 UNDO 表空間 容量

wpgy發表於2019-09-26

由於種種原因,資料庫中可能會產生一個佔用過多儲存空間的 UNDO 表空間,UNDO 表空間的資料檔案無法使用 RESIZE 縮減容量,唯一可行的辦法就是:

1、建立一個新的 UNDO 表空間,並將其指定為當前 UNDO 表空間;

SQL> CREATE UNDO TABLESPACE UNDO_TBS DATAFILE '+DATA' SIZE 1G;

SQL> ALTER SYSTEM SET undo_tablespace=UNDO_TBS;


在事務兩比較大的系統中,指定新UNDO表空間後可能會導致整個資料庫無法做任何更改操作,任何的 DDL或者DML操作都會報錯,這時如果允許的話可以重啟資料庫來解決。資料庫重啟之後,剛剛更改的系統預設UNDO表空間引數會失效,還是使用的舊的,應該在 NOMOUNT 狀態下重新指定新的 UNDO表空間,然後再開啟資料庫繼續做下面的操作;


2、刪除 原 UNDO 表空間(一般是 UNDOTBS1);

SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;


3、建立一個新的跟原來 UNDO 表空間同名的 UNDO 表空間(UNDOTBS1),並將其指定為當前 UNDO 表空間,刪除第一步建立的  UNDO 表空間;

SQL> CREATE UNDO TABLESPACE UNDOTBS1 DATAFILE '+DATA' SIZE 200M AUTOEXTEND ON;

SQL> ALTER SYSTEM SET undo_tablespace=UNDOTBS1;

SQL> DROP TABLESPACE UNDO_TBS INCLUDING CONTENTS AND DATAFILES;


注意:整個過程中是不需要重啟資料庫的,如果重啟了資料庫,引數 undo_tablespace 又會變成預設值(UNDOTBS1),所以我們最後的 UNDO 表空間還是叫 UNDOTBS1 這個名字。


Oracle 19c 中 UNDO 表空間是獨立的,CDB 和 每個PDB 都有自己的 UNDO 表空間,因此實際操作跟 11g 是一樣的。這裡可以看到有3個 UNDOTBS1 表空間,分別屬於不同的 CON_ID。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560527/viewspace-2658436/,如需轉載,請註明出處,否則將追究法律責任。

相關文章