ORACLE資料庫事務處理和故障恢復

tolywang發表於2005-01-20
一、併發控制


??資料庫是一個共享資源,可為多個應用程式所共享。這些程式可序列執行,但在許多情況下,由於應用程式涉及的資料量可能很大,常常會涉及輸入/輸出的交換。為了有效地利用資料庫資源,可能多個程式或一個程式的多個程式並行地執行,這就是資料庫的並行操作。在多使用者資料庫環境中,多個使用者程式可並行地存取資料庫,如果不對併發操作進行控制,會存取不正確的資料,或破壞資料庫資料的一致性。
??

1) 資料庫不一致的型別
??◎ 不一致性
??在一事務期間,其它提交的或未提交事務的修改是顯然的,以致由查詢所返回的資料集不與任何點相一致。
??◎ 不可重複讀
??在一個事務範圍內,兩個相同查詢將返回不同資料,由於查詢注意到其它提交事務的修改而引起。
??◎ 讀髒資料
??如果事務T1將一值(A)修改,然後事務T2讀該值,在這之後T1由於某種原因撤銷對該值的修改,這樣造成T2讀取的值是髒的。
??◎ 丟失更改
??在一事務中一修改重寫另一事務的修改。
??◎ 破壞性的DDL操作
??在一使用者修改一表的資料時,另一使用者同時更改或刪除該表。

??2)封鎖
??在多使用者資料庫中一般採用某些資料封鎖來解決併發操作中的資料一致性和完整性問題。封鎖是防止存取同一資源的使用者之間破壞性的干擾的機制,該干擾是指不正確地修改資料或不正確地更改資料結構。
??在多使用者資料庫中使用兩種封鎖:排它(專用)封鎖和共享封鎖。排它封鎖禁止相關資源的共享,如果一事務以排它方式封鎖一資源,僅僅該事務可更改該資源,直至釋放排它封鎖。共享封鎖允許相關資源可以共享,幾個使用者可??同時讀同一資料,幾個事務可在同一資源上獲取共享封鎖。共享封鎖比排它封鎖具有更高的資料並行性。
在多使用者系統中使用封鎖後會出現死鎖,引起一些事務不能繼續工作。當兩個或多個使用者彼此等待所封鎖資料時可發生死鎖。

??3) ORACLE多種一致性模型。
??ORACLE利用事務和封鎖機制提供資料併發存取和資料完整性。在一事務內由語句獲取的全部封鎖在事務期間被保持,防止其它並行事務的破壞性干擾。一個事務的SQL語句所作的修改在它提交之後所啟動的事務中才是可見的。在一事務中由語句所獲取的全部封鎖在該事務提交或回滾時被釋放。
??ORACLE在兩個不同級上提供讀一致性:語句級讀一致性和事務級一致性。ORCLE總是實施語句級讀一致性,保證單個查詢所返回的資料與該查詢開始時刻相一致。所以一個查詢從不會看到在查詢執行過程中提交的其它事務所作的任何修改。為了實現語句級讀一致性,在查詢進入執行階段時,在注視SCN的時候為止所提交的資料是有效的,而在語句執行開始之後其它事務提交的任何修改,查詢將是看不到的。
??ORACLE允許選擇實施事務級讀一致性,它保證在同一事務內所有查詢的資料

??4)封鎖機制
??ORACLE自動地使用不同封鎖型別來控制資料的並行存取,防止使用者之間的破壞性干擾。ORACLE為一事務自動地封鎖一資源以防止其它事務對同一資源的排它封鎖。在某種事件出現或事務不再需要該資源時自動地釋放。
??ORACLE將封鎖分為下列類:
??◎ 資料封鎖:資料封鎖保護表資料,在多個使用者並行存取資料時保證資料的完整性。資料封鎖防止相沖突的DML和DDL操作的破壞性干擾。DML操作可在兩個級獲取資料封鎖:指定行封鎖和整個表封鎖,在防止衝突的DDL操作時也需表封鎖。當行要被修改時,事務在該行獲取排它資料封鎖。表封鎖可以有下列方式:行共享、行排它、共享封鎖、共享行排它和排它封鎖。
??◎ DDL封鎖(字典封鎖)
??DDL封鎖保護模式物件(如表)的定義,DDL操作將影響物件,一個DDL語句隱式地提交一個事務。當任何DDL事務需要時由ORACLE自動獲取字典封鎖,使用者不能顯式地請求DDL封鎖。在DDL操作期間,被修改或引用的模式物件被封鎖。
??◎ 內部封鎖:保護內部資料庫和記憶體結構,這些結構對使用者是不可見的。

??5)手工的資料封鎖
??下列情況允許使用選擇代替ORACLE預設的封鎖機制:
??◎ 應用需要事務級讀一致或可重複讀。
??◎ 應用需要一事務對一資源可排它存取,為了繼續它的語句,具有對資源排它存取的事務不必等待其它事務完成。
??ORACLE自動封鎖可在二級被替代:事務級各系統級。
??◎ 事務級:包含下列SQL語句的事務替代ORACLE預設封鎖:LOCK TABLE命令、SELECT…FOR UPDATE命令、具有READ ONLY選項的SET TRANSACTIN命令。由這些語句所獲得的封鎖在事務提交或回滾後所釋放。
??◎ 系統級:透過調整初始化引數SERIALIZABLE和REO-LOCKING,例項可用非預設封鎖啟動。該兩引數據的預設值為:
??SERIALIZABLE=FALSE
??ORW-LOCKING=ALWAYS

二、資料庫後備和恢復


??當我們使用一個資料庫時,總希望資料庫的內容是可靠的、正確的,但由於計算機系統的故障(硬體故障、軟體故障、網路故障、程式故障和系統故障)影響資料庫系統的操作,影響資料庫中資料的正確性,甚至破壞資料庫,使資料庫中全部或部分資料丟失。因此當發生上述故障後,希望能重新建立一個完整的資料庫,該處理稱為資料庫恢復。恢復子系統是資料庫管理系統的一個重要組成部分。恢復處理隨所發生的故障型別所影響的結構而變化。

??1) 恢復資料庫所使用的結構
??ORACLE資料庫使用幾種結構對可能故障來保護資料:資料庫後備、日誌、回滾段和控制檔案。
??資料庫後備是由構成ORACLE資料庫的物理檔案的作業系統後備所組成。當介質故障時進行資料庫恢復,利用後備檔案恢復毀壞的資料檔案或控制檔案。
??日誌,每一個ORACLE資料庫例項都提供,記錄資料庫中所作的全部修改。一個例項的日誌至少由兩個日誌檔案組成,當例項故障或介質故障時進行資料庫部分恢復,利用資料庫日誌中的改變應用於資料檔案,修改資料庫資料到故障出現的時刻。資料庫日誌由兩部分組成:線上日誌和歸檔日誌。
??每一個執行的ORACLE資料庫例項相應地有一個線上日誌,它與ORACLE後臺程式LGWR一起工作,立即記錄該例項所作的全部修改。線上日誌由兩個或多個預期分配的檔案組成,以迴圈方式使用。
??歸檔日誌是可選擇的,一個ORACLE資料庫例項一旦線上日誌填滿後,可形成線上日誌的歸檔檔案。歸檔的線上日誌檔案被唯一標識併合成歸檔日誌。
??回滾段用於儲存正在進行的事務(為未提交的事務)所修改值的老值,該資訊在資料庫恢復過程中用於撤消任何非提交的修改。
??控制檔案,一般用於儲存資料庫的物理結構的狀態。控制檔案中某些狀態資訊在例項恢復和介質恢復期間用於引導ORACLE。

??2) 線上日誌
??一個ORACLE資料庫的每一例項有一個相關聯的線上日誌。一個線上日誌由多個線上日誌檔案組成。線上日誌檔案填入日誌項,日誌項記錄的資料用於重構對資料庫所作的全部修改。後臺程式LGWR以迴圈方式寫入線上日誌檔案。噹噹前的線上日誌檔案寫滿後,LGWR寫入到下一可用線上日誌檔案當最後一個可用的線上日誌檔案的檢查點已完成時即可使用。如果歸檔不實施,一個已填滿的線上日誌檔案一當包含該線上日誌檔案的檢查點完成,該檔案已被歸檔後即可使用。在任何時候,僅有一個線上日誌檔案被寫入儲存日誌項,它被稱為活動的或當前線上日誌檔案,其它的線上日誌檔案為不活動的線上日誌檔案。
??ORCLE結束寫入一線上日誌檔案並開始寫入到另一個線上日誌檔案的點稱為日誌開關。日誌開關在當前線上日誌檔案完全填滿,必須繼續寫入到下一個線上日誌檔案時總出現,也可由DBA強制日誌開關。每一日誌開關出現時,每一線上日誌檔案賦給一個新的日誌序列號。如果線上日誌檔案被歸檔,在歸檔日誌檔案中包含有它的日誌序列號。
ORACLE後臺程式DBWR(資料庫寫)將SGA中所有被修改的資料庫緩衝區(包含提交和未提交的)寫入到資料檔案,這樣的事件稱為出現一個檢查點。因下列原因實現檢查點:
??◎ 檢查點確保將記憶體中經常改變的資料段塊每隔一定時間寫入到資料檔案。由於DBWR使用最近最少使用演算法,經常修改的資料段塊從不會作為最近最少使用塊,如果檢查點不出現,它從不會寫入磁碟。
??◎ 由於直至檢查點時所有的資料庫修改已記錄到資料檔案,先於檢查點的日誌項在例項恢復時不再需要應用於資料檔案,所以檢查點可加快例項恢復。
??雖然檢查點有一些開銷,但ORACLE既不停止活動又不影響當前事務。由於DBWR不斷地將資料庫緩衝區寫入到磁碟,所以一個檢查點一次不必寫許多資料塊。一個檢查點保證自前一個檢查點以來的全部修改資料塊寫入到磁碟。檢查點不管填滿的線上日誌檔案是否正在歸檔,它總是出現。如果實施歸檔,在LGWR重用線上日誌檔案之前,檢查點必須完成並且所填滿的線上日誌檔案必須被歸檔。
??檢查點可對資料庫的全部資料檔案出現(稱為資料庫檢查點),也可對指定的資料檔案出現。下面說明一下什麼時候出現檢查點及出現什麼情況:
??◎ 在每一個日誌開關處自動地出現一資料庫檢查點。如果前一個資料庫檢查點正在處理,由日誌開關實施的檢查點優於當前檢查點。
??◎ 初始化引數據LOG-CHECKPOINT-INTERVAL設定所實施的資料庫檢查點,當預定的日誌塊數被填滿後(自最後一個資料庫檢查點以來),實施一資料庫檢查點。另一個引數LOG-CHECKPOINT-TIMEOUT可設定自上一個資料庫檢查點開始之後指定秒數後實施一資料庫檢查點。這種選擇對使用非常大的日誌檔案時有用,它在日誌開頭之間增加檢查點。由初始化引數所啟動的資料庫檢查點只有在前一個檢查點完成後才能啟動。
??◎ 當一線上表空間開始後備時,僅對構成該空間的資料檔案實施一檢查點,該檢查點壓倒仍在進行中的任何檢查點。
??◎ 當DBA使一表空間離線時,僅對構成該表空間的線上檔案實施一檢查點。
??◎ 當DBA以正常或立即方式關閉一例項時,ORACLE在例項關閉之前實施一資料庫檢查點,該檢查點壓倒任何執行檢查點。
??◎ DBA可要求實施一資料庫檢查點,該檢查點壓倒任何執行檢查點。

??檢查點機制:當檢查點出現時,檢查點後臺程式記住寫入線上檔案的下一日誌行的位置,並通知資料庫寫後臺程式將SGA中修改的資料庫緩衝區寫入到磁碟上的資料檔案。然後由CKPT修改全部控制檔案和資料檔案的標頭,反映該最後檢查點。當檢查點不發生,DBWR當需要時僅將最近最少使用的資料庫緩衝區寫入磁碟,為新資料準備緩衝區。
??鏡象線上日誌檔案:為了安全將例項的線上日誌檔案鏡象到它的線上日誌檔案ORACLE提供鏡象功能。當具有鏡象線上日誌檔案時,LGWR同時將同一日誌資訊寫入到多個同樣的線上日誌檔案。日誌檔案分成組,每個組中的日誌檔案稱為成員,每個組中的全部成員同時活動,由LGWR賦給相同的日誌序列號。如果使用鏡象線上日誌,則可建立線上日誌檔案組,在組中的每一成員要求是同一大小。
??鏡象線上日誌的機制:LGWR總是尋找組的全部成員,對一組的全部成員並行地寫,然後轉換到下一組的全部成員,並行地寫。


??每個資料庫例項有自己的線上日誌組,這些線上日誌組可以是鏡象的或不是,稱為例項的線上日誌線索。在典型配置中,一個資料庫例項存取一個ORACLE資料庫,於是僅一個線索存在。然而在執行ORACLE並行伺服器中,兩個或多個例項並行地存取單個資料庫,在這種情況下,每個例項有自己的線索。

3) 歸檔日誌


??ORACLE要將填滿的線上日誌檔案組歸檔時,則要建立歸檔日誌,或稱離線日誌。其對資料庫後備和恢復有下列用處:
??◎ 資料庫後備以及線上和歸檔日誌檔案,在作業系統或磁碟故障中可保證全部提交的事務可被恢復。
??◎ 在資料庫開啟時和正常系統使用下,如果歸檔日誌是永久保持,線上後備可以進行和使用。
??如果使用者資料庫要求在任何磁碟故障的事件中不丟失任何資料,那麼歸檔日誌必須要存在。歸檔已填滿的線上日誌檔案可能需要DBA執行額外的管理操作。
??歸檔機制:決定於歸檔設定,歸檔已填滿的線上日誌組的機制可由ORACLE後臺程式ARCH自動歸檔或由使用者程式發出語句手工地歸檔。當日志組變為不活動、日誌開關指向下一組已完成時,ARCH可歸檔一組,可存取該組的任何或全部成員,完成歸檔組。線上日誌檔案歸檔之後才可為LGWR重用。當使用歸檔時,必須指定歸檔目標指向一儲存裝置,它不同於個有資料檔案、線上日誌檔案和控制檔案的裝置,理想的是將歸檔日誌檔案永久地移到離線儲存裝置、如磁帶。
??資料庫可執行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG方式。資料庫在NOARCHIVELOG方式下使用時,不能進行線上日誌的歸檔。在該資料庫控制檔案指明填滿的組不需要歸檔,所以一當填滿的組成為活動,在日誌開關的檢查點完成,該組即可被LGWR重用。在該方式下僅能保護資料庫例項故障,不能保護介質(磁碟)故障。利用儲存在線上日誌中的資訊,可實現例項故障恢復。
??如果資料庫在ARCHIVELOG方式下,可實施線上日誌的歸檔。在控制檔案中指明填滿的日誌檔案組在歸檔之前不能重用。一旦組成為不活動,執行歸檔的程式立即可使用該組。
??在例項起動時,透過引數LOG-ARCHIVE-START設定,可啟動ARCH程式,否則ARCH程式在例項啟動時不能被啟動。然而DBA在憑藉時候可互動地啟動或停止自動歸檔。 一旦線上日誌檔案組變為不活動時,ARCH程式自動對它歸檔。
如果資料庫在ARCHIVELOG方式下執行,DBA可手工歸檔填滿的不活動的日誌檔案組,不管自動歸檔是可以還是不可以。

4) 資料庫後備


??不管為ORACLE資料庫設計成什麼樣的後備或恢復模式,資料庫資料檔案、日誌檔案和控制檔案的作業系統後備是絕對需要的,它是保護介質故障的策略部分。作業系統後備有完全後備和部分後備
??◎ 完全後備:一個完全後備將構成ORACLE資料庫的全部資料庫檔案、線上日誌檔案和控制檔案的一個作業系統後備。一個完全後備在資料庫正常關閉之後進行,不能在例項故障後進行。在此時,所有構成資料庫的全部檔案是關閉的,並與當前點相一致。在資料庫開啟時不能進行完全後備。由完全後備得到的資料檔案在任何型別的介質恢復模式中是有用的。
??◎ 部分後備:部分後備為除完全後備外的任何作業系統後備,可在資料庫開啟或關閉下進行。如單個表空間中全部資料檔案後備、單個資料檔案後備和控制檔案後備。部分後備僅對在ARCHIVELOG方式下執行資料庫有用,因為存在的歸檔日誌,資料檔案可由部分後備恢復。在恢復過程中與資料庫其它部分一致。

5) 資料庫恢復


??◎ 例項故障的恢復
??當例項意外地(如掉電、後臺程式故障等)或預料地(發出SHUTDOUM ABORT語句)中止時出現例項故障,此時需要例項恢復。例項恢復將資料庫恢復一故障之前的事務一致狀態。如果在線上後備發現例項故障,則需介質恢復。在其它情況ORACLE在下次資料庫起動時(對新例項裝配和開啟),自動地執行例項恢復。如果需要,從裝配狀態變為開啟狀態,自動地激發例項恢復,由下列處理:
??(1) 為了解恢復資料檔案中沒有記錄的資料,進行向前滾。該資料記錄在線上日誌,包括對回滾段的內容恢復。
??(2) 回滾未提交的事務,按步1重新生成回滾段所指定的操作。
??(3) 釋放在故障時正在處理事務所持有的資源。
??(4) 解決在故障時正經歷一階段提交的任何懸而未決的分佈事務。
??◎ 介質故障的恢復
??介質故障是當一個檔案、一個檔案的部分或一磁碟不能讀或不能寫時出現的故障。介質故障的恢復有兩種形式,決定於資料庫執行的歸檔方式。
??◎ 如果資料庫是可執行的,以致它的線上日誌僅可重用但不能歸檔,此時介質恢復為使用最新的完全後備的簡單恢復。在完全後備執行的工作必須手工地重作。
??◎ 如果資料庫可執行,其線上日誌是被歸檔的,該介質故障的恢復是一個實際恢復過程,重構受損的資料庫恢復到介質故障前的一個指定事務一致狀態。
??◎ 不管哪種形式,介質故障的恢復總是將整個資料庫恢復到故障之前的一個事務一致狀態。如果資料庫是在ARCHIVELOG方式執行,可有不同型別的介質恢復:完全介質恢復和不完全介質恢復。
??完全介質恢復可恢復全部丟失的修改。僅當所有必要的日誌可用時才可能。有不同型別的完全介質恢復可使用,其決定於毀壞檔案和資料庫的可用性。例:
??◎ 關閉資料庫的恢復。當資料庫可被裝配卻是關閉的,完全不能正常使用,此時可進行全部的或單個毀壞資料檔案的完全介質恢復。
??◎ 開啟資料庫的離線表空間的恢復。當資料庫是開啟的,完全介質恢復可以處理。未損的資料庫表空間是線上的可以使用,而受損耗捕空間是離線的,其所有資料檔案作為恢復的單位。
??◎ 開啟資料庫的離線表間的單個資料檔案的恢復。當資料庫是開啟的,完全介質恢復可以處理。未損的資料庫表空間是線上的可以使用,而所損的表空間是離線的,該表空間的指定所損的資料檔案可被恢復。
??◎ 使用後備的控制檔案的完全介質恢復。當控制檔案所有複製由於磁碟故障而受損時,可進行介質恢復而不丟失資料。
??不完全介質恢復是在完全介質恢復不可能或不要求時進行的介質恢復。重構受損的資料庫,使其恢復介質故障前或使用者出錯之前的一個事務一致性狀態。不完全介質恢復有不同型別的使用,決定於需要不完全介質恢復的情況,有下列型別:基於撤消、基於時間和基於修改的不完全恢復。
??基於撤消恢復:在某種情況,不完全介質恢復必須被控制,DBA可撤消在指定點的操作。基於撤消的恢復地在一個或多個日誌組(線上的或歸檔的)已被介質故障所破壞,不能用於恢復過程時使用,所以介質恢復必須控制,以致在使用最近的、未損的日誌組於資料檔案後中止恢復操作。
??基於時間和基於修改的恢復:如果DBA希望恢復到過去的某個指定點,不完全介質恢復地理想的。可在下列情況下使用:
??◎ 當使用者意外地刪除一表,並注意到錯誤提交的估計時間,DBA可立即關閉資料庫,恢復它到使用者錯誤之前時刻。
??◎ 由於系統故障,一個線上日誌檔案的部分被破壞,所以活動的日誌檔案突然不可使用,例項被中止,此時需要介質恢復。在恢復中可使用當前線上日誌檔案的未損部分,DBA利用基於時間的恢復,一旦有將效的線上日誌已應用於資料檔案後停止恢復過程。
??在這兩種情況下,不完全介質恢復的終點可由時間點或系統修改號(SCN)來指定。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84249/,如需轉載,請註明出處,否則將追究法律責任。

相關文章