深入解析oracle回滚段
深入解析oracle的回滾段
日前在整理數據庫表空間的是否,發現最大的數據文件來自回滾段。回滾段文件undotbs1的數據文件已經達到23G。
希望清理這部分數據,但一時又無從下手。于是決定深入了解一下這部分內容。
法和規劃及問題的解決。?
回滾段概述?
回滾段用于存放數據修改之前的值(包括數據修改之前的位置和值)。回滾段的頭部包含正在使用的該回滾段事務的信息。一個事務只能使用一個回滾段來存放它的回滾信息,而一個回滾段可以存放多個事務的回滾信息。?
回滾段的作用?
事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務(ROLLBACK)時,ORACLE將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。?
事務恢復:當事務正在處理的時候,例程失敗,回滾段的信息保存在重做日志文件中,ORACLE將在下次打開數據庫時利用回滾來恢復未提交的數據。?
讀一致性:當一個會話正在修改數據時,其他的會話將看不到該會話未提交的修改。而且,當一個語句正在執行時,該語句將看不到從該語句開始執行后的未提交的修改(語句級讀一致性)。當ORACLE執行SELECT語句時,ORACLE依照當前的系統改變號(SYSTEM CHANGE NUMBER-SCN)來保證任何前于當前SCN的未提交的改變不被該語句處理。可以想象:當一個長時間的查詢正在執行時,若其他會話改變了該查詢要查詢的某個數據塊,ORACLE將利用回滾段的數據前影像來構造一個讀一致性視圖。?
事務級的讀一致性?
ORACLE一般提供SQL語句級(SQL STATEMENT LEVEL)的讀一致性,可以用以下語句來實現事務級的讀一致性。?
SET TRANSACTION READ ONLY;?
或:?
SET TANNSACTION SERIALIZABLE;?
以上兩個語句都將在事務開始后提供讀一致性。需要注意的是,使用第二個語句對數據庫的并發性和性能將帶來影響。?
回滾段的種類?
系統回滾段:當數據庫創建后,將自動創建一個系統回滾段,該回滾段只用于存放系統表空間中對象的前影像。?
非系統回滾段:擁有多個表空間的數據庫至少應該有一個非系統回滾段,用于存放非系統表空間中對象的數據前影像。非系統回滾段又分為私有回滾段和公有回滾段,私有回滾段應在參數文件的ROLLBACK SEGMENTS參數中列出,以便例程啟動時自動使其在線(ONLINE)。公有回滾段一般在OPS(ORACLE并行服務器)中出現,將在例程啟動時自動在線。?
DEFERED回滾段:該回滾段在表空間離線(OFFLINE)時由系統自動創建,當表空間再次在線(ONLINE)時由系統自動刪除,用于存放表空間離線時產生的回滾信息。
自9i之后,回滾段默認設置由數據庫自行管理,這大大降低了DBA的維護成本,一般不需要進行回滾段的創建,修改和刪除工作了,只要undotbs1表空間能夠有足夠的空間就行。
select?segment_name,owner,tablespace_name,status?from?dba_rollback_segs t
1?????SYSTEM?SYS?SYSTEM?ONLINE
2?????_SYSSMU1$??PUBLIC??UNDOTBS1???ONLINE
3?????_SYSSMU2$??PUBLIC??UNDOTBS1???ONLINE
4?????_SYSSMU3$??PUBLIC??UNDOTBS1???ONLINE
5?????_SYSSMU4$??PUBLIC??UNDOTBS1???ONLINE
6?????_SYSSMU5$??PUBLIC??UNDOTBS1???ONLINE
7?????_SYSSMU6$??PUBLIC??UNDOTBS1???ONLINE
8?????_SYSSMU7$??PUBLIC??UNDOTBS1???ONLINE
9?????_SYSSMU8$??PUBLIC??UNDOTBS1???ONLINE
10????_SYSSMU9$??PUBLIC??UNDOTBS1???ONLINE
11????_SYSSMU10$?PUBLIC??UNDOTBS1???ONLINE
12????_SYSSMU11$?PUBLIC??UNDOTBS1???OFFLINE
13????_SYSSMU12$?PUBLIC??UNDOTBS1???OFFLINE
14????_SYSSMU13$?PUBLIC??UNDOTBS1???OFFLINE
15????_SYSSMU14$?PUBLIC??UNDOTBS1???OFFLINE
查詢結果說明,系統先創建了一個系統回滾段(system專用),然后又創建了幾個公用(public)回滾段。
回滾段的使用?
分配回滾段:當事務開始時,ORACLE將為該事務分配回滾段,并將擁有最少事務的回滾段分配給該事務。事務可以用以下語句申請指定的回滾段:?
SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
事務將以順序,循環的方式使用回滾段的區(EXTENTS),當當前區用滿后移到下一個區。幾個事務可以寫在回滾段的同一個區,但每個回滾段的塊只能包含一個事務的信息。?
例如(兩個事務使用同一個回滾段,該回滾段有四個區):?
1、事務在進行中,它們正在使用回滾段的第三個區;?
2、當兩個事務產生更多的回滾信息,它們將繼續使用第三個區;?
3、當第三個區滿后,事務將寫到第四個區,當事務開始寫到一個新的區時,稱為翻轉(WRAP);?
4、當第四個區用滿時,如果第一個區是空閑或非活動(使用該區的所有事務完成而沒有活動的事務)的,事務將接著使用第一個區。?
回滾段的擴張(EXTEND)?
當當前回滾段區的所有塊用完而事務還需要更多的回滾空間時,回滾段的指針將移到下一個區。當最后一個區用完,指針將移到第一個區的前面。回滾段指針移到下一個區的前提是下一個區沒有活動的事務,同時指針不能跨區。當下一個區正在使用時,事務將為回滾段分配一個新的區,這種分配稱為回滾段的擴展。回滾段將一直擴展到該回滾段區的個數到達回滾段的參數MAXEXTENTS的值時為止。?
回滾段的回收和OPTIMAL參數?
OPTIMAL參數指明回滾段空閑時收縮到的位置,指明回滾段的OPTIMAL參數可以減少回滾段空間的浪費。?
創建回滾段?
語法:?
CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment?
?[TABLESPACE tablespace]?
?[STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]]?
?[MINEXTENTS integer]?
?[MAXTENTS {integer|UNLIMITED}]?
?[OPTIMAL {integer[K|M]|NULL}]) ]?
注:?
?回滾段可以在創建時指明PRIVATE或PUBLIC,一旦創建將不能修改。?
?MINEXTENTS?必須大于等于2?
?PCTINCREASE必須是0?
?OPTIMAL如果要指定,必須大于等于回滾段的初始大小(由MINEXTENTS指定)?
建議:?
?一般情況下,INITIAL=NEXT?
?設置OPTIMAL參數來節約空間的使用?
?不要設置MAXEXTENTS為UNLIMITED?
?回滾段應創建在一個特定的回滾段表空間內?
例:?
CREATE ROLLBACK SEGMENT rbs01?
?TABLESPACE rbs?
?STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10?
?MAXEXTENTS 500 OPTIMAL 1000K);?
使回滾段在線?
當回滾段創建后,回滾段是離線的,不能被數據庫使用,為了使回滾段被事務利用,必須將回滾段在線。可以用以下命令使回滾段在線:?
ALTER ROLLBACK SEGMENT rollback_segment ONLINE;?
例:?
ALTER ROLLBACK SEGMENT rbs01 ONLINE;?
為了使回滾段在數據庫啟動時自動在線,可以在數據庫的參數文件中列出回滾段的名字。例如在參數文件中加入以下一行:?
ROLLBACK_SEGMENT=(rbs01,rbs02)?
修改回滾段的存儲參數?
可以使用ALTER ROLLBACK SEGMENT命令修改回滾段的存儲參數(包括OPTIMAL,MAXEXTENTS)。?
語法:?
ALTER ROLLBACK SEGMENT rollback_segment?
[STORAGE ([NEXT integer[K|M]]?
?[MINEXTENTS integer]?
?[MAXEXTENTS {integer|UNLIMITED}]?
?[OPTIMAL {integer[K|M]|NULL}]) ]?
例:?
ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);?
回收回滾段的空間?
如果指定了回滾段的OPTIMAL參數,ORACLE將自動回收回滾段到OPTIMAL指定的位置。用戶也可以手動回收回滾段的空間。?
語法:?
ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];?
說明:?
?如果不指明TO integer的數值,ORACLE將試圖回收到OPTIMAL的位置。?
例:?
ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;?
使回滾段離線?
為了達到以下兩個目的將要回滾段離線:?
1.阻止新的事務使用該回滾段;?
2.該回滾段必須刪除。?
語法:?
?ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;?
例:?
?ALTER ROLLBACK SEGMENT rbs01 OFFLINE;?
說明:?
?如果有事務正在使用該回滾段,運行該命令后,回滾段的狀態將是PENDING OFFLINE。事務結束后,狀態將改為OFFLINE,可以通過V$ROLLSTAT查詢回滾段的狀態。?
刪除回滾段?
當回滾段不再需要或要重建以改變INITIAL,NEXT或MINEXTENTS參數時,可以將其刪除。要刪除回滾段,不許使該回滾段離線。?
語法:?
DROP ROLLBACK SEGMENT rollback_segment;?
例:?
DROP ROLLBACK SEGMENT rbs01;?
查詢回滾段的信息?
所用數據字典:DBA_ROLLBACK_SEGS
| Column | Datatype | NULL | Description |
| SEGMENT_NAME | VARCHAR2(30) | NOT NULL | Name of the rollback segment |
| OWNER | VARCHAR2(6) | ? | Owner of the rollback segment |
| TABLESPACE_NAME | VARCHAR2(30) | NOT NULL | Name of the tablespace containing the rollback segment |
| SEGMENT_ID | NUMBER | NOT NULL | ID number of the rollback segment |
| FILE_ID | NUMBER | NOT NULL | File identifier number of the file containing the segment head |
| BLOCK_ID | NUMBER | NOT NULL | ID number of the block containing the segment header |
| INITIAL_EXTENT | NUMBER | ? | Initial extent size in bytes |
| NEXT_EXTENT | NUMBER | ? | Secondary extent size in bytes |
| MIN_EXTENTS | NUMBER | NOT NULL | Minimum number of extents |
| MAX_EXTENTS | NUMBER | NOT NULL | Maximum number of extent |
| PCT_INCREASE | NUMBER | NOT NULL | Percent increase for extent size |
| STATUS | VARCHAR2(16) | ? | Rollback segment status |
| INSTANCE_NUM | VARCHAR2(40) | ? | Rollback segment owning Oracle Real Application Cluster instance number |
| RELATIVE_FNO | NUMBER | NOT NULL | Relative file number of the segment header |
可以查詢的信息:回滾段的標識(SEGMENT_ID)、名稱(SEGMENT_NAME)、所在表空間(TABLESPACE_NAME)、類型(OWNER)、狀態(STATUS)。?
例:?
SQL>SELECT segment_name,tablespace_name,owner,status FROM dba_rollback_segs;?
回滾段的統計信息?
數據字典:V$ROLLNAME,V$ROLLSTAT
| Column | Datatype | Description |
| USN | NUMBER | Rollback segment number |
| LATCH | NUMBER | Latch for the rollback segment |
| EXTENTS | NUMBER | Number of extents in the rollback segment |
| RSSIZE | NUMBER | Size (in bytes) of the rollback segment. This value differs by the number of bytes in one database block from the value of the BYTES column of the ALL/DBA/USER_SEGMENTS views. See Also:?Oracle9i Database Administrator's Guide. |
| WRITES | NUMBER | Number of bytes written to the rollback segment |
| XACTS | NUMBER | Number of active transactions |
| GETS | NUMBER | Number of header gets |
| WAITS | NUMBER | Number of header waits |
| OPTSIZE | NUMBER | Optimal size of the rollback segment |
| HWMSIZE | NUMBER | High water mark of rollback segment size |
| SHRINKS | NUMBER | Number of times the size of a rollback segment decreases |
| WRAPS | NUMBER | Number of times rollback segment is wrapped |
| EXTENDS | NUMBER | Number of times rollback segment size is extended |
| AVESHRINK | NUMBER | Average shrink size |
| AVEACTIVE | NUMBER | Current size of active extents, averaged over time. |
| STATUS | VARCHAR2(15) | Rollback segment status:
|
| CUREXT | NUMBER | Current extent |
| CURBLK | NUMBER | Current block |
例:?
SQL>SELECT n.name,s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.status?
FROM v$rollname n,v$rollstat s?
WHERE n.usn=s.usn;?
?數據字典:v$undostat
V$undostat動態字典給出一個系統工作的統計柱狀圖。統計內容包括花費空間,事務數量和實例的執行時間長度等信息。DBA可以使用這個視圖中的統計信息估計需要的回滾段空間數量。如果回滾段是處于手工管理狀態,則這個視圖中沒有數據。
系統將會間隔10分鐘搜集一次統計信息并保存到動態視圖v$undostat中,結果按照begin_time字段降序排列。視圖最多保存1008條數據記錄,保留7天的循環數據。
| Column | Datatype | Description |
| BEGIN_TIME | DATE | Identifies the beginning of the time interval |
| END_TIME | DATE | Identifies the end of the time interval |
| UNDOTSN | NUMBER | Represents the last active undo tablespace in the duration of time. The tablespace ID of the active undo tablespace is returned in this column. If more than one undo tablespace was active in that period, the active undo tablespace that was active at the end of the period is reported. |
| UNDOBLKS | NUMBER | Represents the total number of undo blocks consumed. You can use this column to obtain the consumption rate of undo blocks, and thereby estimate the size of the undo tablespace needed to handle the workload on your system. |
| TXNCOUNT | NUMBER | Identifies the total number of transactions executed within the period |
| MAXQUERYLEN | NUMBER | Identifies the length of the longest query (in number of seconds) executed in the instance during the period. You can use this statistic to estimate the proper setting of the UNDO_RETENTION initialization parameter. |
| MAXCONCURRENCY | NUMBER | Identifies the highest number of transactions executed concurrently within the period |
| UNXPSTEALCNT | NUMBER | Number of attempts to obtain undo space by stealing unexpired extents from other transactions |
| UNXPBLKRELCNT | NUMBER | Number of unexpired blocks removed from certain undo segments so they can be used by other transactions |
| UNXPBLKREUCNT | NUMBER | Number of unexpired undo blocks reused by transactions |
| EXPSTEALCNT | NUMBER | Number of attempts to steal expired undo blocks from other undo segments |
| EXPBLKRELCNT | NUMBER | Number of expired undo blocks stolen from other undo segments |
| EXPBLKREUCNT | NUMBER | Number of expired undo blocks reused within the same undo segments |
| SSOLDERRCNT | NUMBER | Identifies the number of times the error ORA-01555 occurred. You can use this statistic to decide whether or not the UNDO_RETENTION initialization parameter is set properly given the size of the undo tablespace. Increasing the value of UNDO_RETENTION can reduce the occurrence of this error. |
| NOSPACEERRCNT | NUMBER | Identifies the number of times space was requested in the undo tablespace and there was no free space available. That is, all of the space in the undo tablespace was in use by active transactions. The corrective action is to add more space to the undo tablespace. |
?
回滾段的當前活動事務?
數據字典:V$SESSION,V$TRANSACTION?
例:?
SQL>SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk?
FROM v$session s,v$transaction t?
WHERE s.saddr=t.ses_addr;?
?USERNAME XIDUSN ?UBAFIL ?UBABLK USED_UBLK?
?------- -------- ----------- ----------- -----------?
?SYSTEM 2 2 ?7 1?
?SCOTT ?1 2 163 1?
?2 rows selected.?
?
回滾段的數量規劃?
對于OLTP系統,存在大量的小事務處理,一般建議:?
數量多的小回滾段;每四個事務一個回滾段;每個回滾段不要超過十個事務。?
對于批處理,一般建議:?
少的大回滾段;每個事務一個回滾段。?
回滾段的問題及解決方法?
問題一:事務要求的回滾段空間不夠,表現為表空間用滿(ORA-01560錯誤),回滾段擴展到達參數MAXEXTENTS的值(ORA-01628)。?
解決方法:向回滾段表空間添加文件或使已有的文件變大;增加MAXEXTENTS的值。?
問題二:讀一致性錯誤(ORA-01555 SNAPSHOT TOO OLD)?
解決方法:增加MINEXTENTS的值,增加區的大小,設置一個高的OPTIMAL值。
?
?
?
?
?
?
Oracle回滾段表空間文件丟失損壞的處理
如果檢測到丟失或者損壞回滾段表空間的數據文件,并且數據庫時運行著的,不要把它down掉,在很多情況下,數據庫open時比shutdown時更容易解決問題。
這種情況下有兩種可能的解決方法:
A)??????????????使丟失的那個文件offline,并從備份中恢復它,這種情況適用于數據庫是處于歸檔方式的。
B)???????????????另外一個方法是offline掉所有的那個文件所屬表空間的回滾段,drop那個表空間,然后create它們。這時需要殺掉那些使用著回滾段的進程,以便使他offline。
方法1
從備份中恢復那個數據文件
1,??脫機(offline?那個丟失的數據文件)
Alter database datafile 8 offline;
???提示:基于目前數據庫的事務量,你可能需要建一個臨時的回滾段空間和一些臨時的回滾段以備正常業務運行。
2、從備份中恢復(restore)那個數據文件
3、執行如下命令
Select v1.group#,member,sequence# from v$log v1, v$logfile v2
Where v1.group# = v2.group#;
這將列出所有的聯機重做日志和他們的序號及首次改變號(first change numbers)。
4、使用聯機日志及歸檔日志恢復那個文件
Recover datafile
5、確認所有的日志都被恢復,直到你收到“media recovery complete”信息。
6、使這個數據文件online
Alter database datafile online;
方法2
重建回滾段空間,這種方法不必考慮數據庫是否是歸檔模式的
步驟如下:
1?、試圖脫機所有的丟失或損壞數據文件所在回滾表空間中所包含的回滾段。
| ALTER ROLLBACK SEGMENT OFFLINE; |
重復執行這個命令直到所包含的回滾段都脫機?.
2?、檢查回滾段的狀態。
在?drop?掉它們之前它們必需是?offline?狀態的。
| SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS? |
3?、刪除掉所有脫機的?c?。
| DROP ROLLBACK SEGMENT ; |
4?、處理那些保持?online?狀態的回滾段
重復執行?2?一下的命令,如果回滾段在執行?1?中命令仍保扭虧為盈?"ONLINE"?狀態,意味著它之中有活動的事務,你可以用如下的查詢來確認一下:
| SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS? |
如果這個查詢沒有結果返回,意味著沒有事務在這些回滾段中了。哪果有結果返回,那些不能offline?的回滾段的狀態應為?"PENDING OFFLINE"?。可以用?5?中的方法把這些事務殺掉。
5?、強制使有活動事務的回滾段脫機
執行如下查詢,看這些?"PENDING OFFLINE"?的回滾段包含哪些事務。
| SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK" |
用?ALTER SYSTEM KILL SESSION , ;?語句殺掉這些事務,重復執行上面的查詢,直到沒有事務存在,這時運行一下?2中的查詢,確認這些回滾段己經處于?offline?狀態?,?并用?3?中的語句把它們?drop?掉。
6?、刪除這個回滾表空間。
| DROP TABLESPACE INCLUDING CONTENTS; |
如果語句執行失敗,請與?oracle?技術支持聯系,否則轉向?7
7?、重建回滾段表空間。
8?、重建回滾段,并使它們聯機?(online)?。
譯者按:回滾段表空間的數據文件丟失或損壞在實際中是比較棘手和常見的,產生這種問題?的原回很多的,比如介質的損壞、人為的誤操作、機器的突然的斷電等等。
建議沒實踐過這種操作的?oracle?的愛好者可以模擬一下這種故障,實際實測一下,注意一定要在測試庫,我模擬的方法如下:
1?、單獨建了一個?rbs?表空間,并在這個表空間建了一個回滾段?rbs_test?。
2?、指定一個?transaction?用這個回滾段
| sql>set transaction use rollback segment rbs_test;? |
3?、另開一個?telnet?窗口?telnet?至主機,執行如下命令?:
| sqlplus /nolog? |
4?、把新加的那個回滾段表空間的數據文件更個名。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
我用system用戶在sql下輸入alter ? rollback ? segment ? rbs01 ? shrink ? to ? 100M;
?
1.查看表空間???
? ??
? select ? tablespace_name,sum(bytes)/1024/1024/1024 ? GB ??
? from ? dba_data_files ? group ? by ? tablespace_name ??
? union ? all ??
? select ? tablespace_name,sum(bytes)/1024/1024/1024 ? GB ??
? from ? dba_temp_files ? group ? by ? tablespace_name ? order ? by ? GB; ??
? ??
? ??
? 2.確認文件???
? ??
? select ? file_name,bytes/1024/1024 ? from ? dba_data_files ??
? where ? tablespace_name ? like ? 'UNDOTBS1'; ??
? ??
? ??
? 3.檢查UNDO ? Segment狀態???
? ??
? select ? usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks ??
? from ? v$rollstat ? order ? by ? rssize; ??
? ??
? ??
? 4.創建新的UNDO表空間???
? ??
? create ? undo ? tablespace ? undotbs2 ? DATAFILE ? '/home/oracle/oradata/oracle/undotbs02.dbf' ? size ? 1024m ? AUTOEXTEND ? ON ? MAXSIZE ? 2048M; ??
? ??
? ??
? 5.切換UNDO表空間為新的UNDO表空間???
? ??
? alter ? system ? set ? undo_tablespace=undotbs2 ? scope=both; ??
? ??
? ??
? 6.等待原UNDO表空間所有UNDO ? SEGMENT ? OFFLINE ? ??
? ??
? select ? usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks ??
? from ? v$rollstat ? order ? by ? rssize; ??
? ??
? ??
? 7.刪除原UNDO表空間???
? ??
? drop ? tablespace ? undotbs1 ? including ? contents; ?
總結
以上是生活随笔為你收集整理的深入解析oracle回滚段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AIX系统Memory性能评估
- 下一篇: 一个回滚段收缩的实例