日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Oracle-UNDO表空间解读

發(fā)布時(shí)間:2025/3/21 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle-UNDO表空间解读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • UNDO概述
  • UNDO數(shù)據(jù)的作用
    • 1,回退事務(wù)
    • 2,讀一致性
    • 3,事務(wù)恢復(fù)
    • 4,閃回查詢(xún)(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 表空間滿(mǎn)時(shí)的處理方法
    • 模擬 UNDO 表空間滿(mǎn)的情況
    • 解決辦法
      • 增加數(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ù)變化.

比如:

用戶(hù)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,讀一致性

用戶(hù)檢索數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),oracle 總是讓用戶(hù)只能看到被提交過(guò)的數(shù)據(jù)(讀取提交)或特定時(shí)間點(diǎn)的數(shù)據(jù)(SELECT語(yǔ)句時(shí)間點(diǎn)).這樣可以確保數(shù)據(jù)的一致性.

比如:

當(dāng)用戶(hù)A執(zhí)行語(yǔ)句 UPDATE emp SET sal=1000 WHERE empno=7788時(shí),UNDO記錄會(huì)被存放到回滾段中,而新數(shù)據(jù)則會(huì)存放到EMP段中;假定此時(shí)該數(shù)據(jù)尚未提交,并且用戶(hù)B執(zhí)行SELECT sal FROM emp WHERE empno=7788,此時(shí)用戶(hù)B將取得UNDO數(shù)據(jù) 800,而該數(shù)據(jù)正是在UNDO記錄中取得的.

會(huì)話(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ì)話(huà)B(在這里我們通過(guò)新開(kāi)一個(gè)SQL窗口來(lái)模擬) ,如果還是繼續(xù)使用會(huì)話(huà)A,則查詢(xún)的仍是1000.

SQL> SELECT sal FROM emp WHERE empno=7369;SAL ---------800.00

3,事務(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,閃回查詢(xún)(FlashBack Query)

倒敘查詢(xún)用于取得特定時(shí)間點(diǎn)的數(shù)據(jù)庫(kù)數(shù)據(jù), 它是9i新增加的特性,假定當(dāng)前時(shí)間為上午09:00,某用戶(hù)在上午10:00執(zhí)行UPDATE emp SET sal= 1000 WHERE empno=7369語(yǔ)句,修改并提交了事務(wù)(雇員原工資為800),為了取得10:00之前的雇員工資,用戶(hù)可以使用倒敘查詢(xún)特征.

Oracle10g閃回查詢(xún)特性的增強(qiáng)

Oracle 9i的閃回查詢(xún)只能提供某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)視圖,并不能告訴用戶(hù)這樣的數(shù)據(jù)經(jīng)過(guò)了幾個(gè)事務(wù)、怎樣的修改(UPDATE、INSERT、DELETE等),而這些信息在回滾段中是存在的,在Oracle10g中,Oracle進(jìn)一步加強(qiáng)了閃回查詢(xún)的特性,提供了以下兩種閃回查詢(xún):

  • 閃回版本查詢(xún)(Flashback Versions Query)
  • 閃回事務(wù)查詢(xún)(Flashback Transaction Query)

閃回版本查詢(xún)?cè)试S使用一個(gè)新的VERSIONS子句查詢(xún)兩個(gè)時(shí)間點(diǎn)或者SCN之間的數(shù)據(jù)版本。這些版本可以按照事務(wù)區(qū)分,閃回版本查詢(xún)只返回提交數(shù)據(jù),未提交數(shù)據(jù)不被顯示。

Oracle10g的閃回版本查詢(xún)通過(guò)使用VERSIONS子句和對(duì)數(shù)據(jù)表引入一系列的偽列(version_starttime等),可以獲得對(duì)數(shù)據(jù)表的所有事務(wù)操作,versions_operation代表不同類(lèi)型的操作(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ò)以上查詢(xún),根據(jù)versions_xid可以清晰地區(qū)分不同事務(wù)在不同時(shí)間對(duì)數(shù)據(jù)所作的更改。

由于這個(gè)查詢(xún)需要從Undo中獲取前鏡像信息,如果Undo中的信息被覆蓋,則以上查詢(xún)將會(huì)失敗。

數(shù)據(jù)恢復(fù)栗子

用戶(hù)更新了或者誤刪除了一批數(shù)據(jù)(假設(shè)數(shù)據(jù)量很大),

下面用一條數(shù)據(jù)做演示:7369工號(hào)的原始工資為800 ,更新后工資為1000

UPDATE emp SET sal=1000 WHERE empno=7369;

此時(shí)用戶(hù)想恢復(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; --查詢(xún)當(dāng)前數(shù)據(jù)庫(kù)的SCN

2.將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.查詢(xún)執(zhí)行時(shí)間太長(zhǎng)。首先是優(yōu)化查詢(xún),然后考慮在數(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 和 vrollstatvrollname 兩個(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ě)滿(mǎn), 則新事務(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ú)法訪(fǎng)問(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)有被覆蓋就可以使用。

  • 如果空間已滿(mǎn),新事務(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)整撤銷(xiāo)信息最短保留時(shí)間為該時(shí)段最長(zhǎng)查詢(xún)時(shí)間(MAXQUERYLEN)加上300秒或參數(shù)UNDO_RETENTION間的較大者,即MAX((MAXQUERYLEN+300),UNDO_RENTION);

在自動(dòng)調(diào)整啟用的情況下,實(shí)際的撤銷(xiāo)信息最短保留時(shí)間可以通過(guò)查詢(xún)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列不再更新,且撤銷(xiāo)信息最短保留時(shí)間固定為參數(shù)UNDO_RETENTION的設(shè)定值。該參數(shù)可以不用重啟數(shù)據(jù)庫(kù)而動(dòng)態(tài)設(shè)置生效。

UNDO自動(dòng)優(yōu)化功能能夠最大限度的使用undo表空間,滿(mǎn)足大部分的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列不再更新,且撤銷(xiāo)信息最短保留時(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ù)字典

數(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 表空間滿(mǎn)時(shí)的處理方法

默認(rèn)情況下的 Undo_retention 只有 15 分鐘,這個(gè)默認(rèn)值,一般都無(wú)法滿(mǎn)足
系統(tǒng)的需求。 一般建議是改成 3 個(gè)小時(shí), 這樣給萬(wàn)一的情況,多爭(zhēng)取一些時(shí)間。

SQL> alter system set undo_retention=10800; -- 3 個(gè)小時(shí) 系統(tǒng)已更改。

當(dāng)然, undo_retention 設(shè)置的越大,所需要的 undo tablespace 也就越大。 這個(gè)需要結(jié)合自己的系統(tǒng)來(lái)設(shè)置這個(gè)參數(shù)。


模擬 UNDO 表空間滿(mǎn)的情況

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/dbsOralce動(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)

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M; SQL> alter system set undo_tablespace=undotbs1; SQL> drop tablespace undotbs;

( 4)修改 pfile,創(chuàng)建 spfile,并正常啟動(dòng)

刪除:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

總結(jié)

以上是生活随笔為你收集整理的Oracle-UNDO表空间解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。