程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle閃回數據庫詳解

oracle閃回數據庫詳解

編輯:Oracle教程

--- 說明閃回數據庫

--- 使用閃回表將表內容還原到過去的特定時間點

--- 從刪除表中進行恢復

--- 使用閃回查詢查看截止到任一時間點的數據庫內容

--- 使用閃回版本查詢查看某一行在一段時間內的各個版本

--- 使用閃回事務查詢查看事務處理歷史記錄或行

優點:

閃回技術由於只能處理更改數據,所以從根本上改變了恢復技術。使用這個技術時,從錯誤中恢復花費的時間等於制造錯誤所花費的時間。當閃回技術使用時,它與介質恢復相比,在易用性、可用性和還原時間方面有明顯的優勢。

閃回數據庫使用閃回日志執行閃回。閃回刪除使用回收站。其他所有功能都使用還原數據。

\

閃回數據庫 -----這個功能可撤銷導致邏輯數據損壞的更改

就是當出現邏輯錯誤時,能夠將整個數據庫回退到出錯前的那個時間點上,

閃回數據庫的日志文件不是由傳統的Log Writer (LGWR)進程寫入,而是由一個稱為RecoVery WRiter (RVWR)的新進程寫入,閃回日志文件由RCWR進程在恢復區中自動創建和維護。

[Z喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmFjbGVAdHlnZXIgfl0kIHBzIC1lZg=="grep rvwr|grep -v grep
oracle 8414 1 0 14:33 ? 00:00:00 ora_rvwr_ORCL

可以使用閃回數據庫的場景包括

1. 用戶截斷了表(trucate)

2. 系統管理員誤刪除了用戶

3. 用戶錯誤的執行了某個批處理任務,或者該批處理任務的腳本編寫錯誤,使得多個表的數據發生混亂,我們無法采用閃回表的方式進行恢復

實現閃回數據庫的基礎是閃回日志,只要我們配置了閃回數據庫,就會自動創建閃回日志。這時,只要數據庫裡的數據發生變化,oracle就會將數據被修改前的舊值保存在閃回日志裡,當我們需要閃回數據庫時,oracle就會讀取閃回日志裡的記錄,並應用到數據庫上,從而將數據庫回退到歷史的某個時間點上。

\

閃回數據庫:減少還原時間

閃回數據庫比使用還原文件和重做日志文件的傳統時間點恢復的速度要更快。隨著數據庫規模的增加,通過還原所有數據文件來執行傳統的時間點恢復所需的時間長度變得不太現實。使用閃回數據庫時,因為不要需要還原數據文件,所以恢復數據庫的時間與需要回退的更改數目(而不是數據庫大小)成比例。

閃回數據庫是通過使用一類被稱為閃回數據庫日志的日志文件來實施的。oracle數據庫會定期將數據塊的“前像”記錄在閃回數據庫日志中。為了快速將數據文件更改回退到捕獲閃回日志的時間(就在所需目標時間之前),可以重用塊前像。然後,應用重做日志文件中的更改來填充間隔。在快速恢復區中會自動創建和管理閃回數據庫日志。

在不能使用閃回數據庫功能的情況下,必須使用不完全恢復操作將數據庫返回到特定時間。閃回數據庫操作完成後,可在只讀模式下打開數據庫,驗證是否使用了正確的目標時間或系統更改號(SCN)。如果沒有,可以再次閃回數據庫,或者通過執行恢復操作來前滾數據庫。因此,要撤銷閃回數據庫操作,必須向前恢復數據庫。

注:閃回保留目標並不能絕對保證閃回可用。如果閃回恢復區中必須存在的文件需要占用空間,可能會自動刪除閃回日志。

閃回數據庫操作完成後,必須使用以下一種方法打開數據庫:

· 在只讀模式下驗證是否使用了正確的目標時間或SCN

· 使用RESETLOGS 參數才允許進行更新

閃回數據庫限制:(不能使用閃回數據庫)

· 已還原或重新創建了控制文件

· 已刪除了表空間

· 已收縮了數據文件

不能使用閃回數據庫恢復自閃回目標時間以來已刪除的數據文件。

刪除的數據文件會添加到控制文件中且標記為脫機,但是不會閃回。

閃回數據庫不能閃回自閃回目標時間以來已收縮的數據文件,這種數據文件必須先脫機,才能執行閃回操作。

實驗1:啟用閃回數據庫

1. 設置閃回恢復區保留時間3天

SYS@ORCL>show parameter flashback


NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
db_flashback_retention_target integer 1440 //db_flashback_retention_target 用於定義一個時間上限 單位是分鐘

SYS@ORCL>alter system set db_flashback_retention_target=4320;

SYS@ORCL>show parameter flashback


NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
db_flashback_retention_target integer 4320

2. 查看當前閃回狀態,未開啟閃回,開啟閃回(mount狀態開啟閃回)

SYS@ORCL>select flashback_on from v$database;


FLASHBACK_ON
------------------
NO


SYS@ORCL>alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.

SYS@ORCL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ORCL>startup mount;
ORACLE instance started.

Total System Global Area 314572800 bytes
Fixed Size 1219160 bytes
Variable Size 121636264 bytes
Database Buffers 188743680 bytes
Redo Buffers 2973696 bytes
Database mounted.

3. 開啟閃回,必須在歸檔模式下開啟

SYS@ORCL>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 29
Next log sequence to archive 31
Current log sequence 31

SYS@ORCL>alter database flashback on;


Database altered.

4. 打開數據庫,查看閃回狀態

SYS@ORCL>alter database open;


Database altered.


SYS@ORCL>select flashback_on from v$database;


FLASHBACK_ON
------------------
YES


SYS@ORCL>

實驗2:閃回數據庫用途 -----實驗參考eygle 的循序漸進oracle

SYS@ORCL>conn tyger/tyger
Connected.
TYGER@ORCL>select count(*) from tyger;


COUNT(*)
----------
1


TYGER@ORCL>select count(*) from test;


COUNT(*)
----------
14


TYGER@ORCL>alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss';


Session altered.


TYGER@ORCL>select sysdate from dual;


SYSDATE
-------------------
2014-03-11 15:47:14


TYGER@ORCL>truncate table tyger;


Table truncated.


TYGER@ORCL>select sysdate from dual;


SYSDATE
-------------------
2014-03-11 15:47:38


TYGER@ORCL>truncate table test;


Table truncated.


TYGER@ORCL>select sysdate from dual;


SYSDATE
-------------------
2014-03-11 15:48:03

閃回需要在Mount狀態下進行,可以指定Timestamp/SCN/Sequence進行閃回。

首先將數據庫閃回到第一時間點,以Redo only的方式打開數據庫:

SYS@ORCL>startup mount;
ORACLE instance started.


Total System Global Area 314572800 bytes
Fixed Size 1219160 bytes
Variable Size 130024872 bytes
Database Buffers 180355072 bytes
Redo Buffers 2973696 bytes
Database mounted.
SYS@ORCL>flashback database to timestamp
2 to_timestamp('2014-03-11 15:47:14','yyyy-mm-dd hh24:mi:ss');


Flashback complete.


SYS@ORCL>alter database open read only; //以read only原因:如果數據恢復的不夠理想,可以關閉數據庫繼續進行恢復


Database altered.


SYS@ORCL>select count(*) from tyger.tyger;


COUNT(*)
----------
1


SYS@ORCL>select count(*) from tyger.test;


COUNT(*)
----------
14

數據恢復不理想,繼續進行恢復 ---前提:以redo only打開數據庫

SYS@ORCL>startup mount;
ORACLE instance started.


Total System Global Area 314572800 bytes
Fixed Size 1219160 bytes
Variable Size 130024872 bytes
Database Buffers 180355072 bytes
Redo Buffers 2973696 bytes
Database mounted.
SYS@ORCL>flashback database to timestamp
2 to_timestamp('2014-03-11 15:47:38','yyyy-mm-dd hh24:mi:ss');


Flashback complete.


SYS@ORCL>alter database open read only;


Database altered.


SYS@ORCL>select count(*) from tyger.tyger;


COUNT(*)
----------
0


SYS@ORCL>select count(*) from tyger.test;


COUNT(*)
----------
14

如果數據恢復確認完成,就可以以resetlogs打開數據庫,恢復工作 ------重置日志,不能再flashback至resetlogs之前的時間點

SYS@ORCL>alter database open resetlogs;


Database altered.

oracle閃回表詳解:http://blog.csdn.net/wanghui5767260/article/details/21084031

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved