oracle回滾段 undo 表空間

season0891發表於2010-08-04

1. 概述
本文主要從回滾段的原理,分配和使用,以及回滾段的相關引數包括初始化引數的設定和回滾段的管理來介紹回滾段。以及回滾段涉及的多種問題。
2. 回滾段工作原理
回滾段是磁碟上的一段儲存空間,用來儲存資料變化前後的映像來提供一致性讀,保證事務完整性。
oracle 基於兩個原則給事務分配回滾段。首先oracle試圖將一個新的事務指派給某個擁有最少活動事務數的回滾段;如果沒有單個段能滿足這個需求,那麼該事務將 被指派給某個段來儲存undo資訊,以便此undo資訊能夠儘可能長的時間內被用於讀一致性檢視保留。讀一致性保證查詢或者返回資料,或者失敗。當失敗時 系統發出ora-01555錯誤。所以,回滾段中已經提交的事務資料是非常寶貴的。Oracle設法儘可能長的保留回滾段已經提交的資料。
回滾段 中的範圍以迴圈的方式被使用。一個事務僅僅使用一個回滾段。當一個範圍裝滿回滾段資料後回滾段就自動使用下一個範圍。多個事務可以使用一個範圍,但是一個 回滾段的資料塊只能存放一個事務資料。當回滾段使用完最後一個範圍時,當回滾段的第一個範圍是不活動的或者不被使用後,回滾段的指標才指向第一個範圍。
3. 回滾段的型別
回滾段分系統回滾段和非系統回滾段,其中非系統回滾段又分為PUBLIC回滾段和PRIVATE回滾段. 
系統回滾段用於處理涉及系統的CATALOG的事物(比如大多數的DDL), 它位於SYSTEM表空間, 由於只有SYSTEM表空間可以隨時保持可用, 因此, 不要把SYSTEM回滾段放在其他的表空間中.
注意:系統回滾段應放在SYSTEM表空間中, 並且應該永遠保持ONLINE狀態.
PUBLIC回滾段對於資料庫的所有例項(INSTANCE)都是可用的, 除非將其設定為OFFLINE。建立後只要online就可用。
PRIVATE 回滾段是指對於資料庫的某個例項是私有的, 為了使用PRIVATE回滾段, 某個例項應當在其INITsid.ORA的 ROLLBACK_SEGMENTS中標明所有要使用的PRIVATE回滾段, 或透過使用 ALTER ROLLBACK SEGMENT XXX ONLINE來使用某一個回滾段.
注意:在單例項系統中,建議將所有回滾段設為PUBLIC;在多例項系統中(如OPS), 建議將每個例項的PRIVATE回滾段放置到訪問比較快的本地裝置上。
4. 回滾段的使用
一般情況下,如果對回滾段的大小估計不準確的話,會導致系統產生回滾段不能自動擴充套件範圍的錯誤。
4.1. 建立回滾段
當建立回滾段時,系統必須要有CREATE ROLLBACK SEGMENT系統許可權。
CREATE ROLLBACK SEGMENT RB01  TABLESPACE RBS1 
STORAGE (INITIAL integer K|M NEXT integer K|M  MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );
4.2. 更改ONLINE/OFFLINE狀態
ALTER ROLLBACK SEGMENT RB01 ONLINE;
4.3. 更改OPTIMAL引數
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
4.4. 縮小回滾段
ALTER ROLLBACK SEGMENT RB01 SHRINK; 
(有OPTIMAL引數時, 縮小到OPTIMAL值; 沒有OPTIMAL引數時, 縮小到MINEXTENTS所對應的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
4.5. 修改INITIAL/NEXT引數
原則上,INITIAL總應該等於NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由於INITIAL不能直接修改,只能先drop然後建立。
DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1 
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20  MAXEXTENTS 121 OPTIMAL 2000K);
4.6. 在事務中使用特定的回滾段
SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;
4.7. 刪除回滾段
DROP ROLLBACK SEGMENT rollback_segment;
5. 重作表空間的使用
在oracle9i中推薦使用重做表空間代替回滾段,當然也可是使用回滾段。重做表空間是一種讓系統來自動管理回滾段的方式。在系統裡有4個和重做表空間的相關引數:
SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_suppress_errors                 boolean     TRUE
undo_tablespace                      string      rbs3
SQL>
當 將undo_management設定成AUTO時系統使用重做表空間來管理回滾段,當它被設定成MENUAL時系統使用回滾段。 Undo_tablespace指名系統使用哪一個重做表空間。undo_suppress_errors被設定成true時表示系統建立和使用回滾段時 忽略錯誤。undo_retention是自動管理模式下系統提交後,回滾段的資料保留多長時間,單位是秒。這個引數的設定要看保留的時間和硬碟的空間大 小來設定。下面是Undo 表空間大小的設計規範的計算公式:
Undospace = UR * UPS *db_block_size+ 冗餘量 
UR: 表示在undo中保持的最長時間數(秒),由資料庫引數UNDO_RETENTION值決定。 
UPS:表示在undo中,每秒產生的資料庫塊數量。 
例如:在資料庫中保留2小時的回退資料,假定每秒產生200個資料庫塊。則Undospace = 2 * 3600 * 200 * 4K = 5.8G
5.1. 建立重做表空間
CREATE UNDO TABLESPACE "RBS2" 
DATAFILE '$DATAHOME/RBS2_1.dbf' SIZE 200M REUSE AUTOEXTEND ON 
NEXT  1024K MAXSIZE  600M;
5.2. 增加資料檔案
ALTER TABLESPACE RBS3 ADD DATAFILE '/export/home2/oradata/openview/rbs3_3.dbf' SIZE 10M AUTOEXTEND ON  NEXT 5M MAXSIZE 300M;
5.3. 修改資料檔案
增加資料檔案的大小:
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' RESIZE 300M;
修改資料檔案的擴充套件類引數
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' AUTOEXTEND ON  NEXT 10M MAXSIZE 500M;
6. ORA-01555問題
這 個問題是一致性讀取時發生的。回滾段是以迴圈方式使用回滾段中的範圍,當前範圍被寫滿後就使用下一個範圍。當回滾段的撤銷資料不再是活動的,可能是已經提 交或者回滾,那麼空間就可以重用。當一個長時間執行的查詢在事務活動時開始執行,當事務結束時還沒有執行完,此時該查詢意識到舊資料已經不復存在時,就產 生了ORA-01555:snapshot too old的錯誤。
從資料庫應用的角度來講,產生這個錯誤的原因有:
大的查詢。一般來說,需要DBA找到這個大的查詢,如果可以最佳化的話,儘量提高效能,否則為大的查詢所使用的事務建立單獨的回滾段,當查詢開始時將該段聯機,完成後再將該段離線;或者象oracle建議那樣使用更大的回滾段。
過度頻繁的提交。可以將單條提交的事務改成成批提交。
或者由於設定了較小的optimal引數。此時可以將這個引數加大。
很顯然,回滾段為資料庫的管理提供一個挑戰的機會。不過在oracle9i中使用自動管理undo表空間來解決回滾段的管理問題,因此這個錯誤成為了歷史。
7. ORA-01552 錯誤
ORA-01552 cannot use system rollback segment for non-system tablespace。
這個錯誤說明在系統中沒有可用的非系統回滾段。原因如下:
 除了系統回滾段, 未建立其它回滾段
 只建立了PRIVATE回滾段, 但INITsid.ORA的ROLLBACK_SEGMENTS中未列出這些回滾段
 建立了PUBLIC回滾段, 但這些回滾段都處於OFFLINE狀態
解決辦法,根據上述原因依次解決。

8. 建立回滾段時需要注意的問題
 INITIAL和 NEXT最好一樣,除了應用使用指定的回滾段。
 Private回滾段如果需要被其他使用者使用,那麼需要在INITsid.ora中使用rollback_segments指定。
 MINEXTENTS最小等於2
 OPTIMAL最小應該設定成兩個extents大小。
9. 與之相關的效能檢視
和undo有關的動態效能檢視

 v$undostat        包含undo的統計資訊。使用這張檢視可以估計系統當前所需的undo大小。
 v$rollstat      undo模式的檢視。是undo表空間的undo segments的                                        統計資訊
 v$transaction      包含undo segments的資訊。
 dba_undo_extents  包含undo表空間中每一個範圍的提交時間。
和回滾段相關的效能檢視

 DBA_ROLLBACK_GEGS     描述回滾段的資訊,包含回滾段的名字和表空間;
 DBA_SEGMENTS           描述回滾段的附加資訊;
 V$ROLLNAME         列出線上回滾段的名稱
 V$ROLLSTAT               包含回滾段的統計資訊
 V$TRANSACTION           包含撤銷的統計資訊

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

相關文章