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

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

生活随笔

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

编程问答

oracle undo

發(fā)布時(shí)間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle undo 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

UNDO表空間用于存放UNDO數(shù)據(jù),當(dāng)執(zhí)行DML操作(INSERT,UPDATE和DELETE)時(shí),oracle會(huì)將這些操作執(zhí)行前的舊數(shù)據(jù) 寫(xiě)入到 UNDO段,在oracle9i之前,管理UNDO數(shù)據(jù)時(shí)使用(Rollback Segment)完成的.從oracle9i開(kāi)始,管理UNDO數(shù)據(jù)不僅可以使用回滾段,還可以使用UNDO表空間.因?yàn)橐?guī)劃和管理回滾段比較復(fù)雜,所有 oracle database 10g已經(jīng)完全丟棄用回滾段.并且使用UNDO表空間來(lái)管理UNDO數(shù)據(jù).

在網(wǎng)上找到相關(guān)的描述,大致內(nèi)容如下:

回滾段可 以說(shuō)是用來(lái)保持?jǐn)?shù)據(jù)變化前映象而提供一致讀和保障事務(wù)完整性的一段磁盤(pán)存儲(chǔ)區(qū)域。當(dāng)一個(gè)事務(wù)開(kāi)始的時(shí)候,會(huì)首 先把變化前的數(shù)據(jù)和變化后的數(shù)據(jù)先寫(xiě)入日志緩沖區(qū),然后把變化前的數(shù)據(jù)寫(xiě)入回滾段,最后才在數(shù)據(jù)緩沖區(qū)中修改(日志緩沖區(qū)內(nèi)容在滿(mǎn)足一定的條件后可能被寫(xiě) 入磁盤(pán),但在事務(wù)提交的時(shí)候日志必須寫(xiě)入磁盤(pán),而數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)依賴(lài)于檢查點(diǎn)的發(fā)生和DBWR進(jìn)程的活動(dòng)) Rollback是一個(gè)代價(jià)昂貴的操作,如果一個(gè)系統(tǒng)的事務(wù)回退率過(guò)高,應(yīng)該檢查系統(tǒng)是否正常或者程序設(shè)計(jì)思路是否存在問(wèn)題。查詢(xún)數(shù)據(jù)庫(kù)啟動(dòng)依賴(lài)的 事務(wù)回退率,如果發(fā)現(xiàn)太高,一定要引起重視。 --查詢(xún)回退率的sql SELECT NAME, VALUE FROM v$sysstat WHERE NAME IN ('user commits', 'transaction rollbacks'); 關(guān)于回滾段的數(shù)據(jù),如果是delete操作,則回滾段將回記錄整個(gè)行的數(shù)據(jù);如果是update,則只記錄被修改了的字段的變化前的數(shù)據(jù)(前映像);如果 是insert,則只記錄插入記錄的rowid。所以,假如commit,那么回滾段中簡(jiǎn)單標(biāo)記該事務(wù)已經(jīng)提交;假如rollback,則操作是 delete的話(huà),把回滾段中的數(shù)據(jù)重新寫(xiě)回?cái)?shù)據(jù)塊,操作是update的話(huà)則把變化前的數(shù)據(jù)修改回去,操作是insert的話(huà)則根據(jù)rowid把該記錄 刪除。這個(gè)過(guò)程是保障事務(wù)的完整性,保障數(shù)據(jù)不會(huì)丟失。 一致性讀(consisitent reads) Oralce的查詢(xún)集是根據(jù)時(shí)間點(diǎn)來(lái)判定的。Oracle內(nèi)部通過(guò)系統(tǒng)改變號(hào)SC作為相對(duì)時(shí)間點(diǎn)的標(biāo)準(zhǔn),任何對(duì)數(shù)據(jù)庫(kù)的改變都會(huì)產(chǎn)生SCN,對(duì)數(shù)據(jù)塊的數(shù) 據(jù)改變的時(shí)候會(huì)把該改變所對(duì)應(yīng)的SCN記錄在塊中。假設(shè)查詢(xún)開(kāi)始的時(shí)候SCN為T(mén),則在查詢(xún)所掃描的數(shù)據(jù)塊中,如果數(shù)據(jù)塊的COMMIT SCN小魚(yú)T,則查詢(xún)接受該數(shù)據(jù),如果COMMIT SCN大于T或者說(shuō)還沒(méi)有產(chǎn)生COMMIT SCN,則查詢(xún)會(huì)嘗試去回滾段中查找數(shù)據(jù)。這保證了數(shù)據(jù)的讀取時(shí)間點(diǎn)的一致性。 在通過(guò)回滾段中獲取數(shù)據(jù)的時(shí)候,本質(zhì)上是把數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊做一個(gè)拷貝,然后將回滾段中記錄的內(nèi)容恢復(fù)到該塊中,然后查詢(xún)使用這個(gè)塊來(lái)進(jìn)行讀取。 系統(tǒng)回滾段和延遲回滾段 SYSTEM回滾段是創(chuàng)建在系統(tǒng)表空間中,主要用于系統(tǒng)級(jí)的事務(wù)和分配普通事務(wù)于其他回滾段上。當(dāng)手工創(chuàng)建數(shù)據(jù)后需要?jiǎng)?chuàng)建普通回滾段之前必須首先創(chuàng) 建系統(tǒng)回滾段。按oracle文檔說(shuō),當(dāng)普通事務(wù)異常多的事情可能會(huì)使用系統(tǒng)回滾段的情況。正常情況下,系統(tǒng)回滾段主要用于兩個(gè)方面:一是系統(tǒng)事務(wù),不如 針對(duì)數(shù)據(jù)字典的操作的truncate table 和 drop table。如果truncate or drop table的過(guò)程中沒(méi)有成果,則系統(tǒng)會(huì)根據(jù)系統(tǒng)回滾段中的數(shù)據(jù)字典操作信息對(duì)該DDL操作進(jìn)行回退。另一個(gè)方面,就是延遲回滾段(Deferred Rollback Segment)。延遲回滾段表示,當(dāng)我們使一個(gè)表空間OFFLINE之后,由于表空間不可用,這個(gè)時(shí)候若有事務(wù)數(shù)據(jù)位于該空間并執(zhí)行回滾命令,在 client看起來(lái)該事務(wù)已經(jīng)回滾,但對(duì)于數(shù)據(jù)塊來(lái)說(shuō)回滾并沒(méi)有真正完成,這個(gè)時(shí)候數(shù)據(jù)庫(kù)將該回滾信息寫(xiě)入系統(tǒng)回滾段(這就是延遲回滾段),等表空間重新 ONLINE的時(shí)候,數(shù)據(jù)塊從系統(tǒng)回滾段中將回滾信息寫(xiě)入表空間。 回退段的設(shè)置和管理 Oracle9i之前需要手動(dòng)設(shè)置回退段,我們需要考慮如下問(wèn)題: 1.系統(tǒng)并發(fā)事務(wù)數(shù)有多少 2.系統(tǒng)是否存在大查詢(xún)或者大事務(wù),是否頻繁 3.能提供給系統(tǒng)回滾段的表空間的磁盤(pán)空間是多少 9i的UNDO TABLESPACE 從9i開(kāi)始,推薦使用UNDO TABLESPACE,系統(tǒng)自動(dòng)管理回滾段 Sql> show parameter undo undo_management?????????????????????? string??? AUTO undo_retention??????????????????????? integer?? 900 undo_tablespace?????????????????????? string??? UNDOTBS1 UNDO TABLESPACE變的很大,我們不能縮小,這個(gè)時(shí)候我們需要考慮創(chuàng)建新的UNDO TABLESPACE,然后換到新的表空間。這時(shí)即使UNDO表空間有事務(wù)也可以切換,只不過(guò)不能立即刪除該表空間,切換之后等到原來(lái)的表空間中所有的事 務(wù)出力完畢,并且達(dá)到undo_retention的時(shí)間后,就可以drop原來(lái)的UNDO表空間。 SQL> alter system set undo_tablespace = undotbs02; System altered. 切換了UNDO表空間后應(yīng)該修改pfile或者spfile,使得下次啟動(dòng)應(yīng)用新的UNDO表空間。 回滾段著名的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 scripts 查詢(xún)數(shù)據(jù)塊當(dāng)前某個(gè)session的事務(wù)所使用的回滾段大小 SELECT b.SID, a.xidusn, a.xidusn FROM v$transaction a, v$session b WHERE a.addr = b.taddr 回滾段表空間中的一個(gè)數(shù)據(jù)文件丟失或者損害的恢復(fù)方法 ……………. 由于對(duì)應(yīng)的undo block/或者undo header slot信息被覆蓋,導(dǎo)致consistent read不能完成, 系統(tǒng)會(huì)報(bào)出ora-01555的錯(cuò)誤信息.. 出現(xiàn)這種情況的原因可能有以下幾種. 1. 對(duì)于早期的manual undo, 可能是由于系統(tǒng)設(shè)置了optimal size, rollback segment wrap 導(dǎo)致部分undo信息被丟棄.. 2. 由于undo retention 設(shè)置的時(shí)間小于sql執(zhí)行的長(zhǎng)度,這樣從這條sql開(kāi)始時(shí)候其他session產(chǎn)生的部分undo由于retention的原因被覆蓋,導(dǎo)致無(wú)法完成 consistent read. 3. 由于commit over fetch loop. 導(dǎo)致transaction slot 被覆蓋,無(wú)法完成consistent read .. ORA-01555錯(cuò)誤淺析-- http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm 總結(jié)出以下方法來(lái)解決1555錯(cuò)誤問(wèn)題: 1、擴(kuò)大回滾段 因?yàn)榛貪L段是循環(huán)使用的,如果回滾段足夠大,那么那些被提交的數(shù)據(jù)信息就能保存足夠長(zhǎng)的時(shí)間是那些大事務(wù)完成一致性讀取。 2、增加undo_retention時(shí)間 在undo_retention規(guī)定的時(shí)間內(nèi),任何其他事務(wù)都不能覆蓋這些數(shù)據(jù)。 3、優(yōu)化相關(guān)查詢(xún)語(yǔ)句,減少一致性讀。 減少查詢(xún)語(yǔ)句的一致性讀,就降低讀取不到回滾段數(shù)據(jù)的風(fēng)險(xiǎn)。這一點(diǎn)非常重要! 4、減少不必要的事務(wù)提交 提交的事務(wù)越少,產(chǎn)生的回滾段信息就越少。 5、對(duì)大事務(wù)指定回滾段 通過(guò)以下語(yǔ)句可以指定事務(wù)的回滾段:

SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment;

給 大事務(wù)指定回滾段,即降低大事務(wù)回滾信息覆蓋其他事務(wù)的回滾信息的幾率,又降低了他自身的回滾信息被覆蓋的幾率。大事務(wù)的存在,往往是1555錯(cuò)誤產(chǎn)生的 誘因。 6、使用游標(biāo)時(shí)盡量使用顯式游標(biāo),并且只在需要的時(shí)候打開(kāi)游標(biāo),同時(shí)將所有可以在游標(biāo)外做的操作從游標(biāo)循環(huán)中拿出。 當(dāng)游標(biāo)打開(kāi)時(shí),查詢(xún)就開(kāi)始了,直到游標(biāo)關(guān)閉。減少游標(biāo)的打開(kāi)時(shí)間,就減少了1555錯(cuò)誤發(fā)生的幾率。

轉(zhuǎn)載于:https://blog.51cto.com/itlaowu/959721

總結(jié)

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

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