天天看點

閃回

閃回查詢,由一個新的包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,如需轉載請自行聯系原作者