引言 人為的錯誤是數據庫系統失敗的重要原因之一
根據調查約
%的系統問題是操作失誤或者用戶錯誤引起的
這些人為的錯誤又特別難以避免
傳統上當發生數據丟失
數據錯誤問題時
解決的主要方法就是數據的導入/導出
備份/恢復技術
這些方法都需要發生數據錯誤之前有一個正確的備份
才能進行恢復
恢復時不取決於錯誤程度
而只取決於備份/恢復策略
這種方法既耗時又使數據庫系統不能提供服務
對於一些用戶偶然地刪除數據這類小錯誤來說顯得有些
大材小用
那麼如何來恢復這種偶然的錯誤操作造成的數據丟失呢?從Oracle
i開始提供了基於回滾段的閃回查詢(Flashback Query)功能
可用於恢復錯誤的DML操作
在Oracle
g中對閃回查詢做了較大改進
不再局限於閃回查詢
還可用於恢復錯誤的DDL(Drop)操作
閃回表
閃回數據庫等
Oracle i的閃回查詢概述 Oracle
i的閃回查詢功能
在Oracle
i之前
如果用戶錯誤操作數據後
除了不完全恢復外
沒有好的解決辦法
Oracle
i中提供閃回查詢
由一個新的包DBMS_FLASH來實現
用戶使用閃回查詢可以及時取得誤操作DML(Delete
Update
Insert)前某一時間點數據庫的映像視圖
用戶可以利用系統時間或系統改變號(SCN
System Change Number)來指定這個只讀視圖
並可以針對錯誤進行相應的恢復措施
閃回查詢功能完全依賴於自動回滾段管理(AUM)
對於Drop等誤操作不能恢復
閃回特性可應用在以下方面
(
)自我維護過程中的修復
當一些重要的記錄被意外刪除
用戶可以向後移動到一個時間點
查看丟失的行並把它們重新插入現在的表內恢復
(
)恢復Email和聲音Email
當用戶意外刪除了Email或者聲音信息時
可以通過移回到固定時間點來恢復刪除
(
)賬號平衡狀況
可以查看以前的歷史數據
如銀行外幣管理中用於記錄特定時間的匯率
在以前
匯率變更被記錄在一個歷史表中
現在就可以通過閃回功能進行查詢
(
)用於趨勢分析的決策支持系統
決策支持系統和聯機分析應用必須執行一個長時間的事務
使用閃回查詢
這些應用可以對歷史數據執行分析和建模
例如
特定產品如礦泉水隨季節變化需求情況的變化
回滾段概述
回滾段用於存放數據修改之前的位置和值
回滾段的頭部包含正在使用的該回滾段事務的信息
回滾段的作用如下
(
)事務回滾
當事務修改表中數據的時候
該數據修改前的值(即前影像)會存放在回滾段中
當用戶回滾事務時
Oracle將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值
(
)事務恢復
當事務正在處理的時候
例程失敗
回滾段的信息保存在重做日志文件中
Oracle將在下次打開數據庫時利用回滾來恢復未提交的數據
(
)讀一致性
當一個會話正在修改數據時
其它的會話將看不到該會話未提交的修改
而且
當一個語句正在執行時
該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)
Oracle中Delete和Commit操作的流程分析
(
)刪除(Delete)流程
·Oracle讀Block(數據塊)到Buffer Cache(緩沖區)(如果該Block在Buffer中不存在)
·在Redo Log Buffer(重做日志緩沖區)中記錄Delete操作的細節
·在相應回滾段段頭的事物表中創建一個Undo(回滾)條目
·把將要刪除的記錄創建前鏡像
存放到Undo Block(回滾塊)中
·在Buffer Cache中的相應數據塊上刪除記錄
並且標記相應的數據塊為Dirty(髒)
(
)提交(Commit)流程
·Oracle產生一個SCN
·在回滾段事物表中標記該事物狀態為Commited
·LGWR(日志讀寫進程) Flush Log Buffer到日志文件
·如果此時數據塊仍然在Buffer Cache中
那麼SCN將被記錄到Block Header上
這被稱為快速提交
·如果Dirty Block已經被寫回到磁盤
那麼下一個訪問這個Block的進程將會自回滾段中獲取該事物的狀態
確認該事物被提交
然後這個進程獲得提交SCN並寫回到Block Header上
這被稱為延遲塊清除
Oracle
i中閃回查詢操作實例
進行閃回查詢必須設置自動回滾段管理
在init
ora設置參數UNDO_MANAGEMENT=AUTO
參數UNDO_RETENTION=n
決定了能往前閃回的最大時間
值越大就需要越多Undo空間
例
Oracle
i的Flashback Query操作
(
)創建閃回查詢用戶
SQL> create user flashtest identified by flashtest;
SQL> grant connect
resource to flashtest;
SQL> grant execute on dbms_flashback to flashtest;
SQL> connect flashtest/flashtest;
(
)創建測試表
插入測試記錄
SQL> create table test(id number(
));
SQL> insert into test values (
);
SQL> insert into test values(
);
SQL> commit;
SQL> create table rec_date(date_scn);
注意
在執行步驟
或者步驟
之前
等待
分鐘
(
)刪除記錄
SQL> execute dbms_flashback
disable;
SQL> insert into rec_date select sysdate from dual;
SQL> commit;
SQL> delete from test where id=
;
SQL> commit;
通過以上的操作
我們插入了兩條記錄
並刪除了其中一條記錄
在以下的操作中
我們將通過flashback query找到刪除的記錄
(
)閃回查詢
SQL> DECLARE
Restore_scn date;
BEGIN
Select date_scn into restore_scn from rec_date;
Dbms_flashback
enable_at_time (restore_scn);
END;
SQL> select * from test;
ID
可以看出
雖然刪除記錄並提交
但是通過閃回操作
仍能查詢到刪除前的兩條記錄
需要注意Oracle每
分鐘記錄一次SCN
並將SCN和對應時間的映射進行紀錄
如果原來插入的記錄到做閃回操作的時間在
分鐘之內
用基於時間的閃回查詢可能得不到記錄
因為基於時間點的查詢實際上是轉化為最近的一次SCN
然後從這個SCN開始進行恢復
因此
如果需要精確的查詢可以采用基於SCN的閃回查詢
可精確閃回到需要恢復的時間
可以通過DBMS_FLASHBACK
GET_SYSTEM_CHANGE_NUMBER語句獲取SCN
Oracle g的閃回查詢概述 與Oracle
i相比Oracle
g的Flashback有了非常大的改進
從普通的Flashback Query發展到了多種形式
主要表現在如下幾方面新特性
Flashback Database
Oracle Flashback Database特性允許通過SQL語句Flashback Database語句
讓數據庫前滾到當前的前一個時間點或者SCN
而不需要做時間點的恢復
閃回數據庫可以迅速將數據庫回到誤操作或人為錯誤的前一個時間點
如Word中的
撤消
操作
可以不利用備份就快速的實現基於時間點的恢復
Oracle通過創建新的Flashback Logs(閃回日志)
記錄數據庫的閃回操作
如果希望能閃回數據庫
需要設置如下參數
DB_RECOVER_FILE_DEST日志的存放位置
DB_RECOVER_FILE_DEST_SIZE恢復區的大小
在創建數據庫的時候
Oracle將自動創建恢復區
但默認是關閉的
需要執行alter database flashback on命令
例
執行Flashback Database命令格式
SQL>flashback database to time to_timestamp(xxx);
SQL>flashback database to scn xxx
Flashback Table
Oracle Flashback Table特性允許利用Flashback Table語句
確保閃回到表的前一個時間點
與Oracle
i中的Flashback Query相似
利用回滾段信息來恢復一個或一些表到以前的一個時間點(一個快照)
要注意的是
Flashback Table不等於Flashback Query
Flashback Query僅僅是查詢以前的一個快照點而已
並不改變當前表的狀態
而Flashback Table將改變當前表及附屬對象一起回到以前的時間點
語法
flashback table tablename to timestamp xxx或
flashback table tablename to scn xxx
注意
如果需要閃回一個表
需要以下條件
·需要有flashback any table的系統權限或者是該表的flashback對象權限
·需要有該表的select
insert
delete
alter權限
·必須保證該表row movement
例
執行將test表閃回到
年
月
日下午
點
SQL>flashback table test to timestamp to_timestamp(
:
:
yyyy
mm
dd hh
:mi:ss
);
Flashback Drop
Oracle Flashback Drop特性提供一個類似回收站的功能
用來恢復不小心被刪除的表
當刪除表時
Oracle
g並不立刻釋放被刪除的表所占用的空間
而是將這個被刪除的表進行自動重命名(為了避免同類對象名稱的重復)並放進回收站中
所謂的回收站類似於Windows系統中的回收站
是一個虛擬的容器
用於存放所有被刪除的對象
在回收站中被刪除的對象將占用創建時的同樣的空間
如果這個被刪除的表需要進行恢復
就可利用Flashback Drop功能
例
進行一個刪除表後恢復的簡單測試
(
)顯示回收站信息
SQL>show recyclebin;
可以看到
回收站中是沒有任何
From:http://tw.wingwit.com/Article/program/Oracle/201311/18545.html