閃回
閃回是10g的一個新特性 ,開啓閃回數據庫必須處於mount狀態並且還要開啓歸檔。
Databasemounted.
sys@OCP>alter database flashback on;
alterdatabase flashback on
*
ERROR atline 1:
ORA-38706:Cannot turn on FLASHBACK DATABASE logging.
ORA-38707:Media recovery is not enabled. --- 必須開啓閃回
sys@OCP>alter database archivelog;
Databasealtered.
sys@OCP>alter database flashback on;
Databasealtered.
第01章 閃回查詢(查過去某時間點,基於undo)
Oracle10g對於閃回查詢進行了增強,支持更簡單的 SQL 操作,允許對誤刪
誤更新等 DML操作進行閃回。Flashback Query 僅僅是查詢以前的一個快照
而已,並不改變當前表的狀態,
1. 原表記錄
hr@OCP> select count(*) from t1;
COUNT(*)
----------
3
2. 刪除記錄並提交更改
hr@OCP>delete from t1;
3 rowsdeleted.
hr@OCP>commit;
Commit complete.
3. 獲取當前的scn號
[oracle@station10 ~]$ date
Fri Aug 2 16:12:55 CST 2013
sys@OCP> selectdbms_flashback.get_system_change_number scn from dual;
SCN
----------
641612
hr@OCP>select count(*) from t1 as of scn 641400;
selectcount(*) from t1 as of scn 64100
*
ERROR atline 1:
ORA-01466: unable to read data - table definition haschanged ---不能查詢在表定義之前
hr@OCP>select count(*) from t1 as of scn 641450;
COUNT(*)
----------
3
或者利用timestamp
hr@OCP>select * from t1 as of timestamp sysdate-13/1440;
A
----------
1
2
3
最後不要忘了提交
4. 利用閃回查詢恢復表
通過增加as of timestamp的語法,就可以到undo表空間中查找到5分鐘之前的記錄前鏡像,使用它我們就可以很輕易的並且迅速的將記錄恢復:
hr@OCP>insert into t1 select * from t1 as of timestamp sysdate-15/1440; ----做筆記時 時間有過了
3 rows created.
第02 章 閃回表( 恢復表及附屬對象到某時,row movement,基於undo)
OracleFlashback Table特性允許利用Flashback Table 語句,確保閃回到表
一個時間點。利用回滾段信息來恢復一個或一些表到以前的一個時間點( 一
照) 。FlashbackTable 將改變當前表及附屬對象一起回到以前的時間點。
注意:如果需要閃回一個表,需要以下條件:
1. 需要有flashback anytable 的系統權限或者是該表的 flashback 對象權限;
2. 需要有該表的select,insert,delete,alter 權限;
3. 必須保證該表row movement。
hr@OCP>select * from t1 ;
A
----------
1
2
3
刪除一行
hr@OCP>delete from t1 where a=2;
1 rowdeleted.
hr@OCP>commit;
查詢時間
hr@OCP>select to_timestamp(sysdate,'yyyy-mm-dd:hh24:mi:ss' ) from dual;
TO_TIMESTAMP(SYSDATE,'YYYY-MM-DD:HH24:MI:SS')
---------------------------------------------------------------------------
02-AUG-1304.32.05 PM
設定test使能行移動
hr@OCP>alter table t1 enable row movement;
Tablealtered.
hr@OCP>flashback table t1 to timestamp sysdate-6/1440;
Flashbackcomplete.
hr@OCP>select * from t1;
A
----------
1
2
3
第03章 閃回刪除(基於recyclebin)
Oracle Flashback Drop特性提供一個類似回收站的功能,用來恢復不小心被
刪除的表。當刪除表時,Oracle10g並不立刻釋放被刪除的表所佔用的空間,而
是將這個被刪除的表進行自動重命名( 爲了避免同類對象名稱的重複) 並放進回
收站中。所謂的回收站類似於Windows系統中的回收站,是一個虛擬的容器,
用於存放所有被刪除的對象,在回收站中被刪除的對象將佔用創建時的同樣的空
間。如果這個被刪除的表需要進行恢復,就可利用Flashback Drop 功能。
不能被閃回的表包括:
1 system 表空間
2 virtual private database
3 表空間被數據字典管理
4 purged 刪除
5 基於空間壓力被覆蓋
6 表上存在策略
hr@OCP> show recyclebin ---回收站爲空表示沒有任何表在回收站中
hr@OCP> drop table t1;
Table dropped.
hr@OCP> show recyclebin
ORIGINAL NAME RECYCLEBINNAME OBJECT TYPE DROP TIME
---------------- ------------------------------ -------------------------------
T1 BIN$4vPpoiKMafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:40:36
hr@OCP> select * from "BIN$4vPpoiKMafbgQKjACjgTvA==$0";
A
----------
1
2
3
hr@OCP> flashback table"BIN$4vPpoiKMafbgQKjACjgTvA==$0" to before drop;
或者
hr@OCP> flashback table t1 tobefore drop
Flashback complete.
hr@OCP> select * from t1;
A
----------
1
2
3
現在我們再刪除t1表,然後再建一張相同名字的表t1
hr@OCP> drop table t1;
hr@OCP> create table t1(a varchar2(1));
hr@OCP> insert into t1 values('a');
hr@OCP> commit;
hr@OCP> flashback table t1 to before drop;
flashback table t1 to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object---因爲已經存在一個對象了,我們可以對閃回刪除表重命名解決這個問題。
hr@OCP> flashback table t1 to before drop rename to t2;
Flashback complete.
hr@OCP> select * from t2;
A
----------
1
2
3
現在我們再來看看回收站(recyclebin)的管理機制,我們先把t1表刪除,然後把t2改爲t1再刪除
hr@OCP> drop table t1;
Table dropped.
hr@OCP> alter table t2 rename to t1;
Table altered.
hr@OCP> drop table t1;
Table dropped.
hr@OCP> show recyclebin ---現在回收站裏有兩條記錄,並且recyclebin的名字都一樣
ORIGINAL NAME RECYCLEBINNAME OBJECT TYPE DROP TIME
---------------- ------------------------------ -------------------------------
T1 BIN$4vPpoiKPafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:49:06
T1 BIN$4vPpoiKOafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:48:49
現在我們執行閃回刪除表
hr@OCP> flashback table t1 to before drop;
Flashback complete.
hr@OCP> select * from t1;---可以看出recyclebin 的管理機制是棧類型的(後進先出)
A
----------
1
2
3
hr@OCP> flashback table t1 to before drop;
flashback table t1 tobefore drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
hr@OCP> flashback table t1 to before drop rename to t2;
Flashback complete.
hr@OCP> select * from t2;
A
-
a
注意:需要注意的是sysdba的drop 操作不會被記錄,Oracle 也從不推薦用
戶使用sysdba 身份創建用戶對象。
sys@OCP> create table test1(a number);
Table created.
sys@OCP> insert into test1 values(1);
1 row created.
sys@OCP> commit;
Commit complete.
sys@OCP> drop table test1;
Table dropped.
sys@OCP> show recyclebin ---沒有數據
sys@OCP>
如果向刪除一個表且不放回收站中不能進行恢復,在drop語句中可以添加purge選項
hr@OCP> drop table t2 purge;
Table dropped.
hr@OCP> show recyclebin
hr@OCP>
在Oracle 10gR2中,recyclebin 變成了一個常規參數,可以在session/system
級動態修改:
sys@OCP> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ -----------------------------------------
recyclebin string on --默認打開
回收站的管理:只要回收站使用的空間沒有被回收,就可以使用閃回刪除功能。
當發生以下情況是回收站的空間就會被回收
Flashback Drop 需要注意的地方:
1). 只能用於非系統表空間和本地管理的表空間
2). 對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。
3). 對象能否恢復成功,取決與對象空間是否被覆蓋重用。
4). 當刪除表時,信賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化視圖,需要dba手工介入重新創建。
5). 對於Recycle Bin中的對象,只支持查詢.
1、手工purege回收站(purge recyclebin)
2、當有空間壓力時自動清空回收站,空閒空間可以查看dba_free_space 視圖