摘 要 恢復丟失的數據庫文件在很大程度上取決于所采用的備份策略。本文從恢復的靈活性出發,對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 immediate
startup 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 long
dim lnum2 as long
lnum = freefile
open 自動備份批處理文件路徑 for binary as lnum
lnum1 = freefile
open "onlinebegin.sql" for binary as lnum2 onlinebegin.sql為設置表空間進入熱備份模式的腳本文件文件名
lnum2 = freefile
open "onlineend.sql" for binary as lnum2 onlinebegin.sql為結束表空間熱備份模式的腳本文件文件名
strtmp = " connect 賬戶名/密碼" & chr(13) & chr(10)
put lnum1, , strtmp
strtmp = "shutdown immediate" & chr(13) & chr(10)
put lnum1, , strtmp
strtmp = "startup pfile=初始化文件的存放位置exclusive mount; " & chr(13) & chr(10)
put lnum1, , strtmp
strtmp = "alter database archivelog; " & chr(13) & chr(10)
put lnum1, , strtmp
strtmp = "alter database open; " & chr(13) & chr(10)
put lnum1, , strtmp
strtmp = " connect 賬戶名/密碼" & chr(13) & chr(10)
put lnum2, , strtmp
strtmp = oracle服務管理器路徑 & " @" & " onlinebegin.sql " & chr(13) & chr(10) 在服務管理器中執行腳本文件onlinebegin.sql
put lnum, , strtmp 
do while not adotmp.eof
set 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, , strtmp
strtmp = oracle的ocopy.exe工具全路徑 " & adotmp1.fields(0) & " " & 備份文件存放路徑 & chr(13) & chr(10)
put lnum, , strtmp
strtmp = "alter tablespace " & adotmp.fields(0) & " end backup;" & chr(13) & chr(10) 表空間恢復正常模式
put lnum2, , strtmp
adotmp.movenext
loop
strtmp = oracle服務管理器路徑 & " @" & " onlineend.sql" & chr(13) & chr(10) 在服務管理器中執行腳本文件onlineend.sql
put lnum, , strtmp
strtmp = "exit" & chr(13) & chr(10) 退出服務管理器
put lnum1, , strtmp
strtmp = "alter system switch logfile;" & chr(13) & chr(10) 強制日志轉換,使oracle創建一個歸檔日志文件
put lnum2, , strtmp
strtmp = "exit" & chr(13) & chr(10) 
put lnum2, , strtmp
close
set adotmp = nothing
set adotmp1 = nothing
  運行得到的自動批處理文件,即可自動進行數據庫的聯機備份。
  (3)在從備份中恢復數據文件后,執行下列腳本將數據庫的恢復程序。
connect賬戶名/密碼
shutdown abort
startup mount pfile=初始化文件的存放位置; 裝載數據庫
set autorecovery on; 打開自動恢復
recover database;
alter database open; 打開數據庫
  結束語
  提高數據庫災難后恢復的可靠性正越來越多地受到人們的關注,本文根據個人在實際項目開發過程中的經驗及恢復時的靈活性對oracle數據庫的備份及恢復進行了探討,并提出了典型的備份策略,用戶可以根據自己的實際情況及數據庫結構在此基礎上靈活應用。