多工聯機重作日志文件
每個數據庫實例都有其自己的聯機重作日志組在操作數據庫時Oracle首先將數據庫的全部改變保存在重作日志緩沖區中隨後日志記錄器進程(LGWR)將數據從系統共用區SGA(System Global Area)的重作日志緩沖區寫入聯機重作日志文件在磁盤崩潰或實例失敗時可以通過與之相關的聯機重作日志來保護數據庫將損失降至最低但Oracle在默認的方式下只創建一組重作日志文件(每一組只有一個項目文件)為了減少丟失這些重要的重作日志文件的危險因此需要對其進行鏡像拷貝
在Oracle級多工聯機重作日志文件即增加多個文件到每個組以便鏡像數據這樣I/O故障或寫丟失只損壞一個拷貝從而保證了LGWR後台進程至少能夠向一個成員寫入信息數據庫仍然可以繼續運行同時應保證日志組的成員不應駐存在同一物理設備上因為這將削弱多重日志文件的作用
鏡像拷貝控制文件
控制文件描述通用的數據庫結構它存儲了大量數據庫狀態信息包括物理結構和聯機重作日志文件在當時的名稱位置狀態控制文件在數據庫啟動時被Oracle實例讀取保持打開並隨著操作而文件內容更新直到實例關閉為止在它打開的過程中能夠同步需要恢復的信息包括檢查點信息因此若損壞或丟失了控制文件Oracle將不能繼續工作因此應在系統中保持控制文件的多個拷貝且這些拷貝應置於安裝於不同磁盤控制器下的不同磁盤設備中
由於Oracle沒有提供對控制文件多工的完整支持因此應在對控制文件使用操作系統或硬件鏡像即在修改初始化文件的control_files參數後重新啟動數據庫前應將控制文件復制到定義的新位置否則數據庫啟動時將會出錯
激活歸檔進程
當數據庫運行於NOARCHIVELOG模式下時只能在完全關閉數據庫後進行數據庫的一致備份並且同時禁用了聯機重作日志的存檔這樣在Oracle實例失敗時只能將數據庫修復到最近的完整數據庫備份時的那一點上不能在失效點處對實例進行恢復而在ARCHIVELOG模式下數據庫不僅可以進行一致備份還可以在數據庫打開的情況下進行聯機備份通過數據庫的備份和聯機與存檔的重作日志文件用戶可以恢復所有已提交的事務並允許將數據庫恢復到指定的時間SCN或日志系列號處增大了恢復的靈活性減少了故障時的數據丟失因此數據庫應運行於ARCHIVELOG模式
在ARCHIVELOG模式下為了防止文件損壞和介質故障應把日志歸檔到不同的磁盤上這可以通過在初始化文件中為歸檔重作日志指定多個目標實現
數據庫實施較大改變時備份
因為控制文件中保存了數據庫的模式結構信息因此在對數據庫進行較大改變(包括改變表結構增加刪除日志文件或數據文件等)時應立即備份控制文件及相應的數據文件
使用RESETLOGS選項打開數據庫後進行備份
在以RESETLOGS選項打開數據庫後應對整個數據庫進行脫機或聯機的備份否則將不能恢復重置日志後的改變
當以RESETLOGS選項打開數據庫時Oracle將拋棄恢復中沒有應用的重復信息並確保永遠不再運用同時還將初始化控制文件中關於聯機日志和重作線程的信息清除聯機日志中的內容因此RESETLOGS前的歸檔日志的序列號將與RESETLOGS後的Oracle控制文件的要求值不相符(備份文件中的檢查點比控制文件中的檢查點舊)即在恢復中不能應用以前的歸檔日志文件從而導致RESETLOGS操作之前的備份在新形體中無用
避免備份聯機重作日志文件
由於文中提出了多工聯機重作日志文件且數據庫運行於ARCHIVELOG模式ARCH進程能夠將聯機重作日志歸檔因此不必對其進行備份若用備份的聯機重作日志文件重建它可能會引起日志文件序列號的混亂從而破壞數據庫得到適得其反的結果
重置聯機日志
在進行了不完全恢復或用備份控制文件進行恢復後應重置聯機日志
為了確保數據庫的一致性必須保證在恢復後所有數據文件都恢復到同一個時間點但不完全恢復可能導致數據文件中具有一個與其它文件不同的檢查點導致數據庫的一致性受到破壞同樣備份的控制文件中保存的SCN和計數器與當前日志文件中的值可能不同從而也破壞了數據庫的一致性因此應在進行完上述兩項操作後重置聯機日志
數據庫的邏輯備份
以上所述備份都為物理備份是實際物理數據庫文件從一處拷貝到另一處的備份除此之外還可使用Oracle提供的導出實用程序進行數據庫的邏輯備份Oracle同時還提供了相應的導入實用程序重建邏輯備份中保存的信息
邏輯備份只拷貝數據庫中的數據而不記錄數據位置的備份過程它利用SQL語句從數據庫中導出數據到一個存放在合適位置的外部文件中同時並可檢測到數據塊的損壞因此可用其作為物理備份的補充
備份策略
考慮到如今大部分信息系統每周的業務是×操作因此采用聯機備份否則可每隔一定時間進行一次脫機備份
應用上述規則可得出下述典型的備份策略
①鏡像拷貝重作日志文件
②鏡像拷貝控制文件
③激活歸檔進程即以ARCHIVELOG模式操作數據庫
④每天進行數據庫的部分聯機備份(每天進行數據庫的完全熱備份將無畏地增加數據庫的負擔且沒有必要同時也增加了數據庫恢復時的靈活性)
⑤每隔一周或幾周進行一次數據庫的邏輯備份
實際項目應用
當數據庫中的文件達到一定數量後DBA可能記不住該備份的文件的名或位置因此若能使備份過程自動化可有效地減輕DBA的負擔同時不會遺漏應備份的文件應用自動批處理文件及腳本文件可實現備份恢復的自動化下面簡介了在實際項目開發中應用本文所提出的自動備份恢復策略通過實際應用證明了該策略的正確性和可行性
()下述腳本實現聯機重作日志的多工
connect 賬戶名/密碼
alter database ktgis add logfile member 日志文件的存儲位置 to group 聯機日志組號;
shutdown immediate
startup pfile=初始化文件的存放位置 exclusive mount; 裝載數據庫且不打開
alter database archivelog; 激活歸檔進程
alter database open;
exit
()下列VB代碼自動建立聯機備份的批處理文件及相應的腳本文件
Set adoTmp = objConnectExecute(select tablespace_name from sysdba_data_files) 得到數據庫中的表空間名
Dim lnum As Long
Dim lnum As Long
lNum = FreeFile
Open 自動備份批處理文件路徑 For Binary As lNum
lnum = FreeFile
Open onlinebeginsql For Binary As lnum onlinebeginsql為設置表空間進入熱備份模式的腳本文件文件名
lnum = FreeFile
Open onlineendsql For Binary As lnum onlinebeginsql為結束表空間熱備份模式的腳本文件文件名
strTmp = connect 賬戶名/密碼 & Chr() & Chr()
Put lnum strTmp
strTmp = shutdown immediate & Chr() & Chr()
Put lnum strTmp
strTmp = startup pfile=初始化文件的存放位置exclusive mount; & Chr() & Chr()
Put lnum strTmp
strTmp = alter database archivelog; & Chr() & Chr()
Put lnum strTmp
strTmp = alter database open; & Chr() & Chr()
Put lnum strTmp
strTmp = connect 賬戶名/密碼 & Chr() & Chr()
Put lnum strTmp
strTmp = Oracle服務管理器路徑 & @ & onlinebeginsql & Chr() & Chr() 在服務管理器中執行腳本文件onlinebeginsql
Put lNum strTmp
Do While Not adoTmpEOF
Set adoTmp = objConnectExecute(select file_name from sysdba_data_files where tablespace_name= & adoTmpFields() & ) 得到當前表空間所對應的所有數據文件名通過循環即可得到所有表空間所對應數據文件名若只備份指定的表空間可指定表空間名從而得到其對應的物理數據文件
strTmp = alter tablespace & adoTmpFields() & begin backup; & Chr() & Chr() 將表空間置於熱備份模式
Put lnum strTmp
strTmp = Oracle的ocopyexe工具全路徑 & adoTmpFields() & & 備份文件存放路徑 & Chr() & Chr()
Put lNum strTmp
strTmp = alter tablespace & adoTmpFields() & end backup; & Chr() & Chr() 表空間恢復正常模式
Put lnum strTmp
adoTmpMoveNext
Loop
strTmp = Oracle服務管理器路徑 & @ & onlineendsql & Chr() & Chr() 在服務管理器中執行腳本文件onlineendsql
Put lNum strTmp
strTmp = exit & Chr() & Chr() 退出服務管理器
Put lnum strTmp
strTmp = alter system switch logfile; & Chr() & Chr() 強制日志轉換使Oracle創建一個歸檔日志文件
Put lnum strTmp
strTmp = exit & Chr() & Chr()
Put lnum strTmp
Close
Set adoTmp = Nothing
Set adoTmp = Nothing
運行得到的自動批處理文件即可自動進行數據庫的聯機備份
()在從備份中恢復數據文件後執行下列腳本將數據庫的恢復程序
connect賬戶名/密碼
shutdown abort
startup mount pfile=初始化文件的存放位置; 裝載數據庫
set autorecovery on; 打開自動恢復
recover database;
alter database open; 打開數據庫
結束語
提高數據庫災難後恢復的可靠性正越來越多地受到人們的關注本文根據個人在實際項目開發過程中的經驗及恢復時的靈活性對Oracle數據庫的備份及恢復進行了探討並提出了典型的備份策略用戶可以根據自己的實際情況及數據庫結構在此基礎上靈活應用
From:http://tw.wingwit.com/Article/program/Oracle/201311/18527.html