一、什么是撤銷以及為什么在oracle中撤銷?
Oracle 數據庫有一種維護信息的方法,用於回滾或撤銷對數據庫的更改。Oracle 數據庫在事務提交之前保留事務操作的記錄,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 的其他詳細信息。