深入解析oracle回滚段
深入解析oracle的回滾段
日前在整理數(shù)據(jù)庫表空間的是否,發(fā)現(xiàn)最大的數(shù)據(jù)文件來自回滾段。回滾段文件undotbs1的數(shù)據(jù)文件已經(jīng)達(dá)到23G。
希望清理這部分?jǐn)?shù)據(jù),但一時(shí)又無從下手。于是決定深入了解一下這部分內(nèi)容。
法和規(guī)劃及問題的解決。?
回滾段概述?
回滾段用于存放數(shù)據(jù)修改之前的值(包括數(shù)據(jù)修改之前的位置和值)。回滾段的頭部包含正在使用的該回滾段事務(wù)的信息。一個(gè)事務(wù)只能使用一個(gè)回滾段來存放它的回滾信息,而一個(gè)回滾段可以存放多個(gè)事務(wù)的回滾信息。?
回滾段的作用?
事務(wù)回滾:當(dāng)事務(wù)修改表中數(shù)據(jù)的時(shí)候,該數(shù)據(jù)修改前的值(即前影像)會存放在回滾段中,當(dāng)用戶回滾事務(wù)(ROLLBACK)時(shí),ORACLE將會利用回滾段中的數(shù)據(jù)前影像來將修改的數(shù)據(jù)恢復(fù)到原來的值。?
事務(wù)恢復(fù):當(dāng)事務(wù)正在處理的時(shí)候,例程失敗,回滾段的信息保存在重做日志文件中,ORACLE將在下次打開數(shù)據(jù)庫時(shí)利用回滾來恢復(fù)未提交的數(shù)據(jù)。?
讀一致性:當(dāng)一個(gè)會話正在修改數(shù)據(jù)時(shí),其他的會話將看不到該會話未提交的修改。而且,當(dāng)一個(gè)語句正在執(zhí)行時(shí),該語句將看不到從該語句開始執(zhí)行后的未提交的修改(語句級讀一致性)。當(dāng)ORACLE執(zhí)行SELECT語句時(shí),ORACLE依照當(dāng)前的系統(tǒng)改變號(SYSTEM CHANGE NUMBER-SCN)來保證任何前于當(dāng)前SCN的未提交的改變不被該語句處理。可以想象:當(dāng)一個(gè)長時(shí)間的查詢正在執(zhí)行時(shí),若其他會話改變了該查詢要查詢的某個(gè)數(shù)據(jù)塊,ORACLE將利用回滾段的數(shù)據(jù)前影像來構(gòu)造一個(gè)讀一致性視圖。?
事務(wù)級的讀一致性?
ORACLE一般提供SQL語句級(SQL STATEMENT LEVEL)的讀一致性,可以用以下語句來實(shí)現(xiàn)事務(wù)級的讀一致性。?
SET TRANSACTION READ ONLY;?
或:?
SET TANNSACTION SERIALIZABLE;?
以上兩個(gè)語句都將在事務(wù)開始后提供讀一致性。需要注意的是,使用第二個(gè)語句對數(shù)據(jù)庫的并發(fā)性和性能將帶來影響。?
回滾段的種類?
系統(tǒng)回滾段:當(dāng)數(shù)據(jù)庫創(chuàng)建后,將自動創(chuàng)建一個(gè)系統(tǒng)回滾段,該回滾段只用于存放系統(tǒng)表空間中對象的前影像。?
非系統(tǒng)回滾段:擁有多個(gè)表空間的數(shù)據(jù)庫至少應(yīng)該有一個(gè)非系統(tǒng)回滾段,用于存放非系統(tǒng)表空間中對象的數(shù)據(jù)前影像。非系統(tǒng)回滾段又分為私有回滾段和公有回滾段,私有回滾段應(yīng)在參數(shù)文件的ROLLBACK SEGMENTS參數(shù)中列出,以便例程啟動時(shí)自動使其在線(ONLINE)。公有回滾段一般在OPS(ORACLE并行服務(wù)器)中出現(xiàn),將在例程啟動時(shí)自動在線。?
DEFERED回滾段:該回滾段在表空間離線(OFFLINE)時(shí)由系統(tǒng)自動創(chuàng)建,當(dāng)表空間再次在線(ONLINE)時(shí)由系統(tǒng)自動刪除,用于存放表空間離線時(shí)產(chǎn)生的回滾信息。
自9i之后,回滾段默認(rèn)設(shè)置由數(shù)據(jù)庫自行管理,這大大降低了DBA的維護(hù)成本,一般不需要進(jìn)行回滾段的創(chuàng)建,修改和刪除工作了,只要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
查詢結(jié)果說明,系統(tǒng)先創(chuàng)建了一個(gè)系統(tǒng)回滾段(system專用),然后又創(chuàng)建了幾個(gè)公用(public)回滾段。
回滾段的使用?
分配回滾段:當(dāng)事務(wù)開始時(shí),ORACLE將為該事務(wù)分配回滾段,并將擁有最少事務(wù)的回滾段分配給該事務(wù)。事務(wù)可以用以下語句申請指定的回滾段:?
SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
事務(wù)將以順序,循環(huán)的方式使用回滾段的區(qū)(EXTENTS),當(dāng)當(dāng)前區(qū)用滿后移到下一個(gè)區(qū)。幾個(gè)事務(wù)可以寫在回滾段的同一個(gè)區(qū),但每個(gè)回滾段的塊只能包含一個(gè)事務(wù)的信息。?
例如(兩個(gè)事務(wù)使用同一個(gè)回滾段,該回滾段有四個(gè)區(qū)):?
1、事務(wù)在進(jìn)行中,它們正在使用回滾段的第三個(gè)區(qū);?
2、當(dāng)兩個(gè)事務(wù)產(chǎn)生更多的回滾信息,它們將繼續(xù)使用第三個(gè)區(qū);?
3、當(dāng)?shù)谌齻€(gè)區(qū)滿后,事務(wù)將寫到第四個(gè)區(qū),當(dāng)事務(wù)開始寫到一個(gè)新的區(qū)時(shí),稱為翻轉(zhuǎn)(WRAP);?
4、當(dāng)?shù)谒膫€(gè)區(qū)用滿時(shí),如果第一個(gè)區(qū)是空閑或非活動(使用該區(qū)的所有事務(wù)完成而沒有活動的事務(wù))的,事務(wù)將接著使用第一個(gè)區(qū)。?
回滾段的擴(kuò)張(EXTEND)?
當(dāng)當(dāng)前回滾段區(qū)的所有塊用完而事務(wù)還需要更多的回滾空間時(shí),回滾段的指針將移到下一個(gè)區(qū)。當(dāng)最后一個(gè)區(qū)用完,指針將移到第一個(gè)區(qū)的前面。回滾段指針移到下一個(gè)區(qū)的前提是下一個(gè)區(qū)沒有活動的事務(wù),同時(shí)指針不能跨區(qū)。當(dāng)下一個(gè)區(qū)正在使用時(shí),事務(wù)將為回滾段分配一個(gè)新的區(qū),這種分配稱為回滾段的擴(kuò)展。回滾段將一直擴(kuò)展到該回滾段區(qū)的個(gè)數(shù)到達(dá)回滾段的參數(shù)MAXEXTENTS的值時(shí)為止。?
回滾段的回收和OPTIMAL參數(shù)?
OPTIMAL參數(shù)指明回滾段空閑時(shí)收縮到的位置,指明回滾段的OPTIMAL參數(shù)可以減少回滾段空間的浪費(fèi)。?
創(chuàng)建回滾段?
語法:?
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}]) ]?
注:?
?回滾段可以在創(chuàng)建時(shí)指明PRIVATE或PUBLIC,一旦創(chuàng)建將不能修改。?
?MINEXTENTS?必須大于等于2?
?PCTINCREASE必須是0?
?OPTIMAL如果要指定,必須大于等于回滾段的初始大小(由MINEXTENTS指定)?
建議:?
?一般情況下,INITIAL=NEXT?
?設(shè)置OPTIMAL參數(shù)來節(jié)約空間的使用?
?不要設(shè)置MAXEXTENTS為UNLIMITED?
?回滾段應(yīng)創(chuàng)建在一個(gè)特定的回滾段表空間內(nèi)?
例:?
CREATE ROLLBACK SEGMENT rbs01?
?TABLESPACE rbs?
?STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10?
?MAXEXTENTS 500 OPTIMAL 1000K);?
使回滾段在線?
當(dāng)回滾段創(chuàng)建后,回滾段是離線的,不能被數(shù)據(jù)庫使用,為了使回滾段被事務(wù)利用,必須將回滾段在線。可以用以下命令使回滾段在線:?
ALTER ROLLBACK SEGMENT rollback_segment ONLINE;?
例:?
ALTER ROLLBACK SEGMENT rbs01 ONLINE;?
為了使回滾段在數(shù)據(jù)庫啟動時(shí)自動在線,可以在數(shù)據(jù)庫的參數(shù)文件中列出回滾段的名字。例如在參數(shù)文件中加入以下一行:?
ROLLBACK_SEGMENT=(rbs01,rbs02)?
修改回滾段的存儲參數(shù)?
可以使用ALTER ROLLBACK SEGMENT命令修改回滾段的存儲參數(shù)(包括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參數(shù),ORACLE將自動回收回滾段到OPTIMAL指定的位置。用戶也可以手動回收回滾段的空間。?
語法:?
ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];?
說明:?
?如果不指明TO integer的數(shù)值,ORACLE將試圖回收到OPTIMAL的位置。?
例:?
ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;?
使回滾段離線?
為了達(dá)到以下兩個(gè)目的將要回滾段離線:?
1.阻止新的事務(wù)使用該回滾段;?
2.該回滾段必須刪除。?
語法:?
?ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;?
例:?
?ALTER ROLLBACK SEGMENT rbs01 OFFLINE;?
說明:?
?如果有事務(wù)正在使用該回滾段,運(yùn)行該命令后,回滾段的狀態(tài)將是PENDING OFFLINE。事務(wù)結(jié)束后,狀態(tài)將改為OFFLINE,可以通過V$ROLLSTAT查詢回滾段的狀態(tài)。?
刪除回滾段?
當(dāng)回滾段不再需要或要重建以改變INITIAL,NEXT或MINEXTENTS參數(shù)時(shí),可以將其刪除。要刪除回滾段,不許使該回滾段離線。?
語法:?
DROP ROLLBACK SEGMENT rollback_segment;?
例:?
DROP ROLLBACK SEGMENT rbs01;?
查詢回滾段的信息?
所用數(shù)據(jù)字典: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 |
可以查詢的信息:回滾段的標(biāo)識(SEGMENT_ID)、名稱(SEGMENT_NAME)、所在表空間(TABLESPACE_NAME)、類型(OWNER)、狀態(tài)(STATUS)。?
例:?
SQL>SELECT segment_name,tablespace_name,owner,status FROM dba_rollback_segs;?
回滾段的統(tǒng)計(jì)信息?
數(shù)據(jù)字典: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;?
?數(shù)據(jù)字典:v$undostat
V$undostat動態(tài)字典給出一個(gè)系統(tǒng)工作的統(tǒng)計(jì)柱狀圖。統(tǒng)計(jì)內(nèi)容包括花費(fèi)空間,事務(wù)數(shù)量和實(shí)例的執(zhí)行時(shí)間長度等信息。DBA可以使用這個(gè)視圖中的統(tǒng)計(jì)信息估計(jì)需要的回滾段空間數(shù)量。如果回滾段是處于手工管理狀態(tài),則這個(gè)視圖中沒有數(shù)據(jù)。
系統(tǒng)將會間隔10分鐘搜集一次統(tǒng)計(jì)信息并保存到動態(tài)視圖v$undostat中,結(jié)果按照begin_time字段降序排列。視圖最多保存1008條數(shù)據(jù)記錄,保留7天的循環(huán)數(shù)據(jù)。
| 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. |
?
回滾段的當(dāng)前活動事務(wù)?
數(shù)據(jù)字典: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.?
?
回滾段的數(shù)量規(guī)劃?
對于OLTP系統(tǒng),存在大量的小事務(wù)處理,一般建議:?
數(shù)量多的小回滾段;每四個(gè)事務(wù)一個(gè)回滾段;每個(gè)回滾段不要超過十個(gè)事務(wù)。?
對于批處理,一般建議:?
少的大回滾段;每個(gè)事務(wù)一個(gè)回滾段。?
回滾段的問題及解決方法?
問題一:事務(wù)要求的回滾段空間不夠,表現(xiàn)為表空間用滿(ORA-01560錯(cuò)誤),回滾段擴(kuò)展到達(dá)參數(shù)MAXEXTENTS的值(ORA-01628)。?
解決方法:向回滾段表空間添加文件或使已有的文件變大;增加MAXEXTENTS的值。?
問題二:讀一致性錯(cuò)誤(ORA-01555 SNAPSHOT TOO OLD)?
解決方法:增加MINEXTENTS的值,增加區(qū)的大小,設(shè)置一個(gè)高的OPTIMAL值。
?
?
?
?
?
?
Oracle回滾段表空間文件丟失損壞的處理
如果檢測到丟失或者損壞回滾段表空間的數(shù)據(jù)文件,并且數(shù)據(jù)庫時(shí)運(yùn)行著的,不要把它down掉,在很多情況下,數(shù)據(jù)庫open時(shí)比shutdown時(shí)更容易解決問題。
這種情況下有兩種可能的解決方法:
A)??????????????使丟失的那個(gè)文件offline,并從備份中恢復(fù)它,這種情況適用于數(shù)據(jù)庫是處于歸檔方式的。
B)???????????????另外一個(gè)方法是offline掉所有的那個(gè)文件所屬表空間的回滾段,drop那個(gè)表空間,然后create它們。這時(shí)需要?dú)⒌裟切┦褂弥貪L段的進(jìn)程,以便使他offline。
方法1
從備份中恢復(fù)那個(gè)數(shù)據(jù)文件
1,??脫機(jī)(offline?那個(gè)丟失的數(shù)據(jù)文件)
Alter database datafile 8 offline;
???提示:基于目前數(shù)據(jù)庫的事務(wù)量,你可能需要建一個(gè)臨時(shí)的回滾段空間和一些臨時(shí)的回滾段以備正常業(yè)務(wù)運(yùn)行。
2、從備份中恢復(fù)(restore)那個(gè)數(shù)據(jù)文件
3、執(zhí)行如下命令
Select v1.group#,member,sequence# from v$log v1, v$logfile v2
Where v1.group# = v2.group#;
這將列出所有的聯(lián)機(jī)重做日志和他們的序號及首次改變號(first change numbers)。
4、使用聯(lián)機(jī)日志及歸檔日志恢復(fù)那個(gè)文件
Recover datafile
5、確認(rèn)所有的日志都被恢復(fù),直到你收到“media recovery complete”信息。
6、使這個(gè)數(shù)據(jù)文件online
Alter database datafile online;
方法2
重建回滾段空間,這種方法不必考慮數(shù)據(jù)庫是否是歸檔模式的
步驟如下:
1?、試圖脫機(jī)所有的丟失或損壞數(shù)據(jù)文件所在回滾表空間中所包含的回滾段。
| ALTER ROLLBACK SEGMENT OFFLINE; |
重復(fù)執(zhí)行這個(gè)命令直到所包含的回滾段都脫機(jī)?.
2?、檢查回滾段的狀態(tài)。
在?drop?掉它們之前它們必需是?offline?狀態(tài)的。
| SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS? |
3?、刪除掉所有脫機(jī)的?c?。
| DROP ROLLBACK SEGMENT ; |
4?、處理那些保持?online?狀態(tài)的回滾段
重復(fù)執(zhí)行?2?一下的命令,如果回滾段在執(zhí)行?1?中命令仍保扭虧為盈?"ONLINE"?狀態(tài),意味著它之中有活動的事務(wù),你可以用如下的查詢來確認(rèn)一下:
| SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS? |
如果這個(gè)查詢沒有結(jié)果返回,意味著沒有事務(wù)在這些回滾段中了。哪果有結(jié)果返回,那些不能offline?的回滾段的狀態(tài)應(yīng)為?"PENDING OFFLINE"?。可以用?5?中的方法把這些事務(wù)殺掉。
5?、強(qiáng)制使有活動事務(wù)的回滾段脫機(jī)
執(zhí)行如下查詢,看這些?"PENDING OFFLINE"?的回滾段包含哪些事務(wù)。
| SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK" |
用?ALTER SYSTEM KILL SESSION , ;?語句殺掉這些事務(wù),重復(fù)執(zhí)行上面的查詢,直到?jīng)]有事務(wù)存在,這時(shí)運(yùn)行一下?2中的查詢,確認(rèn)這些回滾段己經(jīng)處于?offline?狀態(tài)?,?并用?3?中的語句把它們?drop?掉。
6?、刪除這個(gè)回滾表空間。
| DROP TABLESPACE INCLUDING CONTENTS; |
如果語句執(zhí)行失敗,請與?oracle?技術(shù)支持聯(lián)系,否則轉(zhuǎn)向?7
7?、重建回滾段表空間。
8?、重建回滾段,并使它們聯(lián)機(jī)?(online)?。
譯者按:回滾段表空間的數(shù)據(jù)文件丟失或損壞在實(shí)際中是比較棘手和常見的,產(chǎn)生這種問題?的原回很多的,比如介質(zhì)的損壞、人為的誤操作、機(jī)器的突然的斷電等等。
建議沒實(shí)踐過這種操作的?oracle?的愛好者可以模擬一下這種故障,實(shí)際實(shí)測一下,注意一定要在測試庫,我模擬的方法如下:
1?、單獨(dú)建了一個(gè)?rbs?表空間,并在這個(gè)表空間建了一個(gè)回滾段?rbs_test?。
2?、指定一個(gè)?transaction?用這個(gè)回滾段
| sql>set transaction use rollback segment rbs_test;? |
3?、另開一個(gè)?telnet?窗口?telnet?至主機(jī),執(zhí)行如下命令?:
| sqlplus /nolog? |
4?、把新加的那個(gè)回滾段表空間的數(shù)據(jù)文件更個(gè)名。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
我用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.確認(rèn)文件???
? ??
? select ? file_name,bytes/1024/1024 ? from ? dba_data_files ??
? where ? tablespace_name ? like ? 'UNDOTBS1'; ??
? ??
? ??
? 3.檢查UNDO ? Segment狀態(tài)???
? ??
? select ? usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks ??
? from ? v$rollstat ? order ? by ? rssize; ??
? ??
? ??
? 4.創(chuàng)建新的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; ?
總結(jié)
以上是生活随笔為你收集整理的深入解析oracle回滚段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AIX系统Memory性能评估
- 下一篇: 一个回滚段收缩的实例