閃回查詢,由一個新的包DBMS_FLASH來實作。使用者使用閃回查詢可以及時取得誤操作DML(Delete、Update、Insert)前某一時間點資料庫的映像視圖,使用者可以利用系統時間或系統改變号(SCN:System Change Number)來指定這個隻讀視圖,并可以針對錯誤進行相應的恢複措施。閃回查詢功能完全依賴于自動復原段管理(AUM),對于Drop等誤操作不能恢複。
閃回的本質是利用空間來換取過去的時間,将undo資訊進行整理和"歸檔",按照時間片進行整理閃回日志,使用者閃回到相應的時間點,剩餘的資料是由redo日志和歸檔日志檔案進行前滾,因而閃回提供了to before resetlogs選項,開啟閃回功能前資料庫必須運作在歸檔模式,開啟資料庫閃回後将會産生rvwr程序.
檢視系統閃回功能
SQL> select FLASHBACK_ON from v$database;
(系統預設沒有開閃回功能)
設定閃回
SQL> shutdown immediate
SQL> startup mount;
SQL> alter database archivelog;(閃回必須運作在歸檔模式)
SQL> alter database FLASHBACK on;(閃回啟動)
SQL> alter database open;
檢視恢複路徑
SQL> show parameter recover
db_recovery_file_dest (恢複的路徑)
db_recovery_file_dest_size (區域裡的配額)
閃回日志的位置
[oracle@sq123 ~]$ cd /oracle/app/flash_recovery_area/TEST/flashback/
閃回保留時間(預設1天)
SQL> show parameter flashback
============================================
閃回資料庫(恢複到時間點,後的資料丢失)
檢視時間點
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
2012-03-12 06:36:30
SQL> drop user scott cascade;(删除scott使用者)
檢視最早可以恢複到的時間點
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
2012-03-12 05:49:59
SQL> shutdown abort
SQL> startup mount
恢複到删除使用者前的時間點
SQL> flashback database to timestamp to_timestamp('2012-04-24 05:40:51','yyyy-mm-dd hh24:mi:ss');
SQL> alter database open resetlogs;
scott使用者又可以登陸了
===================================================
監視flashback database
最早可以恢複到那個時間點
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24-mi-ss') from v$flashback_database_log;
---------------------------------
使用 閃回資料庫
SQL> flashback database to timestamp to_timestamp('2012-03-12 02:22:22','yyyy-mm-dd hh24:mi:ss');
-----------------------------------
管理 閃回
更改閃回目錄
SQL> alter system set db_recovery_file_dest='/home/oracle/flash';
===============================
flashback drop 使用
drop表時,等于把表放到資源回收筒中(預設情況下,Oracle是将此功能開啟的。)
檢視資源回收筒
SQL> show parameter recyclebin
SQL> show recyclebin; (沒有内容,sysdba的drop操作是不會送到recyclebin)
scott下
SQL> create table ttttt(d int);
SQL> drop table tt;
SQL> commit;
SQL> show recyclebin;(有資料了)
或
SQL> select object_name,original_name from recyclebin;
SQL> flashback table tt to before drop;
-----------------------------
什麼時候是閃回不回來的
SQL> create tablespace tbs_test01 datafile '/oracle/app/oradata/TEST/tbs_test01.dbf' size 10M;
SQL> create table tab_aaa tablespace tbs_test01
2 as select * from emp;
SQL> drop table tab_aaa;
SQL> flashback table tab_aaa to before drop(現在還可以閃回,再次删除)
建立tab_bbb表大于 tab_aaa表
SQL> create table tab_bbb tablespace tbs_test01
SQL> insert into tab_bbb select * from tab_bbb;
SQL> / (多執行幾次寫滿表空間)
閃回不了
(隻要這個表裡有一個位元組被覆寫了,那麼整個表也就恢複不會來了)
(或 清空資源回收筒也不能閃回)
删除表時 不放到資源回收筒中
SQL> drop table tab_bbb purge;
(purge 為不放進資源回收筒)
SQL> show recyclebin;(沒有删除記錄)
-----------------------------------------
回收資源回收筒
SQL> purge recyclebin;
SQL> show recyclebin;(沒内容了)
=============================================
flashback query
(Flashback Query 是利用多版本讀一緻性的特性從UNDO 表空間讀取操作前的記錄資料)
SQL> create table t(id int);
SQL> insert into t values(11);
SQL> drop table t;
SQL> show recyclebin;
閃回并重命名
SQL> flashback table t to before drop rename to haha;
SQL> select * from haha;
SQL> delete from haha;
SQL> show recyclebin;(沒内容,undo也不能恢複)
顯示目前時間
顯示38分這個時間點上的資料
SQL> select * from haha as of timestamp to_timestamp('2012-03-12 01:38:00','yyyy-mm-dd hh24:mi:ss');
no rows selected(沒有資料)
顯示36分這個時間點上的資料
SQL> select * from haha as of timestamp to_timestamp('2012-03-12 01:36:00','yyyy-mm-dd hh24:mi:ss');
ID
----------
11
(有資料)
建立個新表裝haha裡的資料
SQL> create table hehe as select * from haha as of timestamp to_timestamp('2012-03-12 01:36:00','yyyy-mm-dd hh24:mi:ss');
(前提條件是,undo表空間不能被覆寫)
本文轉自陳繼松 51CTO部落格,原文連結:http://blog.51cto.com/chenjisong/1737592,如需轉載請自行聯系原作者