生產(chǎn)環(huán)境Oracle undo表空間管理的優(yōu)秀實(shí)踐
一、什么是撤銷以及為什么在oracle中撤銷?
Oracle 數(shù)據(jù)庫有一種維護(hù)信息的方法,用于回滾或撤消對數(shù)據(jù)庫的更改。Oracle 數(shù)據(jù)庫在事務(wù)提交之前保留事務(wù)操作的記錄,Oracle 需要此信息來回滾或撤消對數(shù)據(jù)庫的更改。這些記錄稱為回滾或撤銷記錄。
這些記錄用于:
- 回滾事務(wù) - 發(fā)出 ROLLBACK 語句時(shí),撤銷記錄用于撤消未提交事務(wù)對數(shù)據(jù)庫所做的更改。
- 恢復(fù)數(shù)據(jù)庫 - 在數(shù)據(jù)庫恢復(fù)期間,撤銷記錄用于撤消從重做日志應(yīng)用到數(shù)據(jù)文件的任何未提交的更改。
- 提供讀取一致性 - 撤消記錄通過為正在訪問數(shù)據(jù)同時(shí)另一個用戶正在更改數(shù)據(jù)的用戶維護(hù)數(shù)據(jù)的前映像來提供讀取一致性。
- 使用Flashback Query分析較早時(shí)間點(diǎn)的數(shù)據(jù)。
- 使用閃回功能從邏輯損壞中恢復(fù)。
在Oracle 8i之前,Oracle使用回滾段來管理撤銷數(shù)據(jù)。Oracle9i引入了自動撤消管理,它允許 dba 對撤消信息的保留時(shí)間施加更多控制,簡化撤消空間管理并消除管理回滾段的復(fù)雜性。Oracle 強(qiáng)烈建議您使用 undo 表空間來管理 undo 而不是回滾段。
undo段的空間是動態(tài)分配、使用、釋放和重用的--所有這些都在Oracle數(shù)據(jù)庫的控制下,而不是由DBA控制。
從Oracle 9i開始,回滾段方法稱為“手動撤銷管理模式”,新的撤銷表空間的方法稱為“自動撤銷管理模式”。
說明:
- 盡管支持回滾段和撤消表空間,但這兩種模式不能在同一個數(shù)據(jù)庫實(shí)例中使用,盡管出于遷移目的,可以在使用回滾段的數(shù)據(jù)庫中創(chuàng)建撤消表空間,或刪除回滾段在使用撤消表空間的數(shù)據(jù)庫中。但是,您必須退回?cái)?shù)據(jù)庫才能切換到另一種管理撤銷的方法。
- 兩種模式都存在系統(tǒng)回滾段。
- 在自動撤消管理模式下運(yùn)行時(shí),任何手動撤消管理 SQL 語句和初始化參數(shù)都將被忽略,并且不會發(fā)出錯誤消息,例如 ALTER ROLLBACK SEGMENT 語句將被忽略。
二、管理undo表空間
2.1 創(chuàng)建undo表空間
有兩種創(chuàng)建撤消表空間的方法:
第一種方法:在發(fā)出 CREATE DATABASE 語句時(shí)創(chuàng)建撤消表空間。這發(fā)生在您創(chuàng)建新數(shù)據(jù)庫并且實(shí)例以自動撤銷管理模式 (UNDO_MANAGEMENT = AUTO) 啟動時(shí)。
第二種方法:用于現(xiàn)有數(shù)據(jù)庫。它使用 CREATE UNDO TABLESPACE 語句。
您不能在撤銷表空間中創(chuàng)建數(shù)據(jù)庫對象。它保留用于系統(tǒng)管理的撤銷數(shù)據(jù)。Oracle 數(shù)據(jù)庫使您能夠創(chuàng)建單文件撤銷表空間。
以下語句說明了在 CREATE DATABASE 語句中使用 UNDO TABLESPACE 子句。undo 表空間名為 undotbs_01,并為其分配了一個數(shù)據(jù)文件
- SQL> CREATE DATABASE ...
- UNDO TABLESPACE undotbs_01 DATAFILE '/path/undo01.dbf' RETENTION GUARANTEE;
如果在 CREATE DATABASE 期間無法成功創(chuàng)建 undo 表空間,則整個操作將失敗。CREATE UNDO TABLESPACE 語句與 CREATE TABLESPACE 語句相同,但指定了 UNDO 關(guān)鍵字。數(shù)據(jù)庫決定了撤銷表空間的大部分屬性,但您可以指定 DATAFILE 子句。
此示例創(chuàng)建 undotbs_02 撤銷表空間:
- SQL> CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/path/undo02.dbf' SIZE 2M REUSE AUTOEXTEND ON RETENTION NOGUARANTEE ;
2.2 調(diào)整 Undo 表空間大小
方法一:縮小撤消表空間大小
分配后的撤銷空間將可供重用,但不會重新分配給操作系統(tǒng)??s小 Undo 表空間的最佳方法是切換到新的 Undo 表空間并刪除舊的 Undo 表空間。步驟是:
根據(jù)您的數(shù)據(jù)庫要求創(chuàng)建一個相同大小(更大或更小)的新撤消表空間。
- 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的狀態(tài),判斷old undo tablespace中的segment是否都處于offline狀態(tài)。
- sql> select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
如果表空間中有狀態(tài)不是OFFLINE的Undo段要被刪除,我們需要等到它們變?yōu)镺FFLINE。您可能必須等待tuned_undoretention 的持續(xù)時(shí)間(來自v$undostat)以確保所有撤消段都已變?yōu)镺FFLINE。
- 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狀態(tài),則刪除該表空間。
- sql> select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
驗(yàn)證然后丟棄:
- sql> drop tablespace [tablespace_name] including contents and datafiles;
例如:
- sql> drop tablespace UNDOTBS1 including contents and datafiles;
方法二:向撤消表空間添加空間
對于增加/調(diào)整撤消表空間的大小,有兩個選項(xiàng):
- 調(diào)整現(xiàn)有撤銷數(shù)據(jù)文件的大小
- 將新的撤銷數(shù)據(jù)文件添加到表空間。
調(diào)整現(xiàn)有撤銷數(shù)據(jù)文件的大小:
- 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;
添加新數(shù)據(jù)文件的步驟:
- 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 中撤消表空間/撤消管理的最佳實(shí)踐
以下建議列表將幫助您管理撤銷空間以發(fā)揮最大優(yōu)勢。
- 除非您的系統(tǒng)具有閃回或 LOB 保留要求,否則您無需為 UNDO_RETENTION 參數(shù)設(shè)置值。
- 在撤銷表空間中留出 10% 到 20% 的額外空間,以應(yīng)對工作負(fù)載的一些波動。
- 正確設(shè)置撤消表空間警報(bào)的警告和嚴(yán)重警報(bào)閾值。
- 要調(diào)整 SQL 查詢或檢查失控查詢,請使用長查詢或 V$UNDOSTAT 或 WRH$_UNDOSTAT 視圖中提供的 SQLID 列的值從 V$SQL 視圖檢索 SQL 文本和有關(guān) SQL 的其他詳細(xì)信息。