一. Flashback Database
Flashback Database 功能非常類似與RMAN的不完全恢復, 它可以把整個資料庫回退到過去的某個時點的狀態, 這個功能依賴於Flashback log 日誌。 比RMAN更快速和高效。 因此Flashback Database 可以看作是不完全恢復的替代技術。 但它也有某些限制:
1. Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇
2. 如果刪除了資料檔案或者利用Shrink技術縮小資料檔案大小,這時不能用Flashback Database技術回退到改變之前的狀態,這時候就必須先利用RMAN把刪除之前或者縮小之前的檔案備份restore 出來, 然後利用Flashback Database 執行剩下的Flashback Datbase。
3. 如果控制檔案是從備份中恢復出來的,或者是重建的控制檔案,也不能使用Flashback Database。
4. 使用Flashback Database鎖能恢復到的最早的SCN, 取決與Flashback Log中記錄的最早SCN。
Flashback Database 架構
Flashback Database 整個架構包括一個程式Recover Writer(RVWR)後臺程式,Flashback Database Log日誌 和Flash Recovery Area。一旦資料庫啟用了Flashback Database, 則RVWR程式會啟動,該程式會向Flash Recovery Area中寫入Flashback Database Log, 這些日誌包括的是資料塊的 " 前映象(before image)", 這也是Flashback Database 技術不完全恢復塊的原因。
[oracle@dba ~]$ ps -ef|grep rvw
oracle 12620 12589 0 13:21 pts/1 00:00:00 grep rvw
啟用Flashback Database
資料庫的Flashback Database功能預設是關閉的,要想啟用這個功能,就需要做如下配置。
1. 配置Flash Recovery Area
要想使用Flashback Database, 必須使用Flash Recovery Area,因為Flashback Database Log只能儲存在這裡。 要配置的2個引數如下,一個是大小,一個是位置。如果資料庫是RAC,flash recovery area 必須位於共享儲存中。資料庫必須處於archivelog 模式.
啟用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH;
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH;
禁用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;
對於Flash Recovery Area,Oracle 是這樣建議的,flash recovery area 設定的越大,flashback database 的恢復能力就越強,因此建議flash recovery area 能夠放的下所有的資料檔案,增量備份,以及所有尚未備份的歸檔檔案,當然還有它自己產生的flashback logs。
在資料庫執行過程中,oracle 自動向該區域寫入檔案,當剩餘空間不足15%的時候,它就會在alert 中增加警告,提示你空間不足。但此時不會影響資料庫的正常運轉,直到所有空間統統被用掉之後,oracle 首先嚐試刪除尋些過期的檔案,冗餘檔案或備份過的檔案,如果這些做完了,還是沒有空閒空間的話,資料庫就被hang 住了。
對於因Flash Recovery Area導致的資料庫hang的處理,請參考:
http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668991.aspx
或者
http://user.qzone.qq.com/251097186/blog/1244650673
2. 啟用資料庫Flashback 功能
1). 資料庫啟動到mount狀態
SQL> startup mount;
2). 檢查Flashback 功能, 預設時功能是關閉的。
SQL> select name, current_scn, flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
-------- ----------- ------------------
DBA 945715 NO
3). 啟動Flashback功能
SQL> alter database flashback on;
資料庫已更改。
SQL> select name, current_scn, flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
DBA 0 YES
4). 設定初始化引數:DB_FLASHBACK_RETENTION_TARGET:
SQL>alter system set db_flashback_retention_target=1440 scope=both;
該引數用來控制flashback log 資料保留的時間,或者說,你希望flashback database 能夠恢復的最早的時間點。預設值是1440,單位是minute,即24 小時,需要注意的是該引數雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如資料庫每天有10%左右的資料變動的話,如果該初始化引數值設定為1440,則flash recovery area 的大小至少要是當前資料庫實際容量的10%,如果該初始化引數設定為2880,則flash recovery area 的大小就至少是資料庫所佔容量的20%。
5). 啟動資料庫
SQL>alter database open;
Flashback Database操作示例
做操作前先備份資料庫
RMAN> backup database;
1. 檢查是否啟動了flash recovery area:
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest tring D:oracle/flash_recovery_area
db_recovery_file_dest_size big integer 1G
2. 檢查是否啟用了歸檔
SQL> archive log list;
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 9
下一個存檔日誌序列 11
當前日誌序列 11
3. 檢查是否啟用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
4. 查詢當前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
947921
5. 查詢當前的時間
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
09-10-14 14:37:05
6. 刪除表A
SQL> select * from A;
ID NAME
---------- ----------
1 tianle
2 dave
SQL> drop table A;
表已刪除。
SQL> commit;
7. Flashback Database 實際是對資料庫的一個不完全恢復操作,因為需要關閉資料庫重啟到mount狀態。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area 209715200 bytes
Fixed Size 1248116 bytes
Variable Size 79692940 bytes
Database Buffers 121634816 bytes
Redo Buffers 7139328 bytes
資料庫裝載完畢。
8. 執行恢復:分timestamp 或者SCN兩種
SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd
hh24:mi:ss');
閃回完成。
或者:
SQL> Flashback database to scn 947921;
閃回完成。
9. 開啟資料庫:
在執行完flashback database 命令之後,oracle 提供了兩種方式讓你修復資料庫:
1). 直接alter database open resetlogs 開啟資料庫,當然,指定scn 或者timestamp 時間點之後產生的資料統統丟失。
2). 先執行alter database open read only 命令以read-only 模式開啟資料庫,然後立刻透過邏輯匯出的方式將誤操作涉及表的資料匯出,再執行recover database 命令以重新應用資料庫產生的redo,將資料庫修復到flashback database 操作前的狀態,然後再透過邏輯匯入的方式,將之前誤操作的表重新匯入,這樣的話對現有資料的影響最小,不會有資料丟失。
這裡演示,就以resetlogs方式開啟:
SQL> alter database open resetlogs;
資料庫已更改。
驗證資料:
SQL> select * from A;
ID NAME
---------- ----------
1 tianle
2 dave
和Flashback Database 相關的2個檢視:
1. V$database
這個檢視可以檢視是否啟用了Flashback database功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2. V$flashback_database_log
Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少, 該檢視就可以檢視許多有用的資訊。
Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點
Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小
Retention_target: 系統定義的策略
Estimated_flashback_size: 根據策略對需要的空間大小的估計值
SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh2
4:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;
OS OT RT FS ES
---------- ----------------- ---------- ---------- ----------
946088 09-10-14 13:49:59 1440 16384000 350920704
3. V$flashback_database_stat
這個檢視用來對Flashback log 空間情況進行更細粒度的記錄和估計。 這個檢視以小時為單位記錄單位時間內資料庫的活動量,Flashback_Data 代表Flashback log產生數量,DB_Date 代表資料改變數量,Redo_Date代表日誌數量,透過這3個數量可以反映出資料的活動特點,更準確的預計Flash Recovery Area的空間需求
SQL> alter session set nls_date_format='hh24:mi:ss';
會話已更改。
SQL> select *from v$flashback_database_stat;
BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------- -------- -------------- ---------- ---------- ------------------------
14:43:10 15:15:28 6455296 29310976 3898368 0
Flashback DROP
Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復使用者誤刪除的物件(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。
Flashback 不支援sys使用者. system表空間下的物件,也不能從回收站裡拿到。故使用SYS 或者SYSTEM使用者登陸時, show recyclebin 為空。
1. Tablespace Recycle Bin
從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當使用者執行drop命令時, 被刪除的表和表的關聯物件( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除, 這些物件先轉移到回收站中,這就給使用者提供了一個恢復的可能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-1060246/,如需轉載,請註明出處,否則將追究法律責任。