Flashback家族一

     首先說一下flashback和flashback recovery的區別:
    1. recovery的恢復是基於數據文件的,先要restore備份好的數據文件,flashback是基於flashback log文件的,所以基點不一樣,recovery是基於備份的時間上的,可以恢復到備份至完整歸檔的任何一個時刻,而flashback是基於flashback log的,而log的存儲時效是受限於db_flashback_retention_target這個參數的(以分鐘爲單位,默認1440分鐘,即24小時)。


    2. recovery的恢復是應用redo記錄的,所以會對期間我們不關心的數據也進行修補,而flashback可以只針對我們關心的數據進行修補。


    3. recovery的恢復可以恢復數據文件物理損壞或者日誌物理損壞,而flashback是基於flashback log的,只能處理由於用戶的錯誤的邏輯操作,比如刪除了表,刪除了用戶等。


    由此可見,其實flashback和recovery的恢復還是有不少本質的差別的,因此我們要針對着相應的情況來進行相應的選擇。


下面進去正題:

Flashback 技術是以Undo segment中的內容爲基礎的, 因此受限於UNDO_RETENTON參數。要使用flashback 的特性,必須啓用自動撤銷管理表空間。 
在Oracle 10g中, Flash back家族分爲以下成員: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三種) 和Flashback Table。 
  
一. 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 段) 不會被物理刪除, 這些對象先轉移到回收站中,這就給用戶提供了一個恢復的可能。 


初始化參數recyclebin 用於控制是否啓用recyclebin功能,缺省是ON, 可以使用OFF關閉。 

SQL> show parameter recycle 

NAME                    TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
buffer_pool_recycle            string 
db_recycle_cache_size         big integer 0 
recyclebin                    string      on 

禁用該功能: 
SQL> alter system set recyclebin=off; 
SQL> alter system set recyclebin=on; 

SQL> alter session set recyclebin=off; 
SQL> alter session set recyclebin=on; 

禁用後刪除的對象將直接刪除,不會寫到Recycle中,當然在刪除時,指定purge 參數,表也將直接刪除,不會寫到recyclebin中。 
SQL> drop table name purge; 

查看recyclebin中的對象列表: 
SQL> select * from A; 
        ID 
        ---------- 
         1 
         2 
         3 
SQL> drop table A; 
表已刪除。 
SQL> show recyclebin 
ORIGINAL NAME    RECYCLEBIN NAME       OBJECT TYPE  DROP TIME 
----------------      -----------------------------          ------------       ------------------- 

A            BIN$RWXQQcTPRde0ws4h9ewJcg==$0  TABLE     2009-10-15:12:44:33 

查看recyclebin中對象: 
SQL> select original_name,object_name from recyclebin; 

ORIGINAL_NAME                    OBJECT_NAME 
-------------------------------- ------------------------------ 
A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0 

查看recyblebin對象裏的內容: 
SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0"; 
        ID 
       ---------- 
         1 
         2 
         3 
表空間的Recycle Bin 區域只是一個邏輯區域,而不是從表空間上物理的劃出一塊區域固定用於回收站,因此Recycle Bin是和普通對象共用表空間的存儲區域,或者說是Recycle Bin的對象要和普通對象搶奪存儲空間。當發生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。也可以手動的刪除Recycle Bin佔用的空間。 
1). Purge tablespace tablespace_name : 用於清空表空間的Recycle Bin 
2). Purge tablespace tablespace_name user user_name: 清空指定表空間的Recycle Bin中指定用戶的對象 
3). Purge recyclebin: 刪除當前用戶的Recycle Bin中的對象 
4). Purge dba_recyclebin: 刪除所有用戶的Recycle Bin中的對象,該命令要sysdba權限 
5). Drop table table_name purge:  刪除對象並且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復。 
6). Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢復表時,可以通過釋放該對象的index所佔用的空間來緩解空間壓力。 因爲索引是可以重建的。 
2. Flashback Drop 實例操作 
SQL> select original_name,object_name from recyclebin; 
ORIGINAL_NAME                    OBJECT_NAME 
-------------------------------- ------------------------------ 
A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0 
SQL> flashback table a to before drop; 
閃回完成。 
SQL> select * from a; 
        ID 
         ---------- 
         1 
         2 
         3 
當我們刪除表A後,在新建表A,這時在恢復的時候就會報錯,此時我們在閃回時,對錶重命名就可以了: 
SQL> drop table a; 
表已刪除。 
SQL> create table a 
  2  (id number(1)); 
表已創建。 
SQL> flashback table a to before drop ; 
flashback table a to before drop 

第 1 行出現錯誤: 
ORA-38312: 原始名稱已被現有對象使用 
SQL> flashback table a to before drop rename to B; 
閃回完成。 
SQL> select * from B; 
        ID 
        ---------- 
         1 
         2 
         3 
當我們刪除表A,在新建表A,在刪除它,這是在Recycle Bin中就會有2個相同的表明,此時恢復我們就要指定object_name才行. 
SQL> select * from B; 
        ID 
        ---------- 
         1 
         2 
         3 
SQL> drop table B; 
表已刪除。 
SQL> create table B(name varchar(20)); 
表已創建。 
SQL> drop table B; 
表已刪除。 
SQL> select original_name,object_name from recyclebin; 
ORIGINAL_NAME                    OBJECT_NAME 
--------------------------------            ------------------------------ 
B                                BIN$vYuv+g9fTi2exYP9X2048Q==$0 
B                                BIN$geQ9+NekSjuRvzG+TqDVWw==$0 
SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop; 
閃回完成。 
SQL> select * from B; 
        ID 
       ---------- 
         1 
         2 
         3 
一旦完成閃回恢復,Recycle Bin中的對象就消失了. Flashback Drop 需要注意的地方: 
1). 只能用於非系統表空間和本地管理的表空間 
2). 對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。 
3). 對象能否恢復成功,取決與對象空間是否被覆蓋重用。 
4). 當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,需要dba 手工介入重新創建。 
5). 對於Recycle Bin中的對象,只支持查詢. 

Flashback Query 

Flashback 是ORACLE 自9i 就開始提供的一項特性,在9i 中利用oracle 查詢多版本一致的特點,實現從回滾段中讀取表一定時間內操作過的數據,可用來進行數據比對,或者修正意外提交造成的錯誤數據,該項特性也被稱爲Flashback Query。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章