1. 概述
本文主要從回滾段的原理,分配和使用,以及回滾段的相關(guān)參數(shù)包括初始化參數(shù)的設(shè)置和回滾段的管理來介紹回滾段。以及回滾段涉及的多種問題。
2. 回滾段工作原理
回滾段是磁盤上的一段存儲空間,用來保存數(shù)據(jù)變化前后的映像來提供一致性讀,保證事務(wù)完整性。
oracle基于兩個原則給事務(wù)分配回滾段。首先oracle試圖將一個新的事務(wù)指派給某個擁有最少活動事務(wù)數(shù)的回滾段;如果沒有單個段能滿足這個需求,那么該事務(wù)將被指派給某個段來保存undo信息,以便此undo信息能夠盡可能長的時間內(nèi)被用于讀一致性視圖保留。讀一致性保證查詢或者返回數(shù)據(jù),或者失敗。當(dāng)失敗時系統(tǒng)發(fā)出ora-01555錯誤。所以,回滾段中已經(jīng)提交的事務(wù)數(shù)據(jù)是非常寶貴的。Oracle設(shè)法盡可能長的保留回滾段已經(jīng)提交的數(shù)據(jù)。
回滾段中的范圍以循環(huán)的方式被使用。一個事務(wù)僅僅使用一個回滾段。當(dāng)一個范圍裝滿回滾段數(shù)據(jù)后回滾段就自動使用下一個范圍。多個事務(wù)可以使用一個范圍,但是一個回滾段的數(shù)據(jù)塊只能存放一個事務(wù)數(shù)據(jù)。當(dāng)回滾段使用完最后一個范圍時,當(dāng)回滾段的第一個范圍是不活動的或者不被使用后,回滾段的指針才指向第一個范圍。
3. 回滾段的類型
回滾段分系統(tǒng)回滾段和非系統(tǒng)回滾段,其中非系統(tǒng)回滾段又分為PUBLIC回滾段和PRIVATE回滾段.
系統(tǒng)回滾段用于處理涉及系統(tǒng)的CATALOG的事物(比如大多數(shù)的DDL), 它位于SYSTEM表空間, 由于只有SYSTEM表空間可以隨時保持可用, 因此, 不要把SYSTEM回滾段放在其他的表空間中.
注意:系統(tǒng)回滾段應(yīng)放在SYSTEM表空間中, 并且應(yīng)該永遠(yuǎn)保持ONLINE狀態(tài).
PUBLIC回滾段對于數(shù)據(jù)庫的所有實(shí)例(INSTANCE)都是可用的, 除非將其設(shè)置為OFFLINE。創(chuàng)建后只要online就可用。
PRIVATE回滾段是指對于數(shù)據(jù)庫的某個實(shí)例是私有的, 為了使用PRIVATE回滾段, 某個實(shí)例應(yīng)當(dāng)在其INITsid.ORA的ROLLBACK_SEGMENTS中標(biāo)明所有要使用的PRIVATE回滾段, 或通過使用ALTER ROLLBACK SEGMENT XXX ONLINE來使用某一個回滾段.
注意:在單實(shí)例系統(tǒng)中,建議將所有回滾段設(shè)為PUBLIC;在多實(shí)例系統(tǒng)中(如OPS), 建議將每個實(shí)例的PRIVATE回滾段放置到訪問比較快的本地設(shè)備上。
4. 回滾段的使用
一般情況下,如果對回滾段的大小估計不準(zhǔn)確的話,會導(dǎo)致系統(tǒng)產(chǎn)生回滾段不能自動擴(kuò)展范圍的錯誤。
4.1. 創(chuàng)建回滾段
當(dāng)創(chuàng)建回滾段時,系統(tǒng)必須要有CREATE ROLLBACK SEGMENT系統(tǒng)權(quán)限。
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狀態(tài)
ALTER ROLLBACK SEGMENT RB01 ONLINE;
4.3. 更改OPTIMAL參數(shù)
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
4.4. 縮小回滾段
ALTER ROLLBACK SEGMENT RB01 SHRINK;
(有OPTIMAL參數(shù)時, 縮小到OPTIMAL值; 沒有OPTIMAL參數(shù)時, 縮小到MINEXTENTS所對應(yīng)的尺寸) ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
4.5. 修改INITIAL/NEXT參數(shù)
原則上,INITIAL總應(yīng)該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創(chuàng)建。
DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);
4.6. 在事務(wù)中使用特定的回滾段
SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;
4.7. 刪除回滾段
DROP ROLLBACK SEGMENT rollback_segment;
5. 重作表空間的使用
在oracle9i中推薦使用重做表空間代替回滾段,當(dāng)然也可是使用回滾段。重做表空間是一種讓系統(tǒng)來自動管理回滾段的方式。在系統(tǒng)里有4個和重做表空間的相關(guān)參數(shù):
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>
當(dāng)將undo_management設(shè)置成AUTO時系統(tǒng)使用重做表空間來管理回滾段,當(dāng)它被設(shè)置成MENUAL時系統(tǒng)使用回滾段。Undo_tablespace指名系統(tǒng)使用哪一個重做表空間。undo_suppress_errors被設(shè)置成true時表示系統(tǒng)創(chuàng)建和使用回滾段時忽略錯誤。undo_retention是自動管理模式下系統(tǒng)提交后,回滾段的數(shù)據(jù)保留多長時間,單位是秒。這個參數(shù)的設(shè)置要看保留的時間和硬盤的空間大小來設(shè)定。下面是Undo 表空間大小的設(shè)計規(guī)范的計算公式:
Undospace = UR * UPS *db_block_size+ 冗余量
UR: 表示在undo中保持的最長時間數(shù)(秒),由數(shù)據(jù)庫參數(shù)UNDO_RETENTION值決定。
UPS:表示在undo中,每秒產(chǎn)生的數(shù)據(jù)庫塊數(shù)量。
例如:在數(shù)據(jù)庫中保留2小時的回退數(shù)據(jù),假定每秒產(chǎn)生200個數(shù)據(jù)庫塊。則Undospace = 2 * 3600 * 200 * 4K = 5.8G
5.1. 創(chuàng)建重做表空間
CREATE UNDO TABLESPACE "RBS2"
DATAFILE '$DATAHOME/RBS2_1.dbf' SIZE 200M REUSE AUTOEXTEND ON
NEXT 1024K MAXSIZE 600M;
5.2. 增加數(shù)據(jù)文件
ALTER TABLESPACE RBS3 ADD DATAFILE '/export/home2/oradata/openview/rbs3_3.dbf' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 300M;
5.3. 修改數(shù)據(jù)文件
增加數(shù)據(jù)文件的大?。?br>ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' RESIZE 300M;
修改數(shù)據(jù)文件的擴(kuò)展類參數(shù)
ALTER DATABASE DATAFILE '/export/home2/oradata/openview/RBS3_2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
6. ORA-01555問題
這個問題是一致性讀取時發(fā)生的?;貪L段是以循環(huán)方式使用回滾段中的范圍,當(dāng)前范圍被寫滿后就使用下一個范圍。當(dāng)回滾段的撤銷數(shù)據(jù)不再是活動的,可能是已經(jīng)提交或者回滾,那么空間就可以重用。當(dāng)一個長時間運(yùn)行的查詢在事務(wù)活動時開始運(yùn)行,當(dāng)事務(wù)結(jié)束時還沒有運(yùn)行完,此時該查詢意識到舊數(shù)據(jù)已經(jīng)不復(fù)存在時,就產(chǎn)生了ORA-01555:snapshot too old的錯誤。
從數(shù)據(jù)庫應(yīng)用的角度來講,產(chǎn)生這個錯誤的原因有:
大的查詢。一般來說,需要DBA找到這個大的查詢,如果可以優(yōu)化的話,盡量提高性能,否則為大的查詢所使用的事務(wù)建立單獨(dú)的回滾段,當(dāng)查詢開始時將該段聯(lián)機(jī),完成后再將該段脫機(jī);或者象oracle建議那樣使用更大的回滾段。
過度頻繁的提交??梢詫螚l提交的事務(wù)改成成批提交。
或者由于設(shè)置了較小的optimal參數(shù)。此時可以將這個參數(shù)加大。
很顯然,回滾段為數(shù)據(jù)庫的管理提供一個挑戰(zhàn)的機(jī)會。不過在oracle9i中使用自動管理undo表空間來解決回滾段的管理問題,因此這個錯誤成為了歷史。
7. ORA-01552 錯誤
ORA-01552 cannot use system rollback segment for non-system tablespace。
這個錯誤說明在系統(tǒng)中沒有可用的非系統(tǒng)回滾段。原因如下:
除了系統(tǒng)回滾段, 未創(chuàng)建其它回滾段
只創(chuàng)建了PRIVATE回滾段, 但I(xiàn)NITsid.ORA的ROLLBACK_SEGMENTS中未列出這些回滾段
創(chuàng)建了PUBLIC回滾段, 但這些回滾段都處于OFFLINE狀態(tài)
解決辦法,根據(jù)上述原因依次解決。
8. 創(chuàng)建回滾段時需要注意的問題
INITIAL和 NEXT最好一樣,除了應(yīng)用使用指定的回滾段。
Private回滾段如果需要被其他用戶使用,那么需要在INITsid.ora中使用rollback_segments指定。
MINEXTENTS最小等于2
OPTIMAL最小應(yīng)該設(shè)置成兩個extents大小。
9. 與之相關(guān)的性能視圖
和undo有關(guān)的動態(tài)性能視圖
v$undostat 包含undo的統(tǒng)計信息。使用這張視圖可以估計系統(tǒng)當(dāng)前所需的undo大小。
v$rollstat undo模式的視圖。是undo表空間的undo segments的 統(tǒng)計信息
v$transaction 包含undo segments的信息。
dba_undo_extents 包含undo表空間中每一個范圍的提交時間。
和回滾段相關(guān)的性能視圖
DBA_ROLLBACK_GEGS 描述回滾段的信息,包含回滾段的名字和表空間;
DBA_SEGMENTS 描述回滾段的附加信息;
V$ROLLNAME 列出在線回滾段的名稱
V$ROLLSTAT 包含回滾段的統(tǒng)計信息
V$TRANSACTION 包含撤銷的統(tǒng)計信息
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。