Oracle flashback閃回技術
閃回查詢,由一個新的包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> select FLASHBACK_ON from v$database;
查看恢復路徑
SQL> show parameter recover
db_recovery_file_dest (恢復的路徑)
db_recovery_file_dest_size (區(qū)域里的配額)
閃回日志的位置
[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用戶又可以登陸了
===================================================
監(jiān)視flashback database
最早可以恢復到那個時間點
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24-mi-ss') from v$flashback_database_log;
---------------------------------
使用 閃回數據庫
SQL> shutdown abort
SQL> startup mount;
SQL> flashback database to timestamp to_timestamp('2012-03-12 02:22:22','yyyy-mm-dd hh24:mi:ss');
-----------------------------------
管理 閃回
SQL> show parameter recover
更改閃回目錄
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;
scott下
SQL> show recyclebin;(有數據了)
或
SQL> select object_name,original_name from recyclebin;
scott下
SQL> flashback table tt to before drop;
-----------------------------
什么時候是閃回不回來的
SQL> create tablespace tbs_test01 datafile '/oracle/app/oradata/TEST/tbs_test01.dbf' size 10M;
scott下
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(現在還可以閃回,再次刪除)
SQL> drop table tab_aaa;
創(chuàng)建tab_bbb表大于 tab_aaa表
SQL> create table tab_bbb tablespace tbs_test01
2 as select * from emp;
SQL> insert into tab_bbb select * from tab_bbb;
SQL> / (多執(zhí)行幾次寫滿表空間)
閃回不了
(只要這個表里有一個字節(jié)被覆蓋了,那么整個表也就恢復不會來了)
(或 清空回收站也不能閃回)
刪除表時 不放到回收站中
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> commit;
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> commit;
SQL> show recyclebin;(沒內容,undo也不能恢復)
顯示當前時間
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
顯示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
(有數據)
創(chuàng)建個新表裝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');
下一篇:oracle RAC ASM以及DB維護