隨著辦公自動化和電子商務的飛速發展
企業對信息系統的依賴性越來越高
數據庫作為信息系統的核心擔當著重要的角色
尤其在一些對數據可靠性要求很高的行業如銀行
證券
電信等
如果發生意外停機或數據丟失其損失會十分慘重
為此數據庫管理員應針對具體的業務要求制定詳細的數據庫備份與災難恢復策略
並通過模擬故障對每種可能的情況進行嚴格測試
只有這樣才能保證數據的高可用性
數據庫的備份是一個長期的過程
而恢復只在發生事故後進行
恢復可以看作是備份的逆過程
恢復的程度的好壞很大程度上依賴於備份的情況
此外
數據庫管理員在恢復時采取的步驟正確與否也直接影響最終的恢復結果
本文主要針對Oracle數據庫可能遇到的各種故障提供了相應的恢復的方法
僅供大家參考
要對Oracle數據庫備份與恢復有清晰的認識
首先有必要對數據庫的幾種運行狀態有充分的了解
Oracle數據庫的運行狀態主要分為
種
他們依次為
l Nomount(非安裝)Oracle只是讀取ini文件中的配置信息
並初始化SGA區
l Mount(安裝)Oracle除了需要讀取ini文件還要讀取控制文件
並從中獲取有關數據庫的物理結構等信息
l Open(打開)數據庫要檢查所有文件處於同一時間點
對錯誤進行恢復對未完成事務回滾
並最終可以允許用戶訪問
數據庫的備份主要分為三種類型
冷備份
熱備份
邏輯備份
數據庫的備份不是本文討論的重點
在這裡只作一個概要的介紹
Oracle數據庫備份主要有
l Cold Backup(冷備份) 主要指在關閉數據庫的狀態下進行的數據庫完全備份
備份內容包括所有數據文件
控制文件
聯機日志文件
ini文件
l Hot Backup(熱備份) 指在數據庫處於運行狀態下
對數據文件和控制文件進行備份
要使用熱備份必須將數據庫運行在(Archive Log)歸檔方式下
l Export(邏輯備份)這是最簡單的備份方法
可按數據庫中某個表
某個用戶或整個數據庫來導出
並且支持全部
累計
增量三種方式
使用這種方法
數據庫必須處於打開狀態
而且如果數據庫不是在restrict狀態將不能保證導出數據的一致性
數據庫的恢復可分為兩大類
完全恢復
不完全恢復
完全恢復指將數據庫恢復到發生故障的時間點
不丟失任何數據
不完全恢復指將數據庫恢復到發生故障前的某一個時間點
此時間點以後的所有改動將會丟失
如果沒有特殊需求
我們建議應盡量使用完全恢復
Oracle數據庫的恢復過程分兩步進行
首先將把存放在重做日志文件中的所有重做運用到數據文件
之後對重做中所有未提交的事務進行回滾
這樣所有數據就恢復到發生災難那一時刻了
數據庫的恢復只能在發生故障之前的數據文件上運用重做
將其恢復到故障時刻
而不能將數據文件反向回滾到之前的某一個時刻
舉個例子
我們有一個
/
/
的數據庫備份
當
/
/
使我們發現數據庫中數據發生混亂
希望將數據庫恢復到
/
/
時的狀態
我們只能先恢復
/
/
的數據庫備份然後在其上運用重做記錄使其前滾到
/
/
時的狀態
而不能將
/
/
的數據庫向後回滾到
/
/
為了系統的設計數據庫的恢復方案
我們先對可能遇到的錯誤進行分類
Oracle數據庫錯誤主要分為
大類
l SQL語句失敗
l 線程失敗
l 實例失敗
l 用戶操作失敗
l 存儲設備失敗
如果發生前三種失敗
不需要我們人為干涉
Oracle系統會自動進行恢復
對於用戶操作型的失敗(如誤刪除數據)
我們采取的補救措施主要有導入最新的邏輯備份或進行到某一時間點的不完全恢復
從Oracle
之後的新版本中引入了基於表空間的時間點恢復(TSPITR)
可以單獨將包含錯誤操作的表空間恢復到指定時間
而不必對整個數據庫進行不完全恢復
當錯誤操作發現比較及時而且數據量不大的情況下也可以考慮使用logminer生成反向SQL
針對存儲設備的失敗的情況比較復雜也是本文討論的重點
存儲設備的失敗必然會使放置在其上的文件變為不可用
我們先將Oracle數據庫所涉及到的文件進行一個劃分
主要可分為
l Oracle的系統文件
指Oracle的運行文件
各種應用程序
l 數據庫控制文件
l 數據庫聯機重做日志文件
l 數據文件
l 歸檔日志文件
避免第一種文件失敗主要依賴系統管理員進行操作系統級的備份
當發生事故後只能依靠操作系統備份將其恢復
控制文件中記錄著整個數據庫的結構
每個數據文件的狀況
系統SCN
檢查點計數器等重要信息
在創建數據庫時會讓用戶指定三個位置來存放控制文件
他們之間互為鏡像
當其中任何一個發生故障
只需將其從ini文件中注釋掉故障數據文件就可重新將數據啟動
當所有控制全部失效時
可以在Nomount模式下執行create controlfile來重新生成控制文件
但必須提供redo log
data file
文件名和地址以及MAXLOGFILES
MAXDATAFILES
MAXINSTANCES等信息
如果失敗之前運行過alter database backup controlfile to trace或alter database backup controlfile to
xxx
對控制文件作備份
恢復時可使用生成的腳本來重建或用備份文件覆蓋
如果使用了舊的控制文件在恢復時要使用recover xxx using backup controlfile選項來進行恢復
並使用resetlogs選項來打開數據庫
如果丟失的是聯機日志文件
分兩種情況處理
丟失的是非活動的日志文件
丟失的是當前激活的日志文件
如果是第一種情況
而發生故障的日志文件組又具有多個成員
可以先將數據庫shutdown
然後用操作系統命令將損壞日志文件組中好的日志成員文件把損壞的成員文件覆蓋(在同一個日志成員組中的所有日志文件的各為鏡象的)
如果其物理位置不可用可將其拷貝到新的驅動器上
使用alter database rename file
xxxx
to
xxxx
改變文件位置
之後啟動數據庫
如果正常馬上進行一個冷備份
如果損壞的日志組中只有一個日志成員
先mount上數據庫
將其轉換為noarchivelog模式
執行alter database add logfile member
xxx
to group
x
給相關組增加一個成員
再執行alter database drop logfile member
bad_file
將損壞的日志文件刪除
由於數據庫的結構發生變動需要備份控制文件
之後將數據庫改回archivelog模式
做一個冷備份
如果丟失的是當前激活的日志文件
數據庫又沒有鏡像而且當前日志組中所有成員均變為不可用
首先將數據庫shutdown abort
從最近的一次全備份中恢復所有的數據文件
將數據庫啟動到mount狀態
如果原來的日志文件物理位置不可用
使用alter database rename file
xxx
to
xxx
改變文件的存放位置
然後
使用recover database until cancel命令來恢復數據庫
直到提示最後一個歸檔日志運用完之後
輸入cancel
之後用alter database open resetlogs打開數據庫
如果沒有問題
立即進行一個冷備份
注意!所有包含在損壞的redo log中的信息將會丟失
也就是說數據庫崩潰前已經提交的數據有可能會丟失
這對於某些要求很高的應用將會損失慘重
因此應盡量使每個日志組具有多個日志成員
並且放置在不同的驅動器上一防止發生介質故障
數據文件發生故障的情況也分為多種情況
丟失包含在SYSTEM表空間的數據文件
丟失沒有回滾段的非SYSTEM數據文件
丟失有回滾段的非SYSTEM數據文件
如果損壞的是系統表空間的數據文件
唯一的辦法是從上一次備份中恢復受損的數據文件
(如果原位置不可用使用alter database rename命令改變新文件的位置)
之後在數據庫mount的狀態下執行recover database/datafile對數據庫進行回復
才能將數據庫打開
注意
當SYSTEM表空間或其中的數據文件脫機
數據庫是無法被打開的
因此必須在mount狀態下將所有的恢復工作完成
當丟失的數據文件不屬於系統表空間而且也不包含回滾段時
有可選擇在數據庫的兩種狀態下進行恢復
在數據庫open的狀態或者在數據庫mount的狀態
如果用戶急於訪問數據庫中未受損部分的數據或對損壞的數據文件進行恢復需要很長時間
可以先使受損的數據文件脫機
將數據庫打開給用戶訪問
再恢復受損的數據文件最後將其聯機
步驟如下
先在數據庫mount時
將相關的數據文件或表空間進行脫機alter database datafile xxx offline
然後將數據庫open
這樣就能使數據庫未受損的部分先供用戶訪問
之後再進行recover datafile/tablespace
完成後用alter database datafile/tablespace
xxx
online使其恢復聯機就可被訪問了
當然用戶也可以選擇在數據庫mount狀態下
用recover database/datafile將所有的恢復工作做完
將所有數據文件一起打開供用戶訪問
如果丟失的數據文件是最後一種情況
即包含有回滾段的非系統表空間數據文件
也可以選擇是在數據庫先open的狀態還是在mount狀態下恢復
不過與上一種情況不同的是當包含回滾段的數據文件損壞時
如果使其先offline將數據庫打開
那麼所有數據庫崩潰前未提交的事務涉及到的表將無法訪問
也就是說在回滾段恢復前其中涉及的對象都不允許被訪問
而且當所有包含回滾段的數據文件都在offline狀態時
數據庫無法進行任何DML操作
因此在數據庫open狀態恢復包含回滾段的數據文件時
可以先創建幾個臨時回滾段供數據使用create rollback segment temp
tablespace system; alter rollback segment temp
online;
當數據文件恢復後再將他們刪除alter rollback segment temp
offline; drop rollback segment temp
;
注意
當用這種方法使恢復的數據文件online之後
所有的原有回滾段將處於offline狀態
必須手工使用alter rollback segment RBSxx online;使他們恢復聯機狀態
這樣才能被數據庫正常使用
如果在數據庫mount狀態下完成所有恢復
則不需要上述步驟
如果丟失數
From:http://tw.wingwit.com/Article/program/Oracle/201311/11196.html