云貝教育 |【技術(shù)文章】undo_retention的具體意義
作者:劉曉峰
原文鏈接:http://www.tdpub.cn/Blog/detail/id/1355.html
關(guān)于UNDO_RETENTION的解釋
1.首先查詢當(dāng)前環(huán)境的值
結(jié)果是15分鐘
2.在我們執(zhí)行一些命令前,我們執(zhí)行一下查詢,看看當(dāng)前undo信息
3.現(xiàn)在我們執(zhí)行一行INSERT,寫入1m數(shù)據(jù),然后不做rollback或者commit
接著查詢
可以看到,所謂的活躍ACTIVE的UNDO,就是待commit或者rollback的UNDO信息。這部分UNDO是不能重用覆蓋的
4.修改UNDO_RETENTION
然后查詢狀態(tài)
發(fā)現(xiàn)未過期和過期的UNDO大小沒有發(fā)生變化,與我期望的結(jié)果不一致
這里直接給出結(jié)論,
被commit或者rollback的回滾段,會(huì)被標(biāo)記為未過期(UNEXPIRED ),
未過期的數(shù)據(jù),超過UNDO_RETENTION指定的時(shí)間,則被標(biāo)記為過期(EXPIRED)
重用的順序是過期,然后是未過期,因?yàn)槲业膗ndo max空間是2g,且不可擴(kuò)展,如果沒有可用的undo,則數(shù)據(jù)庫會(huì)報(bào)錯(cuò)
5.跟蹤當(dāng)前undosize,提交后再跟蹤
可以看到active已經(jīng)變成了未過期的undo,不過我們期望等待1秒后,UNEXPIRED會(huì)變成EXPIRED,這里未出現(xiàn)
先復(fù)原參數(shù)
6.解釋GUARANTEED RETENTION
前面我們說過,UNDO_RETENTION口頭承諾,900秒內(nèi)不會(huì)把當(dāng)前undo的清理優(yōu)先級(jí)升高,所以一旦undo不夠
就會(huì)覆蓋未過期的undo,使用GUARANTEED RETENTION,保證不重用未過期的undo(疑問點(diǎn),保證不重用,又沒有可用空間,會(huì)怎么樣)
我當(dāng)前是no guarantee retention
7.解釋快照過舊問題
在1:00的時(shí)候,我執(zhí)行了select,而1:01有人修改了數(shù)據(jù),那么我就要去undo里面查詢,如果我的查詢時(shí)間很長
導(dǎo)致查詢所在的undo被重用了,則報(bào)錯(cuò)ora-01555,因?yàn)檎也坏絬ndo了,無法進(jìn)行一致性查詢
怎么解決呢,增加UNDO_RETENTION,并指定UNDO_RETENTION盡量超過你的長時(shí)查詢,同時(shí)還要保證undo段大小盡量較大
不過既然核心是長時(shí)查詢,所以你應(yīng)該首先優(yōu)化你的sql代碼
8.undo動(dòng)態(tài)視圖
如果有unxpstealcnt不為0的數(shù)據(jù),請(qǐng)?jiān)黾覩UARANTEED RETENTION
如果有ssolderrcnt不為0的數(shù)據(jù),請(qǐng)?jiān)黾觰ndo尺寸,或者設(shè)置自動(dòng)擴(kuò)展(風(fēng)險(xiǎn)就是undo會(huì)非常大,占據(jù)非常多的磁盤空間)
9.繼續(xù)分析UNDO_RETENTION
修改隱藏參數(shù)_undo_autotune 仍然不能實(shí)現(xiàn)
10.總結(jié)
UNDO RETENTION 標(biāo)記過了多久,非過期的undo變成過期的undo,但是這兩種undo都有可能被重寫,因?yàn)閡ndo一般大小固定,新undo覆寫舊undo