閃回技術全瞭解

lpwebnet發表於2013-12-04
閃回技術:
Flashback 技術可以細分以下4種:
Flashback Database,
Flashback Drop,
Flashback Query(分Flashback Query, Flashback Version Query, Flashback Transaction Query 三種)
Flashback Table。
------------------------------------------------------------------
Flashback 技術是oracle 9i中引入的一種技術,
透過Flashback,可以查到過去某個時刻的一致性的資料。
這裡的一致性,是透過我們UNDO 表空間的前映象來實現的。
因此閃回與UNDO 表空間密切相關。
比如UNDO 表空間的大小,保留策略。
如果undo 被覆蓋了就不能進行閃回查詢。
show parameter undo

-------------------------------------------------------------------
在Oracle 10g中,增強了閃回查詢功能,
並且提供了將整個資料庫回退到過去某個時刻的能力,
這個功能是透過flashback log實現的。
flashback log有點類似redo log,只不過redo log將資料庫往前滾,
flashback log則將資料庫往後滾。
為了儲存管理和備份恢復相關的檔案,
oracle10g提供了一個叫做閃回恢復區(Flashback recovery area),
這個區域預設建立在oracle_base目錄下。 可以將所有恢復相關的檔案,
比如flashback log,archive log,backup set等,放到這個區域集中管理。


從Oracle 10g開始,在一些動態效能檢視裡面,
如 ( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )
都新增加了一列:IS_RECOVERY_DEST_FILE ,指明相關的檔案是否在恢復區內。

SELECT   recid, blocks, is_recovery_dest_file  FROM   v$archived_log  WHERE   recid < 5;

--------------------------------------------------------------------
Oracle 11g,閃回又出了一個新特性:
Oracle Flashback Data Archive.
FDA透過將變化資料儲存到另外建立的閃迴歸檔區(Flashback Archive)中,
這樣以和undo區別開來,這樣就可以為閃迴歸檔區單獨設定儲存策略,
也可以閃回到指定時間之前的舊資料而不影響undo策略,就是減少對UNDO的依賴性。
因為在一個很忙的系統,UNDO 儲存的時間是有限制的。 但透過FDA,我們就要靈活很多。


設定FRA 引數
show parameter db_recover

如果啟用了FRA,那麼要注意FRA 空間使用率。 預設歸檔檔案放在FRA裡,
如果FRA 空間滿了,就沒地方歸檔,資料庫會hang住。

alter system set db_recovery_file_dest_size=3G scope=both;


--------------------------------------------------------------------

create user conan identified by conan;
grant dba,connect,resource to conan;

conn conan/conan;
create table conan as select * from dba_objects;
select count(*) from dba_objects;

alter sesssion set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;

delete from conan where rownum<500;
commit;


恢復方法:
1、flashback
2、rman
3、logminer

select count(1) from conan as of timestamp to_timestamp('2013-12-02 16:00:00','yyyy-mm-dd hh24:mi:ss');

insert into ta select * from conan as of timestamp to_timestamp('2013-12-02 16:00:00','yyyy-mm-dd hh24:mi:ss');

--------------------------------------------------------------------

查詢閃回恢復區內容:
select file_type from v$flash_recovery_area_usage;




Flashback Database
如何啟用和禁用Flashback Database
資料庫的Flashback Database功能預設是關閉的,要想啟用這個功能,就需要做如下配置。
 
(1)配置Flash Recovery Area
(2)啟動flashback database
預設情況資料庫的flashback database是關閉,可以在mount exclusive狀態下開啟。在設定了閃回恢復區後,可以啟動閃回資料庫功能。

select flashback_on from v$database;

--資料庫必須已經處於歸檔模式:
SQL&get; archive log list;    
SQL&get; shutdown immediate;
SQL&get; startup mount;
SQL&get; alter database flashback on;
SQL&get; alter database open;
SQL&get; select flashback_on from v$database;



SQL&get; archive log list;    
SQL&get; shutdown immediate;
SQL&get; startup mount;
SQL&get; alter database flashback on;
SQL&get; alter database open;
SQL&get; select flashback_on from v$database;

---------------------------------------------------------------------
使用Flashback Database 實現對資料庫進行不完全恢復的示例

1、檢查是否啟動了flash recovery area
SQL&get; show parameter db_recovery_file

2、檢查是否啟用了歸檔
SQL&get; archive log list;

3、檢查是否啟用了flashback database
SQL&get; select flashback_on from v$database;

4、查詢當前的scn
SQL&get; SELECT CURRENT_SCN FROM V$DATABASE;

select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;

5、建立表

Create table dba as select * from dba_objects;

Selct count(*) from dba;

6、重啟DB 到mount
shutdown immediate
startup mount

7、執行恢復:分timestamp 或者SCN兩種

SQL&get; Flashback database to timestamp to_timestamp('12-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
SQL&get; Flashback database to scn 947921;

8、 開啟資料庫
alter database open resetlogs;
Select count(*) from dba;


Flashback Database

Flashback Drop 是從Oracle 10g 開始出現的,用於恢復使用者誤刪除的物件(包括表,索引等),
這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。

Flashback 不支援sys使用者。 system表空間下的物件,也不能從回收站裡拿到。
故使用SYS 或者SYSTEM使用者登陸時, show recyclebin 為空。


9、Tablespace Recycle Bin
從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當使用者執行drop命令時,
被刪除的表和表的關聯物件( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除,
這些物件先轉移到回收站中,這就給使用者提供了一個恢復的可能。

注意:dba_recyclebin只保留非SYSTEM表空間下的物件,
對於SYSTEM表空間的物件,在DROP的時候,也是直接刪除,不會放入回收站。
當一個物件drop後,並且開啟了回收站功能.它並沒有真正被刪除,實際上只是修改了一下名字,
我們用select * from user_objects where type= 'TABLE'還能查到.只是它的名字有點怪.

它的命名規範是BIN$unique_id$version  其中BIN代表RecycleBin,
unique_id是資料庫中該物件的唯一標誌,26個字元長度 ,version表示該物件的版本號.

初始化引數recyclebin 用於控制是否啟用recyclebin功能,預設是ON, 可以使用OFF關閉。

show parameter recycle

表空間的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所佔用的空間來緩解空間壓力。 因為索引是可以重建的。

10、檢視回收站內容

禁用後刪除的物件將直接刪除,不會寫到Recycle中,當然在刪除時,指定purge 引數,表也將直接刪除,不會寫到recyclebin中。

select count(1) from dave;
drop table dave;
show recyclebin

檢視recyblebin物件裡的內容:
SQL&get; select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";

11、Flashback Drop 例項操作

SQL&get; flashback table dave to before drop;

SQL&get; flashback table a to before drop rename to B;

Flashback Drop 需要注意的地方:
1). 只能用於非系統表空間和本地管理的表空間
2). 物件的參考約束不會被恢復,指向該物件的外來鍵約束需要重建。
3). 物件能否恢復成功,取決與物件空間是否被覆蓋重用。
4). 當刪除表時,信賴於該表的物化檢視也會同時刪除,但是由於物化檢視並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化檢視,需要dba 手工介入重新建立。
5). 對於Recycle Bin中的物件,只支援查詢.

12、 Flashback Query

Flashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄資料。
flashback query對v$tables,x$tables 等動態效能檢視無效,但對於dba_*,all_*,user_*等資料字典是有效的。

13、As  of  timestamp 的示例

SQL&get;select * from A as of timestamp to_timestamp('2012-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

檢視刪除之前的狀態:假設當前距離刪除資料已經有5 分鐘左右的話:
SQL&get; select * from A as of timestamp sysdate-5/1440;

14、  As of scn 示例

SCN

檢視SCN:
SQL&get;SELECT dbms_flashback.get_system_change_number FROM dual;
SQL&get;SELECT CURRENT_SCN FROM V$DATABASE;
 

 檢視刪除之前的狀態:
SQL&get; select * from A as of scn 1095782;


用Flashback Query恢復之前的資料:
SQL&get; insert into A select * from A as of scn 1095782;

15、 Flashback Query 函式,儲存過程,包,觸發器等物件

Flashback Drop 可以閃回與表相關聯的物件,
如果是其他的物件,比如function,procedure,trigger等。
這時候,就需要使用到ALL_SOURCE 表來進行Flashback Query。
 
檢視dba_source 的所有type
SQL&get; select type from dba_source group by type;


SQL&get; CREATE OR REPLACE function getdate return date
as
v_date date;
begin
   select  sysdate into v_date from dual;
   return v_date;
end;
/


SQL&get; alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
 
SQL&get; select getdate() from dual;


查詢dba_source 表:
SQL&get; select text from dba_source where name='GETDATE' order by line;


SQL&get; drop function getdate;

使用我們的Flashback Query 查詢:
SQL&get; select text from dba_source as of timestamp to_timestamp('2013-12-02 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17172228/viewspace-1062184/,如需轉載,請註明出處,否則將追究法律責任。

相關文章