oracle事務(wù)怎么回滾 oracle回滾是什么意思

oracle中數(shù)據(jù)是怎樣前滾和回滾的

保持?jǐn)?shù)據(jù)一致性和完整性,是每一款成功商業(yè)數(shù)據(jù)庫軟件都必須要做到的基本要求。從故障中恢復(fù),保證ACID原則,保證事務(wù)完整性,一直是Oracle數(shù)據(jù)庫核心功能組成部分。本篇主要介紹Oracle實(shí)例意外終止(斷電或者強(qiáng)制關(guān)閉)之后,重新啟動時發(fā)生的恢復(fù)過程,也可以稱作“前滾和回滾”。

專注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)袁州免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

基礎(chǔ)知識說明

為了更明確的說明問題,筆者首先介紹一下本文涉及到的一些重要知識。

數(shù)據(jù)庫實(shí)例失敗

我們經(jīng)常說的數(shù)據(jù)庫服務(wù)器failure是有多層含義的。Oracle數(shù)據(jù)庫是一個由多進(jìn)程組件共同構(gòu)成的結(jié)構(gòu)體系。最重要的部分包括監(jiān)聽器、Oracle數(shù)據(jù)庫實(shí)例兩個部分,當(dāng)然還包括各類文件,更廣義的還有硬件和操作系統(tǒng)OS。不同部分的Failure現(xiàn)象和處理方法都有所不同。本文所闡述的過程是Oracle實(shí)例失敗后的自動恢復(fù)過程。

在實(shí)例失敗的時候,往往是突然性的終止。此時Oracle數(shù)據(jù)庫可能在進(jìn)行一系列完成或者未完成的事務(wù)。實(shí)例失敗恢復(fù),就是要將這些狀態(tài)進(jìn)行還原,恢復(fù)到數(shù)據(jù)完整性的狀態(tài)。

寫日志(RedoLog)在先機(jī)制

Oracle數(shù)據(jù)庫是采用“日志在先”機(jī)制的。當(dāng)我們對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行修改時,并不是立即將修改寫入到文件中,而是寫入到共享內(nèi)存SGA空間中的BufferCache里。同時,將修改的日志不斷的寫入到SGA中另一塊Log Buffer緩存中。有一個后臺進(jìn)程LGWR不斷的將LogBuffer緩存中的日志內(nèi)容寫入到online redo log文件中。

寫入LogBuffer緩存和LGWR寫入文件的過程是異步進(jìn)行的。那么LGWR會在哪些情況下將日志緩沖區(qū)(全部內(nèi)容)轉(zhuǎn)儲到日志文件呢?如下:--參考OCA認(rèn)證考試指南(1Z0-052,P40)ü 用戶進(jìn)行直接的commit操作;

ü RedoBuffer數(shù)據(jù)超過1/3;

ü DBWn啟動,將BufferCache中的臟數(shù)據(jù)寫入到文件中;ü 距離上次LGWR寫入操作超過三秒(三秒超時,DBWn每三秒鐘會對一些緩沖區(qū)清理一次,這個時候,剛好符合觸發(fā)LGWR的第三點(diǎn));而數(shù)據(jù)文件寫入進(jìn)程DBWn工作的觸發(fā)點(diǎn)(此處注意:DBWn會將高速緩沖區(qū)的臟緩沖區(qū),即臟數(shù)據(jù)塊寫入數(shù)據(jù)文件,而不是緩沖區(qū)里頭的全部內(nèi)容---參考OCA認(rèn)證考試指南(1Z0-052,P38))。

因為考慮到磁盤I/O會降低性能,DBWn采用的是極懶算法執(zhí)行寫入。如果對于經(jīng)常變臟的緩沖區(qū),即這邊緩沖區(qū)處于十分忙碌的狀態(tài),那么DBWn不會將緩沖區(qū)寫入磁盤的。反而一段時間來,任何會話都未曾關(guān)注的一些緩沖區(qū),DBWn會將其寫入到磁盤。因此DBWn寫臟緩沖區(qū)比較平緩和低頻率。但如果出現(xiàn)檢查點(diǎn)的情況例外:DBWn會將所有臟緩沖區(qū)全部寫入磁盤。---參考OCA認(rèn)證考試指南(1Z0-052,P38中,P39)。

ü 當(dāng)BufferCache中沒有任何可用緩沖區(qū);ü 臟緩沖區(qū)過多;

ü 遇到三秒超時(DBWn每三秒鐘會對一些緩沖區(qū)清理一次)ü 遇到檢查點(diǎn)

綜合DBWn和LGWR工作的特點(diǎn),我們可以得到日志文件的幾個特點(diǎn):

首先,日志文件的寫入是很頻繁的。LGWR會不斷將日志信息從LogBuffer中寫入Online Redo Log;其次,在日志文件上,可以有三個類型的事務(wù)事件。

1、事務(wù)結(jié)束,已經(jīng)被commit,之后打過checkpoint檢查點(diǎn)。這種事務(wù)記錄在LogFile上,但是變化信息已經(jīng)被DBWn寫入進(jìn)數(shù)據(jù)文件;2、事務(wù)結(jié)束,已經(jīng)被commit,之后沒有打入checkpint檢查點(diǎn)。這種情況下,LogFile已經(jīng)寫入了日志項目,數(shù)據(jù)文件可能包括臟數(shù)據(jù),也可能沒有寫入臟數(shù)據(jù);3、事務(wù)未結(jié)束,沒有commit。這種時候,數(shù)據(jù)塊DirtyBlock上面是有事務(wù)槽信息,表示未結(jié)束事務(wù),是不會將數(shù)據(jù)寫入到數(shù)據(jù)文件中。但是,日志LogBuffer可能將部分未提交的DML操作項目寫入到Log File中;檢查點(diǎn)Checkpoint

檢查點(diǎn)Checkpoint是數(shù)據(jù)庫一致性檢查的一個標(biāo)記。簡單的說,就是在這個點(diǎn)上,Oracle保證各個文件(數(shù)據(jù)、控制、日志等)是一致的。檢查點(diǎn)的作用就是在進(jìn)行實(shí)例恢復(fù)的時候,告訴SMON進(jìn)程,這個點(diǎn)之前的內(nèi)容不需要進(jìn)行恢復(fù)。

前滾和回滾介紹

“前滾和回滾”是Oracle數(shù)據(jù)庫實(shí)例發(fā)生意外崩潰,重新啟動的時候,由SMON進(jìn)行的自動恢復(fù)過程。下面通過模擬實(shí)例和講解介紹這個過程。

失敗前場景說明

日志中記錄過程如下:

1、事務(wù)A進(jìn)行之后,結(jié)束commit。之后系統(tǒng)進(jìn)行了一次checkpointA;2、Checkpoint之后,進(jìn)行事務(wù)B,結(jié)束commit;3、進(jìn)行事務(wù)C,C事務(wù)量較大,其中進(jìn)行了一定量的RedoLog文件寫入。之后系統(tǒng)斷電;--按照LGWR的工作機(jī)制,C事務(wù)量比較大,所以應(yīng)用程序?qū)⒃趲追种幻雰?nèi)的時間里生成足以填充1/3秒的重做內(nèi)容,因此這會觸發(fā)LGWR將日志緩沖區(qū)的內(nèi)容轉(zhuǎn)儲到日志文件,但始終得不到針對C事務(wù)的提交記錄,這是需要回滾的。

4、還有種可能,事務(wù)B和D,事務(wù)D所用的緩沖區(qū)處于高速緩沖區(qū)不活躍的位置,而且事務(wù)B已提交,但其所用的緩沖區(qū)處于高速緩沖區(qū)活躍的位置。因此DBWn會將D事務(wù)緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件,而沒將B事務(wù)的數(shù)據(jù)寫入。此種情況需要回滾D事務(wù),保留B事務(wù)。---參考OCP認(rèn)證考試指南全冊(P358下半部分內(nèi)容).

1、系統(tǒng)啟動過程,進(jìn)入實(shí)例恢復(fù)階段

當(dāng)實(shí)例意外中斷的時候,各類型文件,包括控制文件、數(shù)據(jù)文件和日志文件上,會存在不一致的問題。這種不一致主要體現(xiàn)在SCN值的差異上。

實(shí)例在啟動的時候,經(jīng)過三階段(nomount、mount和open)。在open之前,會進(jìn)行這種不一致現(xiàn)象的檢查,如果出現(xiàn)不一致,要啟動SMON進(jìn)程的恢復(fù)流程。

SMON是Oracle實(shí)例的一個后臺進(jìn)程,主要負(fù)責(zé)進(jìn)行系統(tǒng)監(jiān)控恢復(fù)。進(jìn)行恢復(fù)的依據(jù)主要是RedoLog記錄。

2、前滾進(jìn)程

SMON首先找到最后SCN記錄的Redo LogFile。尋找最后一個打入的Checkpoint。

順序找到CheckPointA之后,表示A之前的所有事務(wù)都是完全寫入到數(shù)據(jù)文件中,不存在不一致性問題?;謴?fù)過程從CheckpointA開始,Oracle開始依據(jù)重做日志Redo Log的系列條目,進(jìn)行推進(jìn)。

首先遇到了事務(wù)B信息,由于事務(wù)B已經(jīng)commit,所以事務(wù)B所有相關(guān)的Redo Log條目已經(jīng)全都寫入到Redo LogFile中。所以,按照日志繼續(xù)條目推進(jìn),完全可以重演replay,并且應(yīng)用apply事務(wù)B的全部過程。

這樣,事務(wù)B全部實(shí)現(xiàn),最終將通過DBWn完全寫入到數(shù)據(jù)文件中。所以,實(shí)例失敗之前提交commit的事務(wù)B,完全恢復(fù)。

進(jìn)入事務(wù)C的范疇,由于一部分事務(wù)C的RedoLog條目已經(jīng)進(jìn)入Redo LogFile中(根據(jù)LGWR和DBWn的工作機(jī)制,事務(wù)C有可能將部分?jǐn)?shù)據(jù)塊寫入日志文件和數(shù)據(jù)文件,但這時候C事務(wù)始終沒提交,這是比較嚴(yán)重的訛誤,所以需要回滾),所以在進(jìn)行前滾的時候,一定會replay到這部分的內(nèi)容。不過,這部分內(nèi)容中不可能出現(xiàn)commit的標(biāo)記。所以,前滾的結(jié)果一定是遇到實(shí)例突然中斷的那個時點(diǎn)。此時replay的結(jié)果是,事務(wù)C沒有提交。這樣結(jié)束了前滾過程,進(jìn)入回滾階段。

3、回滾過程(與普通的回滾一樣(當(dāng)事務(wù)執(zhí)行失敗后自動回滾或者命令:ROLLBACK.)---參考OCP認(rèn)證考試指南全冊)對事務(wù)C(針對DML的update,當(dāng)然其他同理),要進(jìn)行回滾過程,釋放所有相關(guān)資源。在前滾中,利用日志填充了的撤銷塊和表數(shù)據(jù)塊的值,然后在回滾的時候,會將撤銷塊的值復(fù)制回表數(shù)據(jù)塊中(因為此事務(wù)沒提交記錄),以此來進(jìn)行SGA中BufferCache數(shù)據(jù)塊恢復(fù)。

4、說說恢復(fù)過程的損耗

很多時候,由于我們事務(wù)規(guī)模較大,當(dāng)出現(xiàn)實(shí)例崩潰的時候,重啟所需要的時間很多。有一種經(jīng)驗說法是,事務(wù)有多長,前滾和回滾所消耗的時間有多長×2。而且,如果不能完成SMON恢復(fù)過程,數(shù)據(jù)庫是不能算作正常的Open的。

SMON的恢復(fù)過程是Oracle強(qiáng)制進(jìn)行的一個過程,即使恢復(fù)中發(fā)生斷電或者其他中斷失敗事件。Oracle在下一次啟動的時候,還是會繼續(xù)這個過程,只有耐心等待。

通過檢查一些內(nèi)部視圖(X$視圖),可以觀察到恢復(fù)進(jìn)程和速度,但是絲毫不能影響到最終恢復(fù)的過程。

這個過程雖然可以保證數(shù)據(jù)一致性,但是也帶來了系統(tǒng)不能啟動,影響生產(chǎn)環(huán)境的問題。我們可以通過兩個方式進(jìn)行緩解:

首先,我們在設(shè)計開發(fā)系統(tǒng)時,要保證事務(wù)規(guī)模的可控性,不要讓事務(wù)規(guī)模在技術(shù)層面上過大。避免一旦發(fā)生崩潰,大規(guī)模強(qiáng)制回滾的發(fā)生;其次,一旦出現(xiàn)了這個強(qiáng)制回滾,要注意對生產(chǎn)環(huán)境的影響??梢圆捎脗鋷靤tandby進(jìn)行頂替,讓主庫安靜的慢慢恢復(fù);

oracle 如何通過事務(wù)回滾。

如果你的數(shù)據(jù)是相互不影響,就是沒有業(yè)務(wù)關(guān)聯(lián)的話,就回滾一條

如果相互有關(guān)系的話

那估計就回滾所有了

個人意見

希望對你有幫助

Oracle8i中回滾段使用和ORA-1555

回滾段中保存的回滾數(shù)據(jù)有 個作用 一致讀和回滾 回滾段是由連續(xù)block組成的區(qū)間extent組成 回滾段有順序的循環(huán)的使用這些區(qū)間 當(dāng)當(dāng)前區(qū)間寫滿的時候 oracle移向下一個區(qū)間 如一個回滾段有 個區(qū)間A B C D;當(dāng)區(qū)間C被寫滿的時候 oracle將寫區(qū)間D 而當(dāng)D寫滿的時候 oracle將嘗試重新寫區(qū)間A 這樣循環(huán)的有順序的使用區(qū)間

事務(wù)必須將回滾信息寫到回滾段中 事務(wù)的當(dāng)前新產(chǎn)生的回滾信息寫在該回滾段的位置叫做回滾段的head 而在該回滾段上最早發(fā)生的尚未提交的事務(wù)最早產(chǎn)生的回滾信息所在位置叫做回滾段的tail 當(dāng)前區(qū)間寫滿的時候 oracle移動head到下一個區(qū)間

i時每個事務(wù)只能使用一個回滾段 Oracle會根據(jù)回滾段workload 平均將事務(wù)分配給各個回滾段 在回滾段使用上的一些規(guī)則

一個事務(wù)只能使用一個回滾段

多個事務(wù)可以共用一個區(qū)間 但Active的事務(wù)不能共用一個block

回滾段的current extent寫滿的時候 回滾段的Head不能夠移動到回滾段tail所在的區(qū)間

區(qū)間總是被有順序的循環(huán)的時候 當(dāng)head移動的時候 不會跳躍區(qū)間 只能移動到下一個區(qū)間

如果head不能夠使用下一個區(qū)間(如tail在下一個區(qū)間) 將會分配一個新的區(qū)間extent 并將新區(qū)間extent插入到這個循環(huán)使用的extent圈中 這叫做回滾段的擴(kuò)展

ORA snapshot too old主要是在一致讀和延遲塊清除delay block cleanout的時候產(chǎn)生

[參考]一致讀的步驟

Read the Data Block

Read the Row Header

Check the Lock Byte to determine whether theres an ITL entry

Read the ITL entry to determine the Transaction ID (Xid)

Read the Transaction Table using the Transaction ID If the transaction has been mitted and has a System Commit Number less than the querys System Change Number update the status of the block (block cleanout) and start over at step

第 步細(xì)分

IF 在Transaction Table 中根據(jù)Transaction ID 找到transaction

IF transaction 已經(jīng)mit

IF query scnmit scn

則接受該塊 進(jìn)行clean out 返回

ELSEIF query scn

則進(jìn)行一致性讀 從第 步向后執(zhí)行

ELSEIF transaction 沒有mit

也進(jìn)行一致性讀 從第 步向后執(zhí)行

ELSEIF 在Transaction Table 中沒有找到transaction(undo header中的transaction slot被覆蓋了 也說明事務(wù)已經(jīng)提交 因為只有提交后所在的transaction slot才能被覆蓋 這樣query scn則去比較control scn 在該回滾段上control scn以前的transaction都已經(jīng)被提交 也就是事務(wù)表中所能找到的最小的mit scn了)

IF query scn

則無法知道query scn和mit scn得大小關(guān)系 出現(xiàn)ORA 錯誤

IF query scncontrol scn

則query scn肯定mit scn

則接受該塊 進(jìn)行clean out 并將block 中ITL標(biāo)記上 U 表示 upper bound mit 并返回

Read the last undo block (Uba)

Compare the block transaction ID with the transaction table transaction ID If the Transaction ID in the undo block doesnt equal the Transaction ID from the Transaction Table then issue ORA Snapshot Too Old 表示回滾段中回滾信息被覆蓋 無法為一致讀提供必需的before image

If the Transaction IDs are identical make a copy of the data block in memory Starting with the head undo entry apply the changes to the copied data block

If the tail undo entry (the actual first undo entry in the chain or the last in the chain going backwards!) indicates another data block address read the indicated undo block into memory and repeat steps and until the undo entries dont contain a value for the data block address

When theres no previous data block address the transaction has been pletely undone

If the undo entry contains:

a a pointer to a previous transaction undo block address read the Transaction ID in the previous transaction undo block header and read the appropriate Transaction Table entry Return to step

b an ITL record restore the ITL record to the data block Return to step

出現(xiàn) 的時候 首先判斷是哪個原因?qū)е?可以設(shè)置event 如果因為transaction slot被覆蓋導(dǎo)致 則增加回滾段數(shù)目 如果因為回滾信息被覆蓋 則增加回滾大大小 錯誤比較復(fù)雜 通常需要考慮很多問題

event = trace name processstate forever level

lishixinzhi/Article/program/Oracle/201311/17091

oracle斷網(wǎng)后事務(wù)無法回滾

1、表存儲引擎不是InnoDB。

2、java調(diào)用數(shù)據(jù)庫代碼中,手動添加了tray....catch,造成未拋出異常。

3、spring回滾默認(rèn)是RuntimeException異常,可指定回滾異常,@Transaction(RollbackFor=Exception.class)。

4、如果使用代理方式,應(yīng)指定代理使用CGLib@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)。

如何使用Oracle回滾段

Oracle缺省用的是專用服務(wù)器模式,也就是說一個用戶連接進(jìn)程對應(yīng)一個服務(wù)器的進(jìn)程.

記得某大醫(yī)院剛啟用的時候,我們曾經(jīng)試過MTS.因為聽說MTS在不增加內(nèi)存和CPU的情況下連接更多的客戶端,結(jié)果并不是我們預(yù)期的那樣.

因為我們對MTS不了解,并不是它有問題,而是它不是用來在這種情況下做這件事的.

分享名稱:oracle事務(wù)怎么回滾 oracle回滾是什么意思
網(wǎng)站URL:http://muchs.cn/article2/hgchoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)搜索引擎優(yōu)化、企業(yè)建站、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司