Oracle資料庫的備份及恢復策略研究(轉)

gugu99發表於2007-08-13
Oracle資料庫的備份及恢復策略研究(轉)[@more@]

  摘 要 恢復丟失的資料庫檔案在很大程度上取決於所採用的備份策略。本文從恢復的靈活性出發,對Oracle8資料庫的備份及恢復策略進行了探討,並給出了Windows 2000環境下使備份過程自動化的指令碼檔案的專案開發例項。

  關鍵詞 Oracle 資料庫 備份 恢復

  引言

  隨著資訊系統在各種商務活動中重要性的不斷增強,維護系統資料的可用性已成為當前一個十分重要的課題。為了有效地保持健康的資訊系統,必須採取一定的措施防止在由介質、作業系統、軟體和其它事件導致重要資料庫檔案嚴重損壞的情況下影響RDBMS(關聯式資料庫管理系統),進而影響資訊系統的正常執行。這就需要在此類系統失敗的情況履芄患笆薄⒂行У亟?性幟鴉指礎;指炊?У氖?菘饢募?諍艽蟪潭壬先【鯰謁?捎玫謀阜薟唄裕?蚨?疚畝閱殼傲饜械南racle8資料庫的備份及恢復策略進行了探討。

  資料庫備份、恢復的基本規則

  1、多工聯機重作日誌檔案

  每個資料庫例項都有其自己的聯機重作日誌組,在運算元據庫時,Oracle首先將資料庫的全部改變儲存在重作日誌緩衝區中,隨後日誌記錄器程式(LGWR)將資料從系統共用區SGA(System Global Area)的重作日誌緩衝區寫入聯機重作日誌檔案,在磁碟崩潰或例項失敗時,可以透過與之相關的聯機重作日誌來保護資料庫,將損失降至最低,但Oracle在預設的方式下只建立一組重作日誌檔案(每一組只有一個專案檔案),為了減少丟失這些重要的重作日誌檔案的危險,因此需要對其進行映象複製。

  在Oracle級多工聯機重作日誌檔案,即增加多個檔案到每個組以便映象資料,這樣I/O故障或寫丟失只損壞一個複製,從而保證了LGWR後臺程式至少能夠向一個成員寫入資訊,資料庫仍然可以繼續執行。同時應保證日誌組的成員不應駐存在同一物理裝置上,因為這將削弱多重日誌檔案的作用。

  2、映象複製控制檔案

  控制檔案描述通用的資料庫結構,它儲存了大量資料庫狀態資訊,包括物理結構和聯機重作日誌檔案在當時的名稱、位置、狀態。控制檔案在資料庫啟動時被Oracle例項讀取,保持開啟並隨著操作而檔案內容更新,直到例項關閉為止。在它開啟的過程中能夠同步需要恢復的資訊,包括檢查點資訊,因此若損壞或丟失了控制檔案,Oracle將不能繼續工作,因此應在系統中保持控制檔案的多個複製,且這些複製應置於安裝於不同磁碟控制器下的不同磁碟裝置中。

  由於Oracle沒有提供對控制檔案多工的完整支援,因此應在對控制檔案使用作業系統或硬體映象,即在修改初始化檔案的control_files引數後重新啟動資料庫前,應將控制檔案複製到定義的新位置,否則資料庫啟動時將會出錯。

  3、啟用歸檔程式

  當資料庫執行於NOARCHIVELOG模式下時,只能在完全關閉資料庫後進行資料庫的一致備份,並且同時禁用了聯機重作日誌的存檔,這樣在Oracle例項失敗時只能將資料庫修復到最近的完整資料庫備份時的那一點上,不能在失效點處對例項進行恢復。而在ARCHIVELOG模式下,資料庫不僅可以進行一致備份,還可以在資料庫開啟的情況下進行聯機備份。透過資料庫的備份和聯機與存檔的重作日誌檔案,使用者可以恢復所有已提交的事務,並允許將資料庫恢復到指定的時間、SCN或日誌系列號處,增大了恢復的靈活性,減少了故障時的資料丟失。因此資料庫應執行於ARCHIVELOG模式。

  在ARCHIVELOG模式下為了防止檔案損壞和介質故障,應把日誌歸檔到不同的磁碟上,這可以透過在初始化檔案中為歸檔重作日誌指定多個目標實現。

  4、資料庫實施較大改變時備份

  因為控制檔案中儲存了資料庫的模式結構資訊,因此在對資料庫進行較大改變(包括改變表結構,增加、刪除日誌檔案或資料檔案等)時應立即備份控制檔案及相應的資料檔案。

  5、使用RESETLOGS選項開啟資料庫後進行備份

  在以RESETLOGS選項開啟資料庫後,應對整個資料庫進行離線或聯機的備份,否則將不能恢復重置日誌後的改變。

  當以RESETLOGS選項開啟資料庫時,Oracle將拋棄恢復中沒有應用的重複資訊,並確保永遠不再運用,同時還將初始化控制檔案中關於聯機日誌和重作執行緒的資訊、清除聯機日誌中的內容。因此,RESETLOGS前的歸檔日誌的序列號將與RESETLOGS後的Oracle控制檔案的要求值不相符(備份檔案中的檢查點比控制檔案中的檢查點舊),即在恢復中不能應用以前的歸檔日誌檔案,從而導致RESETLOGS操作之前的備份在新形體中無用。

  6、避免備份聯機重作日誌檔案

  由於文中提出了多工聯機重作日誌檔案且資料庫執行於ARCHIVELOG模式,ARCH程式能夠將聯機重作日誌歸檔,因此不必對其進行備份。若用備份的聯機重作日誌檔案重建它,可能會引起日誌檔案序列號的混亂,從而破壞資料庫,得到適得其反的結果。

  7、重置聯機日誌

  在進行了不完全恢復或用備份控制檔案進行恢復後,應重置聯機日誌。

  為了確保資料庫的一致性,必須保證在恢復後所有資料檔案都恢復到同一個時間點,但不完全恢復可能導致資料檔案中具有一個與其它檔案不同的檢查點,導致資料庫的一致性受到破壞。同樣,備份的控制檔案中儲存的SCN和計數器與當前日誌檔案中的值可能不同,從而也破壞了資料庫的一致性,因此應在進行完上述兩項操作後重置聯機日誌。

  8、資料庫的邏輯備份

  以上所述備份都為物理備份,是實際物理資料庫檔案從一處複製到另一處的備份,除此之外還可使用Oracle提供的匯出實用程式進行資料庫的邏輯備份。Oracle同時還提供了相應的匯入實用程式重建邏輯備份中儲存的資訊。

  邏輯備份只複製資料庫中的資料,而不記錄資料位置的備份過程。它利用SQL語句,從資料庫中匯出資料到一個存放在合適位置的外部檔案中,同時並可檢測到資料塊的損壞,因此可用其作為物理備份的補充。

  備份策略

  考慮到如今大部分資訊系統每週的業務是24×7操作,因此採用聯機備份,否則可每隔一定時間進行一次離線備份。

  應用上述規則,可得出下述典型的備份策略:

  ①映象複製重作日誌檔案;

  ②映象複製控制檔案;

  ③啟用歸檔程式,即以ARCHIVELOG模式運算元據庫;

  ④每天進行資料庫的部分聯機備份(每天進行資料庫的完全熱備份將無畏地增加資料庫的負擔且沒有必要,同時也增加了資料庫恢復時的靈活性);

  ⑤每隔一週或幾周進行一次資料庫的邏輯備份。

  實際專案應用

  當資料庫中的檔案達到一定數量後,DBA可能記不住該備份的檔案的名或位置,因此,若能使備份過程自動化可有效地減輕DBA的負擔,同時不會遺漏應備份的檔案,應用自動批處理檔案及指令碼檔案可實現備份、恢復的自動化。下面簡介了在實際專案開發中應用本文所提出的自動備份、恢復策略,透過實際應用,證明了該策略的正確性和可行性。

  (1)下述指令碼實現聯機重作日誌的多工:

  connect 賬戶名/密碼alter database ktgis add logfile member 日誌檔案的儲存位置 to group 聯機日誌組號;shutdown immediatestartup pfile=初始化檔案的存放位置 exclusive mount; 裝載資料庫且不開啟alter database archivelog; 啟用歸檔程式alter database open;exit

  (2)下列VB程式碼自動建立聯機備份的批處理檔案及相應的指令碼檔案。

  Set adoTmp = objConnect.Execute("select tablespace_name from sys.dba_data_files") '得到資料庫中的表空間名Dim lnum1 As LongDim lnum2 As LonglNum = FreeFileOpen 自動備份批處理檔案路徑 For Binary As lNumlnum1 = FreeFileOpen "onlinebegin.sql" For Binary As lnum2 onlinebegin.sql為設定表空間進入熱備份模式的指令碼檔案檔名lnum2 = FreeFileOpen "onlineend.sql" For Binary As lnum2 onlinebegin.sql為結束表空間熱備份模式的指令碼檔案檔名strTmp = " connect 賬戶名/密碼" & Chr(13) & Chr(10)Put lnum1, , strTmpstrTmp = "shutdown immediate" & Chr(13) & Chr(10)Put lnum1, , strTmpstrTmp = "startup pfile=初始化檔案的存放位置exclusive mount; " & Chr(13) & Chr(10)Put lnum1, , strTmpstrTmp = "alter database archivelog; " & Chr(13) & Chr(10)Put lnum1, , strTmpstrTmp = "alter database open; " & Chr(13) & Chr(10)Put lnum1, , strTmpstrTmp = " connect 賬戶名/密碼" & Chr(13) & Chr(10)Put lnum2, , strTmpstrTmp = Oracle服務管理器路徑 & " @" & " onlinebegin.sql " & Chr(13) & Chr(10) 在服務管理器中執行指令碼檔案onlinebegin.sqlPut lNum, , strTmpDo While Not adoTmp.EOFSet adoTmp1 = objConnect.Execute("select file_name from sys.dba_data_files where tablespace_name='" & adoTmp.Fields(0) & "'") 得到當前表空間所對應的所有資料檔名,透過迴圈即可得到所有表空間所對應資料檔名,若只備份指定的表空間,可指定表空間名從而得到其對應的物理資料檔案strTmp = "alter tablespace " & adoTmp.Fields(0) & " begin backup;" & Chr(13) & Chr(10) 將表空間置於熱備份模式Put lnum1, , strTmpstrTmp = Oracle的ocopy.exe工具全路徑 " & adoTmp1.Fields(0) & " " & 備份檔案存放路徑 & Chr(13) & Chr(10)Put lNum, , strTmpstrTmp = "alter tablespace " & adoTmp.Fields(0) & " end backup;" & Chr(13) & Chr(10) 表空間恢復正常模式Put lnum2, , strTmpadoTmp.MoveNextLoopstrTmp = Oracle服務管理器路徑 & " @" & " onlineend.sql" & Chr(13) & Chr(10) 在服務管理器中執行指令碼檔案onlineend.sqlPut lNum, , strTmpstrTmp = "exit" & Chr(13) & Chr(10) 退出服務管理器Put lnum1, , strTmpstrTmp = "alter system switch logfile;" & Chr(13) & Chr(10) 強制日誌轉換,使Oracle建立一個歸檔日誌檔案Put lnum2, , strTmpstrTmp = "exit" & Chr(13) & Chr(10)Put lnum2, , strTmpCloseSet adoTmp = NothingSet adoTmp1 = Nothing

  執行得到的自動批處理檔案,即可自動進行資料庫的聯機備份。

  (3)在從備份中恢復資料檔案後,執行下列指令碼將資料庫的恢復程式。

  connect賬戶名/密碼shutdown abortstartup mount pfile=初始化檔案的存放位置; 裝載資料庫set autorecovery on; 開啟自動恢復recover database;alter database open; 開啟資料庫

  結束語

  提高資料庫災難後恢復的可靠性正越來越多地受到人們的關注,本文根據個人在實際專案開發過程中的經驗及恢復時的靈活性對Oracle資料庫的備份及恢復進行了探討,並提出了典型的備份策略,使用者可以根據自己的實際情況及資料庫結構在此基礎上靈活應用。


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

相關文章