如何在 Oracle 資料庫中調整undo表空間的大小?
一、什麼是撤銷以及為什麼在oracle中撤銷?
這些記錄用於:
-
回滾事務 - 發出 ROLLBACK 語句時,撤消記錄用於撤消未提交事務對資料庫所做的更改。
-
恢復資料庫 - 在資料庫恢復期間,撤消記錄用於撤消從重做日誌應用到資料檔案的任何未提交的更改。
-
提供讀取一致性 - 撤消記錄通過為正在訪問資料同時另一個使用者正在更改資料的使用者維護資料的前映像來提供讀取一致性。
-
使用Flashback Query分析較早時間點的資料。
-
使用閃回功能從邏輯損壞中恢復。
在Oracle 8i之前,Oracle使用回滾段來管理撤銷資料。Oracle9i引入了自動撤消管理,它允許 dba 對撤消資訊的保留時間施加更多控制,簡化撤消空間管理並消除管理回滾段的複雜性。Oracle 強烈建議您使用 undo 表空間來管理 undo 而不是回滾段。
undo段的空間是動態分配、使用、釋放和重用的--所有這些都在Oracle資料庫的控制下,而不是由DBA控制。
從Oracle 9i開始,回滾段方法稱為“手動撤銷管理模式”,新的撤銷表空間的方法稱為“自動撤銷管理模式”。
說明:
-
儘管支援回滾段和撤消表空間,但這兩種模式不能在同一個資料庫例項中使用,儘管出於遷移目的,可以在使用回滾段的資料庫中建立撤消表空間,或刪除回滾段在使用撤消表空間的資料庫中。但是,您必須退回資料庫才能切換到另一種管理撤消的方法。
-
兩種模式都存在系統回滾段。
-
在自動撤消管理模式下執行時,任何手動撤消管理 SQL 語句和初始化引數都將被忽略,並且不會發出錯誤訊息,例如 ALTER ROLLBACK SEGMENT 語句將被忽略。
這篇文章提供了調整 Undo 表空間大小的步驟。
二、管理undo表空間
2.1 建立undo表空間
有兩種建立撤消表空間的方法:
第一種方法:在發出 CREATE DATABASE 語句時建立撤消表空間。這發生在您建立新資料庫並且例項以自動撤消管理模式 (UNDO_MANAGEMENT = AUTO) 啟動時。
第二種方法:用於現有資料庫。它使用 CREATE UNDO TABLESPACE 語句。
您不能在撤消表空間中建立資料庫物件。它保留用於系統管理的撤消資料。Oracle 資料庫使您能夠建立單檔案撤消表空間。
以下語句說明了在 CREATE DATABASE 語句中使用 UNDO TABLESPACE 子句。undo 表空間名為 undotbs_01,併為其分配了一個數據檔案
SQL> CREATE DATABASE ... UNDO TABLESPACE undotbs_01 DATAFILE '/path/undo01.dbf' RETENTION GUARANTEE;
如果在 CREATE DATABASE 期間無法成功建立 undo 表空間,則整個操作將失敗。CREATE UNDO TABLESPACE 語句與 CREATE TABLESPACE 語句相同,但指定了 UNDO 關鍵字。資料庫決定了撤消表空間的大部分屬性,但您可以指定 DATAFILE 子句。
此示例建立 undotbs_02 撤消表空間:
SQL> CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/path/undo02.dbf' SIZE 2M REUSE AUTOEXTEND ON RETENTION NOGUARANTEE ;
2.2 調整 Undo 表空間大小
方法一:縮小撤消表空間大小
分配後的撤消空間將可供重用,但不會重新分配給作業系統。縮小 Undo 表空間的最佳方法是切換到新的 Undo 表空間並刪除舊的 Undo 表空間。步驟是:
-
根據您的資料庫要求建立一個相同大小(更大或更小)的新撤消表空間。
SQL> create undo tablespace UNDOTBS2 datafile 'D:\ORACLE\PRODUCT\11.2.0\ORADATA\ORCL\UNDOTBS02.DBF' size 5000M;
-
切換到新的 Undo 表空間:
SQL> ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2 SCOPE=BOTH;
-
檢視undo segment的狀態,判斷old undo tablespace中的segment是否都處於offline狀態。
sql> select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
如果表空間中有狀態不是OFFLINE的Undo段要被刪除,我們需要等到它們變為OFFLINE。您可能必須等待tuned_undoretention 的持續時間(來自v$undostat)以確保所有撤消段都已變為OFFLINE。
sql> select status,segment_name from dba_rollback_segs where status not in ("OFFLINE') and tablespace_name=[undo tablespace to be dropped];
例如:
sql> select status,segment_name from dba_rollback_segs where status not in ("OFFLINE') and tablespace_name='UNDOTBS1';
-
如果舊Undo表空間中的所有Undo段都處於OFFLINE狀態,則刪除該表空間。
sql> select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
-
驗證然後丟棄:
sql> drop tablespace [tablespace_name] including contents and datafiles;
例如:
sql> drop tablespace UNDOTBS1 including contents and datafiles;
方法二:向撤消表空間新增空間
對於增加/調整撤消表空間的大小,有兩個選項:
-
調整現有撤消資料檔案的大小
-
將新的撤消資料檔案新增到表空間。
-
調整現有撤消資料檔案的大小:
col T_NAME for a23 col FILE_NAME for a65 select tablespace_name T_NAME,file_name, bytes/1024/1024 MB from dba_data_files where tablespace_name =(SELECT UPPER(value) FROM v$parameter WHERE name = 'undo_tablespace') order by file_name; alter database datafile '[COMPLETE_PATH_OF_UNDO_DBF_FILE]' resize [SIZE]M;
例如:
sql> alter database datafile 'D:\ORACLE_DB\TESTDB\TESTDB\UNDOTBS01.DBF' resize 1500M;
-
新增新資料檔案的步驟:
sql> alter tablespace [UNDO tbs name] ADD DATAFILE '[COMPLETE_PATH_OF_UNDO_DBF_FILE]' size 20M;
例如:
sql> alter tablespace UNDOTBS1 ADD DATAFILE 'D:\ORACLE_DB\TESTDB\TESTDB\UNDOTBS02.DBF' size 20M;
三、Oracle 中撤消表空間/撤消管理的最佳實踐
以下建議列表將幫助您管理撤消空間以發揮最大優勢。
-
除非您的系統具有閃回或 LOB 保留要求,否則您無需為 UNDO_RETENTION 引數設定值。
-
在撤消表空間中留出 10% 到 20% 的額外空間,以應對工作負載的一些波動。
-
正確設定撤消表空間警報的警告和嚴重警報閾值。
-
要調整 SQL 查詢或檢查失控查詢,請使用長查詢或 V$UNDOSTAT 或 WRH$_UNDOSTAT 檢視中提供的 SQLID 列的值從 V$SQL 檢視檢索 SQL 文字和有關 SQL 的其他詳細資訊。
微信讚賞
支付寶讚賞