Oracle-UNDO表空间解读
文章目錄
- UNDO概述
- UNDO數(shù)據(jù)的作用
- 1,回退事務(wù)
- 2,讀一致性
- 3,事務(wù)恢復(fù)
- 4,閃回查詢(FlashBack Query)
- 數(shù)據(jù)恢復(fù)栗子
- 回滾段著名的ORA-01555問(wèn)題
- Undo 表空間的兩種管理方式
- 使用 rollback segment
- 使用 Undo 表空間
- undo_retention 和 retention guarantee 參數(shù)
- 調(diào)優(yōu)原則
- 相關(guān)數(shù)據(jù)字典
- undo 表空間滿時(shí)的處理方法
- 模擬 UNDO 表空間滿的情況
- 解決辦法
- 增加數(shù)據(jù)文件
- 切換 UNDO 表空間
- undo 表空間損壞的處理方法
- 方法一: 使用 system segment
- 方法二: 跳過(guò)損壞的 segment
UNDO概述
官方文檔Managing Undo Tablespaces
UNDO 表空間用于存放UNDO數(shù)據(jù),當(dāng)執(zhí)行DML操作(INSERT,UPDATE和DELETE)時(shí),oracle會(huì)將這些操作的舊數(shù)據(jù)寫(xiě)入到UNDO段。
在 oracle9i之前,管理UNDO數(shù)據(jù)時(shí)使用(Rollback Segment)完成的.從oracle9i開(kāi)始,管理UNDO數(shù)據(jù)不僅可以使用回滾段,還可以使用UNDO表空間。
10g開(kāi)始貌似已經(jīng)不在使用Rollback Segment來(lái)管理UNDO數(shù)據(jù)了,統(tǒng)一使用UNDO表空間。
UNDO數(shù)據(jù)的作用
1,回退事務(wù)
當(dāng)執(zhí)行DML操作修改數(shù)據(jù)時(shí),UNDO數(shù)據(jù)被存放到UNDO段,而新數(shù)據(jù)則被存放到數(shù)據(jù)段中,如果事務(wù)操作存在問(wèn)題,舊需要回退事務(wù),以取消事務(wù)變化.
比如:
用戶A執(zhí)行了語(yǔ)句UPDATE emp SET sal=9999 WHERE empno=7788后發(fā)現(xiàn),應(yīng)該修改雇員7963的工資,而不是雇員7788的工資,那么通過(guò)執(zhí)行ROLLBACK語(yǔ)句可以取消事務(wù)變化.
>update emp a set a.sal=9999 where a.empno=7788; >rollback;當(dāng)執(zhí)行ROLLBACK命令時(shí),oracle會(huì)將UNDO段的UNDO數(shù)據(jù)800寫(xiě)回的數(shù)據(jù)段中.
2,讀一致性
用戶檢索數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),oracle 總是讓用戶只能看到被提交過(guò)的數(shù)據(jù)(讀取提交)或特定時(shí)間點(diǎn)的數(shù)據(jù)(SELECT語(yǔ)句時(shí)間點(diǎn)).這樣可以確保數(shù)據(jù)的一致性.
比如:
當(dāng)用戶A執(zhí)行語(yǔ)句 UPDATE emp SET sal=1000 WHERE empno=7788時(shí),UNDO記錄會(huì)被存放到回滾段中,而新數(shù)據(jù)則會(huì)存放到EMP段中;假定此時(shí)該數(shù)據(jù)尚未提交,并且用戶B執(zhí)行SELECT sal FROM emp WHERE empno=7788,此時(shí)用戶B將取得UNDO數(shù)據(jù) 800,而該數(shù)據(jù)正是在UNDO記錄中取得的.
會(huì)話A:
SQL> SELECT sal FROM emp WHERE empno=7369;SAL ---------800.00SQL> UPDATE emp SET sal=1000 WHERE empno=7369;1 row updatedSQL>會(huì)話B(在這里我們通過(guò)新開(kāi)一個(gè)SQL窗口來(lái)模擬) ,如果還是繼續(xù)使用會(huì)話A,則查詢的仍是1000.
SQL> SELECT sal FROM emp WHERE empno=7369;SAL ---------800.003,事務(wù)恢復(fù)
事務(wù)恢復(fù)是例程恢復(fù)的一部分,它是由oracle server自動(dòng)完成的.
如果在數(shù)據(jù)庫(kù)運(yùn)行過(guò)程中出現(xiàn)例程失敗(如斷電,內(nèi)存故障,后臺(tái)進(jìn)程故障等),那么當(dāng)重啟oracle server時(shí),后臺(tái)進(jìn)程SMON會(huì)自動(dòng)執(zhí)行例程恢復(fù),執(zhí)行例程恢復(fù)時(shí),oracl會(huì)重新做所有未應(yīng)用的記錄.回退未提交事務(wù).
4,閃回查詢(FlashBack Query)
倒敘查詢用于取得特定時(shí)間點(diǎn)的數(shù)據(jù)庫(kù)數(shù)據(jù), 它是9i新增加的特性,假定當(dāng)前時(shí)間為上午09:00,某用戶在上午10:00執(zhí)行UPDATE emp SET sal= 1000 WHERE empno=7369語(yǔ)句,修改并提交了事務(wù)(雇員原工資為800),為了取得10:00之前的雇員工資,用戶可以使用倒敘查詢特征.
Oracle10g閃回查詢特性的增強(qiáng)
Oracle 9i的閃回查詢只能提供某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)視圖,并不能告訴用戶這樣的數(shù)據(jù)經(jīng)過(guò)了幾個(gè)事務(wù)、怎樣的修改(UPDATE、INSERT、DELETE等),而這些信息在回滾段中是存在的,在Oracle10g中,Oracle進(jìn)一步加強(qiáng)了閃回查詢的特性,提供了以下兩種閃回查詢:
- 閃回版本查詢(Flashback Versions Query)
- 閃回事務(wù)查詢(Flashback Transaction Query)
閃回版本查詢?cè)试S使用一個(gè)新的VERSIONS子句查詢兩個(gè)時(shí)間點(diǎn)或者SCN之間的數(shù)據(jù)版本。這些版本可以按照事務(wù)區(qū)分,閃回版本查詢只返回提交數(shù)據(jù),未提交數(shù)據(jù)不被顯示。
Oracle10g的閃回版本查詢通過(guò)使用VERSIONS子句和對(duì)數(shù)據(jù)表引入一系列的偽列(version_starttime等),可以獲得對(duì)數(shù)據(jù)表的所有事務(wù)操作,versions_operation代表不同類型的操作(D-DELETE、I_INSERT、U_UPDATE),VERSIONS_XID是一個(gè)重要依據(jù),代表了不同版本的事務(wù)ID。
Select versions_starttime,versions_endtime,versions_xid,versions_operation,字段xx From table_name versions between timestamp minvalue and maxvalue;通過(guò)以上查詢,根據(jù)versions_xid可以清晰地區(qū)分不同事務(wù)在不同時(shí)間對(duì)數(shù)據(jù)所作的更改。
由于這個(gè)查詢需要從Undo中獲取前鏡像信息,如果Undo中的信息被覆蓋,則以上查詢將會(huì)失敗。
數(shù)據(jù)恢復(fù)栗子
用戶更新了或者誤刪除了一批數(shù)據(jù)(假設(shè)數(shù)據(jù)量很大),
下面用一條數(shù)據(jù)做演示:7369工號(hào)的原始工資為800 ,更新后工資為1000
UPDATE emp SET sal=1000 WHERE empno=7369;此時(shí)用戶想恢復(fù),假設(shè)刪除的時(shí)間點(diǎn)是2016-11-13 09:00:00 之后,那么我們找到9點(diǎn)之前的 SCN(System Change Number 系統(tǒng)改變號(hào)) .
SCN提供了Oracle的內(nèi)部時(shí)鐘機(jī)制,可被看作邏輯時(shí)鐘,這對(duì)于恢復(fù)操作是至關(guān)重要的.
1.獲得當(dāng)前SCN
select timestamp_to_scn(to_timestamp('2016-11-13 09:00:00','YYYY-MM-DD HH24:MI:SS')) as scn from dual ; select dbms_flashback.get_system_change_number scn from dual; --查詢當(dāng)前數(shù)據(jù)庫(kù)的SCN2.將emp表中的scn點(diǎn)的數(shù)據(jù)取出
select * from emp AS OF SCN 13267939370491;可以看到這個(gè)時(shí)間點(diǎn)之前的數(shù)據(jù) 7369是800.
3.然后可以根據(jù)這個(gè)數(shù)據(jù)進(jìn)行還原操作
insert into emp select * from emp AS OF SCN 13267939370491;回滾段著名的ORA-01555問(wèn)題
從應(yīng)用角度來(lái)看ORA-01555
-
1.查詢執(zhí)行時(shí)間太長(zhǎng)。首先是優(yōu)化查詢,然后考慮在數(shù)據(jù)塊不繁忙的時(shí)候運(yùn)行,最后考慮加大回滾段。
-
2.過(guò)渡頻繁的提交。把能夠成批提交的單條事務(wù)改成成批提交
-
3.exp的時(shí)候使用而來(lái)consistent = y. 這個(gè)參數(shù)主要是為了保證在exp的時(shí)候使得所有的到處的表在時(shí)間點(diǎn)上具有一致性,避免存在主外鍵關(guān)系的表由于不同的時(shí)間點(diǎn)的不一致而破壞了數(shù)據(jù)的完整性。建議該操作在系統(tǒng)空閑的時(shí)候進(jìn)行。
-
4.由于回滾段回縮導(dǎo)致回滾段還沒(méi)有循環(huán)使用的情況下就出現(xiàn)了回滾段中找不著數(shù)據(jù)的情況。只能加大回滾段增大optimal設(shè)置。
Undo 表空間的兩種管理方式
Oracle 的 Undo 有兩種方式: 一是使用 undo 表空間,二是使用回滾段.
我們通過(guò) undo_management 參數(shù)來(lái)控制使用哪種方式,
如果設(shè)為 auto, 就使用 UNDO 表空間,這時(shí)必須要指定一個(gè) UNDO 表空間。
如果設(shè)為 manual,系統(tǒng)啟動(dòng)后使用 rollback segment 方式存儲(chǔ) undo 信息。
SQL> show parameter undoNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1SQL>Undo配置參數(shù)含義
-
UNDO_MANAGEMENT undo的管理模式,分自動(dòng)和手動(dòng)
-
UNDO_TABLESPACE 當(dāng)前正在被使用的undo表
-
UNDO_RETENTION 規(guī)定多長(zhǎng)時(shí)間內(nèi),數(shù)據(jù)不能被覆蓋。
-
AUTO 表示undo 為自動(dòng)管理模式。
-
900 表示在900秒內(nèi),undo上的數(shù)據(jù)不能被覆蓋。
-
UNDOTBS1 是當(dāng)前正在使用的undo表空間
如果系統(tǒng)沒(méi)有指定 undo_management,那么系統(tǒng)默認(rèn)以 manual 方式啟動(dòng),即使設(shè)置了 auto 方式的參數(shù),這些參數(shù)將被忽略。
當(dāng)實(shí)例啟動(dòng)的時(shí)候,系統(tǒng)自動(dòng)選擇第一個(gè)有效的 undo 表空間或者是 rollback
segment, 如果沒(méi)有有效的可用的 undo 表空間或者是回滾段,系統(tǒng)使用 system rollback segment。這種情況是不被推薦的,當(dāng)系統(tǒng)運(yùn)行在沒(méi)有 undo 的情況下,系統(tǒng)會(huì)在 alert.log 中記錄一條警告信息。
使用 rollback segment
當(dāng) undo_management 被設(shè)置成 MENUAL 時(shí)使用系統(tǒng)回滾段, 即將 undo records 記錄到 SYSTEM 表空間下的 SYSTEM 段。
select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';通過(guò)上面的這條語(yǔ)句,我們查到了這個(gè)用于 rollback 的 system segment 存在
與 system 表空間。 默認(rèn)情況下,只有一個(gè) segment,并且它還比較小, 所以,如果使用 system 段來(lái)存儲(chǔ) undo records,肯定會(huì)影響數(shù)據(jù)庫(kù)的性能。 所以 Oracle是建議使用 Undo tablespace 來(lái)管理 undo records。
使用 Undo 表空間
當(dāng) undo_management 設(shè)置成 AUTO 時(shí)使用 UNDO tablespace 來(lái)管理回滾段這個(gè)時(shí)候,我們將有多個(gè) undo segment,并且這些 segment 是存放在 UNDO 表空間里的, 這樣對(duì) DB 的性能就會(huì)提高。
select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='TYPE2 UNDO';目前我們的這個(gè)數(shù)據(jù)庫(kù)已經(jīng)有58個(gè)undo segment了。默認(rèn)的好像是10個(gè)。
除了通過(guò)dba_segment 表查看的結(jié)果, 也可以通過(guò) vrollstat和vrollstat 和 vrollstat和vrollname 兩個(gè)視圖來(lái)查看信息, 這 2 個(gè)視圖會(huì)顯示所有 rollback 段的信息,包括 system 段和 undo 段。
select s.usn,n.name,s.extents,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn;undo_retention 和 retention guarantee 參數(shù)
使用如下SQL 來(lái)查看 undo 表空間里空閑和非空閑比例:
SELECT tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)" FROM dba_undo_extentsGROUP BY tablespace_name, status;UNEXPIRED 和 EXPIRED 是已使用的 undo 表空間,
其中 expired 說(shuō)明是已經(jīng)過(guò)期的數(shù)據(jù),也就是 15 分鐘(默認(rèn)情況)以外的數(shù)據(jù),已經(jīng)被覆蓋, 可以認(rèn)為是空閑的。
在這里就關(guān)系到一個(gè)參數(shù): UNDO_RETENTION, 該參數(shù)用來(lái)指定 undo 記錄保存的最長(zhǎng)時(shí)間,以秒為單位,是個(gè)動(dòng)態(tài)參數(shù),完全可以在實(shí)例運(yùn)行時(shí)隨時(shí)修改,通常默認(rèn)是 900 秒,也就是 15 分鐘。
如下所示:
SQL> show parameter undoNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1SQL>undo_retention 只是指定 undo 數(shù)據(jù)的過(guò)期時(shí)間,并不是說(shuō), undo 中的數(shù)據(jù)一定會(huì)在 undo 表空間中保存 15 分鐘,比如說(shuō)剛一個(gè)新事務(wù)開(kāi)始的時(shí)候,如果undo 表空間已經(jīng)被寫(xiě)滿, 則新事務(wù)的數(shù)據(jù)會(huì)自動(dòng)覆蓋已提交事務(wù)的數(shù)據(jù),而不管這些數(shù)據(jù)是否已過(guò)期,
因此呢,這就又關(guān)聯(lián)回了第一點(diǎn),當(dāng)你創(chuàng)建一個(gè)自動(dòng)管理的 undo 表空間時(shí),還要注意其空間大小,要盡可能保證 undo 表空間有足夠的存儲(chǔ)空間。
undo_retention 中指定的時(shí)間一過(guò),已經(jīng)提交事務(wù)中的數(shù)據(jù)就立刻無(wú)法訪問(wèn),它只是失效,只要不被別的事務(wù)覆蓋,它會(huì)仍然存在,并可隨時(shí)被 flashback 特性引用。
如果你的 undo 表空間足夠大,而數(shù)據(jù)庫(kù)又不是那么繁忙,那么其實(shí)undo_retention 參數(shù)的值并不會(huì)影響到你,哪怕你設(shè)置成 1,只要沒(méi)有事務(wù)去覆蓋 undo 數(shù)據(jù),它就會(huì)持續(xù)有效。 總之, 要注意 undo 表空間的大小,保證其有足夠的存儲(chǔ)空間。
只有在一種情況下, undo 表空間能夠確保 undo 中的數(shù)據(jù)在undo_retention指定時(shí)間過(guò)期前一定有效,就是為 undo 表空間指定 Retention Guarantee,指定之后, oracle 對(duì)于 undo 表空間中未過(guò)期的 undo 數(shù)據(jù)不會(huì)覆蓋.
例如:
SQL> Alter tablespace undotbs1 retention guarantee;禁止 undo 表空間 retention guarantee
總結(jié):
-
UNDO 表空間是會(huì)被重用的,只有當(dāng)事務(wù)沒(méi)結(jié)束,或開(kāi)了 retention guarantee, 或在 undo_retention時(shí)間內(nèi)不能被重用。
-
在 undo_retention 規(guī)定的時(shí)間內(nèi),數(shù)據(jù)都是有效的,過(guò)期后都會(huì)設(shè)為無(wú)效, 狀態(tài)被改為 Expired,這些回滾段將會(huì)被看作Free Space。但是只要數(shù)據(jù)沒(méi)有被覆蓋就可以使用。
-
如果空間已滿,新事務(wù)的數(shù)據(jù)會(huì)自動(dòng)覆蓋掉已經(jīng)提交的事務(wù)數(shù)據(jù),即使在 undo_retention 的時(shí)間內(nèi)。除非指定 Retention
Guarantee 模式,才能保證在 undo_retention 內(nèi)不被覆蓋。
調(diào)優(yōu)原則
關(guān)于oracle UNDO表空間自動(dòng)管理自動(dòng)調(diào)優(yōu)的原則介紹,在Oracle 10gr2后面的版本中添加了UNDO信息最短保留時(shí)間段自動(dòng)調(diào)優(yōu)的特性,不再僅僅依據(jù)參數(shù)UNDO_RETENTION的設(shè)定,其調(diào)優(yōu)原則如下:
1 當(dāng)UNDO TABLESPACE為 fixed-size,Oracle將根據(jù)表空間的大小和歷史使用情況,自動(dòng)調(diào)整undo信息保存時(shí)間,同時(shí)忽略 undo_retention的值除非 undo_retention的guarantee 特性被啟用。
2 當(dāng)UNDO TABLESPACE為AUM時(shí),Oracle將動(dòng)態(tài)調(diào)整撤銷信息最短保留時(shí)間為該時(shí)段最長(zhǎng)查詢時(shí)間(MAXQUERYLEN)加上300秒或參數(shù)UNDO_RETENTION間的較大者,即MAX((MAXQUERYLEN+300),UNDO_RENTION);
在自動(dòng)調(diào)整啟用的情況下,實(shí)際的撤銷信息最短保留時(shí)間可以通過(guò)查詢V$UNDOSTAT視圖上的TUNED_UNDORETENTION列獲得。往往最短保存時(shí)間遠(yuǎn)遠(yuǎn)大于設(shè)定的UNDO_RETENTION。在無(wú)法就UNDO TABLESPACE做相應(yīng)修改的情況,可以通過(guò)修改隱式參數(shù)”_UNDO_AUTOTUNE”為FALSE關(guān)閉該自動(dòng)調(diào)優(yōu)特性。以上設(shè)定生效后,V$UNDOSTAT視圖上TUNED_UNDORETENTION列不再更新,且撤銷信息最短保留時(shí)間固定為參數(shù)UNDO_RETENTION的設(shè)定值。該參數(shù)可以不用重啟數(shù)據(jù)庫(kù)而動(dòng)態(tài)設(shè)置生效。
UNDO自動(dòng)優(yōu)化功能能夠最大限度的使用undo表空間,滿足大部分的sql執(zhí)行,但是也帶來(lái)一個(gè)問(wèn)題:很多事務(wù)執(zhí)行完畢之后,發(fā)現(xiàn)UNDO表空間會(huì)在很長(zhǎng)時(shí)間都一直保持著使用率是接近100%的狀態(tài),active 狀態(tài)的很少。
這種接近狀態(tài)還無(wú)法手工的收縮,甚至于重啟數(shù)據(jù)庫(kù)實(shí)例也無(wú)法緩解,而此時(shí)常常會(huì)收到undo表空間的監(jiān)控報(bào)警。
可以通過(guò)修改隱式參數(shù)”_UNDO_AUTOTUNE”為FALSE關(guān)閉該自動(dòng)調(diào)優(yōu)特性。以上設(shè)定生效后,V$UNDOSTAT視圖上TUNED_UNDORETENTION列不再更新,且撤銷信息最短保留時(shí)間固定為參數(shù)UNDO_RETENTION的設(shè)定值。該參數(shù)可以不用重啟數(shù)據(jù)庫(kù)而動(dòng)態(tài)設(shè)置生效。
> alter system set "_undo_autotune"=false; System altered.禁用UNDO自動(dòng)優(yōu)化之后,Oracle不再的每十分鐘記錄一次當(dāng)前UNDO使用情況了,在動(dòng)態(tài)視圖V$UNDOSTAT中也只保留禁止undo自動(dòng)調(diào)優(yōu)之前的數(shù)據(jù) 。 .一般不建議關(guān)閉Oracle的自動(dòng)調(diào)優(yōu)
相關(guān)數(shù)據(jù)字典
| v$undostat | 包含所有undo表空間的統(tǒng)計(jì)信息,用于對(duì)undo表空間進(jìn)行監(jiān)控和調(diào)整。通過(guò)該視圖,可以估計(jì)當(dāng)前undo表空間的大小,Oracle利用該視圖完成對(duì)回退信息的自動(dòng)管理,該視圖數(shù)據(jù)是有最近4天內(nèi),每10分鐘產(chǎn)生一條統(tǒng)計(jì)記錄構(gòu)成的。 |
| v$rollstat | 包含undo表空間中回退段的性能統(tǒng)計(jì)信息 |
| v$transaction | 包含事務(wù)所使用的回退段信息 |
| dba_undo_extents | 包含undo表空間中區(qū)的大小與狀態(tài)信息 |
| dba_hist_undostat | 包含v$undostat的快照,主要是4天前的統(tǒng)計(jì)信息 |
undo表空間中區(qū)的狀態(tài)一共有3種:EXPIRED、UNEXPIRED、ACTIVE。
-
EXPIRED:表示該回退信息對(duì)應(yīng)的事務(wù)已經(jīng)提交,保存時(shí)間超過(guò)保留區(qū);
-
UNEXPIRED:表示該回退信息對(duì)應(yīng)的事務(wù)已經(jīng)提交,保存時(shí)間沒(méi)有超過(guò)保留區(qū);
-
ACTIVE:表示回退信息對(duì)應(yīng)的事務(wù)還沒(méi)有提交,該區(qū)還在使用;
undo 表空間滿時(shí)的處理方法
默認(rèn)情況下的 Undo_retention 只有 15 分鐘,這個(gè)默認(rèn)值,一般都無(wú)法滿足
系統(tǒng)的需求。 一般建議是改成 3 個(gè)小時(shí), 這樣給萬(wàn)一的情況,多爭(zhēng)取一些時(shí)間。
當(dāng)然, undo_retention 設(shè)置的越大,所需要的 undo tablespace 也就越大。 這個(gè)需要結(jié)合自己的系統(tǒng)來(lái)設(shè)置這個(gè)參數(shù)。
模擬 UNDO 表空間滿的情況
SQL> create undo tablespace undo datafile '/oradata/undo.dbf' size 1m; 表空間已創(chuàng)建。 SQL> alter tablespace undo retention guarantee; 表空間已更改。 SQL> alter system set undo_tablespace=undo; 系統(tǒng)已更改。 SQL> create table DBA(id number); 表已創(chuàng)建。 SQL> begin 2 for i in 1 .. 100000 loop 3 insert into dba values(i); 4 commit; 5 end loop; 6 end; 7 / begin * 第 1 行出現(xiàn)錯(cuò)誤: ORA-30036: 無(wú)法按 8 擴(kuò)展段 (在還原表空間 'UNDO' 中) ORA-06512: 在 line 3解決辦法
處理方法有兩種,
- 一是添加 undo 表空間的數(shù)據(jù)文件,
- 二是切換 UNDO tablespace. 這種情況下多用在 undo 表空間已經(jīng)非常大的情況。
增加數(shù)據(jù)文件
SQL> ALTER TABLESPACE undo ADD DATAFILE '/oradata/undo2.dbf' size 100M reuse; 表空間已更改。 SQL> begin 2 for i in 1..100000 loop 3 insert into dba values(1); 4 commit; 5 end loop; 6 end; 7 / PL/SQL 過(guò)程已成功完成。切換 UNDO 表空間
1、 建立新的表空間 UNDOTBS2
SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/oradata/und3.dbf' size 100M reuse; 表空間已創(chuàng)建。2、 切換到新建的 UNOD 表空間上來(lái),操作如下
SQL> alter system set undo_tablespace=UNDOTBS2 scope=both; 系統(tǒng)已更改。3、將原來(lái)的 UNDO 表空間,置為脫機(jī):
SQL> alter tablespace UNDO offline; 表空間已更改。4、刪除原來(lái)的 UNDO 表空間:
SQL> drop tablespace UNDO including contents AND DATAFILES CASCADE CONSTRAINTS ; 表空間已刪除。如果只是 drop tablespace UNDO ,則只會(huì)在刪除控制文件里的記錄,并不會(huì)物理刪除文件。
Drop undo 表空間的時(shí)候必須是在未使用的情況下才能進(jìn)行。如果 undo 表空間正在使用(例如事務(wù)失敗,但是還沒(méi)有恢復(fù)成功),那么 drop 表空間命令將失敗。在 drop 表空間的時(shí)候可以使用 including contents。
undo 表空間損壞的處理方法
出現(xiàn) undo 損壞的情況, 大多數(shù)是因?yàn)楫惓e礄C(jī),在啟動(dòng)的時(shí)候報(bào)的錯(cuò)誤,DB 不能啟動(dòng)。
比如: ORA-00600: internal error code, arguments: [4194]
當(dāng) alert log 里出現(xiàn) ORA-600 + [4194] 時(shí),基本就可以斷定,是 undo 表空間出現(xiàn)了損壞。 對(duì)于 Undo 損壞的情況,能用備份恢復(fù)最好,如果不能,就只能通過(guò)一些特殊的方法來(lái)恢復(fù)。
方法一: 使用 system segment
當(dāng)我們使用 undo 表空間出現(xiàn)損壞時(shí),可以先用 system segment 啟動(dòng) DB,
啟動(dòng)之后,在重新創(chuàng)建 UNDO 表空間,在用 undo 來(lái)啟動(dòng)。 步驟如下:
( 1) 用 spfile 創(chuàng)建 pfile,然后修改參數(shù):
#*.undo_tablespace='UNDOTBS1' #*.undo_management='AUTO' #*.undo_tablespace #*.undo_retention undo_management='MANUAL' rollback_segments='SYSTEM'如何通過(guò)SPFILE創(chuàng)建PFILE?
SQL> shutdown immediate 數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。 已經(jīng)卸載數(shù)據(jù)庫(kù)。 ORACLE 例程已經(jīng)關(guān)閉。 SQL> create pfile from spfile; 文件已創(chuàng)建。pfile文件-linux等平臺(tái)在ORACLEHOME/dbs下,Oralce在啟動(dòng)實(shí)例的時(shí)讀取‘ORACLE_HOME/dbs下, Oralce在啟動(dòng)實(shí)例的時(shí)讀取`ORACLEH?OME/dbs下,Oralce在啟動(dòng)實(shí)例的時(shí)讀取‘ORACLE_HOME/dbs`下面的初始化文件。
( 2)用修改之后的 pfile,重啟 DB
SQL> STARTUP MOUNT pfile='F:\initorcl.ora' ;( 3)刪除原來(lái)的表空間,創(chuàng)建新的 UNDO 表空間
SQL> drop tablespace undotbs; SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;( 4)關(guān)閉數(shù)據(jù)庫(kù),修改 pfile 參數(shù),然后用新的 pfile 創(chuàng)建 spfile,在正常啟動(dòng)數(shù)據(jù)庫(kù)。
*.undo_tablespace='UNDOTBS1' *.undo_management='AUTO' #undo_management='MANUAL' #rollback_segments='SYSTEM'創(chuàng)建SPFILE
SQL> CREATE SPFILE=$ORACLE_HOME/dbs/spfileSID.ora FROM PFILE $ORACLE_HOME/dbs/initSID.ora若都使用默認(rèn)的,則可簡(jiǎn)寫(xiě)為:
SQL> CREATE SPFILE FROM PFILE; SQL> show parameter spfileNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /oracle/product/112/dbs/spfilecc.ora方法二: 跳過(guò)損壞的 segment
在方法一里面,我們使用了 system segment。 通過(guò)前面的說(shuō)明, 我們了解到,undo segment 有多個(gè),我們可以通過(guò) alert log 來(lái)查看正在使用的是哪些 segment,這些段有可能損壞了。 我們只需要把這些損壞的 segment 跳過(guò),先正常啟動(dòng) DB,在創(chuàng)建新的 UNDO 表空間,在切換一下。
( 1)修改 pfile,添加參數(shù):
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'這些字段的值, 我們通過(guò) alert log 查看。 也可以通過(guò)如下命令查看:
#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u( 2)用修改之后的 pfile 啟動(dòng) DB
因?yàn)樘^(guò)了哪些損壞的 segment,所以 DB 可以正常啟動(dòng)。
( 3)創(chuàng)建新的 UNDO 表空間,并切換過(guò)來(lái)
( 4)修改 pfile,創(chuàng)建 spfile,并正常啟動(dòng)
刪除:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'總結(jié)
以上是生活随笔為你收集整理的Oracle-UNDO表空间解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle-SYSAUX表空间解读
- 下一篇: Oracle-数据字典解读