標籤:
/*
11g的flashbackup 分好幾種,分別用途不一樣。
A.flashback database 閃回資料庫,簡單理解就是把資料庫閃回到某個以前的時間點,
能恢複到的最早的SCN, 取決與Flashback Log中記錄的最早SCN
B.flashback drop 回收資料庫表,用於表誤drop後恢複。類似Windows的資源回收筒。
C.flashback query 閃回表記錄,用於資料表記錄的恢複
D.falshabck Table 閃回資料庫表,
後兩個是重點,下面說明。
*/
– A.flashback database相關
/*
1.預設情況資料庫的flashback database是關閉,可以在mount exclusive狀態下開啟。
在設定了閃回恢複區後,可以啟動閃回資料庫功能。
*/
–1.檢查是否啟動了flash recovery area
show parameter db_recovery_file
–2.檢查是否啟用了歸檔
archive log list;
–3.flashback database 預設是關閉的,查看方法
select flashback_on from v$database;
–4.查詢當前的scn
SELECT CURRENT_SCN FROM V$DATABASE;
–5.查詢當前的時間
select to_char(sysdate,’yy-mm-dd hh24:mi:ss’) time from dual;
–6.查看SCN 和 timestamp 之間的對應關係:
select scn,to_char(time_dp,’yyyy-mm-dd hh24:mi:ss’)from sys.smon_scn_time;
–7.恢複到時間點,或者恢複到SCN
flashback database to timestamp to_timestamp(’09-10-14 14:37:05′,’yy-mm-dd hh24:mi:ss’);
flashback database to scn 947921;
– B. flashback table 恢複誤drop表
drop table sphsy.login_table;
select * from flash_table;
–purge table sphsy.login_table;清空資源回收筒
flashback table sphsy.login_table to before drop;
select * from sphsy.login_table;
– C. flashback query 實現行級恢複
/*
flashback查詢用於擷取先前時間點的表行級資料。當使用flashback查詢時,
需要在表名後指定as of timestamp子句或as of SCN子句,其中as of timestamp用於指定早期時間點,
而as of SCN用於指定早期的SCN值,樣本如下:
*/
– 1.查原始記錄 ,區間內有62 行
select *
from sphsy.login_table a
where a.id > 201204171078
and a.id < 201204171141
order by a.id ;
– 2.晚於區間的有 3016
select program,count(*)
from sphsy.login_table a
where a.id >= 201204171141
group by program ;
–3. 刪除
delete from sphsy.login_table a
where a.id > 201204171078
and a.id < 201204171141
–4.利用閃回特性查到區間內,有62行
select * from sphsy.login_table
as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)
where id > 201204171078
and id < 201204171141
– 5.不利用閃回特性,直接查詢發現沒有
select * from sphsy.login_table
where id > 201204171078
and id < 201204171141
– 6.進行資料恢複
– 禁止表上的觸發器
alter trigger sphsy.T_INS_LOGIN_TABLE disable ;
– 恢複資料
insert into sphsy.login_table
select * from sphsy.login_table
as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)
where id > 201204171078
and id < 201204171141
– 恢複觸發器
alter trigger sphsy.T_INS_LOGIN_TABLE enable ;
– 7.晚於區間的資料回來了3130 = 3016 +62 + 後來的資料。實現了區間恢複誤刪除。
select program,count(*)
from sphsy.login_table a
where a.id >= 201204171078
group by program ;
– D. flashback table 恢複表到先前狀態
/*
flashback查詢可以用於恢複被誤刪除的表行資料,但是使用者在表上執 行了其他的DML語句誤操作(insert或update),則不能直接使用flashback查詢將表資料恢複到先前時間點,從oracle10g開 始,使用flashback table語句可以將表恢複到先前時間點,通過使用該特徵,可以避免執行基於時間點的不完全恢複,注意如果要在某個表上使用flashback table特徵,則要求必須具有以下條件:
a.使用者必須具有flashback any table系統許可權或flashback對象許可權
b.使用者必修在表上具有select insert delete和alter許可權
c.必須合理設定初始化參數undo_retention,以確保UNDO資訊保留足夠時間
d.必須啟用行移動特徵:alter table table_name enable row movement;
*/
– 1.查原始記錄 ,區間內有62 行
select *
from sphsy.login_table a
where a.id > 201204171078
and a.id < 201204171141
order by a.id ;
– 2.晚於區間的有 3074
select count(*)
from sphsy.login_table a
where a.id >= 201204171141;
–3. 刪除 ,先記下時間點,2012-04-17 17:43:46
select to_char(sysdate,’YYYY-MM-DD HH24:MI:SS’) from dual ;
delete from sphsy.login_table a
where a.id > 201204171078
and a.id < 201204171141
– 4.刪除之後表 sphysy.login_table繼續有修改 ,行3082
select count(*)
from sphsy.login_table a
where a.id >= 201204171141;
–5.啟用行移動特徵
alter table sphsy.login_table enable row movement
–6.利用閃回特性,直接恢複到刪除時間點前
flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:43:46′,’YYYY-MM-DD HH24:MI:SS’);
– 7.晚於區間的資料 回到了3080 ,說明時間點之後的修改丟失。
select count(*)
from sphsy.login_table a
where a.id >= 201204171141
– 8.往前推1分,恢複到刪除之前,刪除的62條也回來了。
flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:40:46′,’YYYY-MM-DD HH24:MI:SS’);
– 62 行
select count(*)
from sphsy.login_table a
where a.id > 201204171078
and a.id < 201204171141
– 刪除之後的資料為3074,代表還有修改丟失。
select count(*)
from sphsy.login_table a
where a.id >= 201204171141
/*
總結:方法C,方法D均可以用資料恢複。
方法C安全,恢複麻煩。方法D簡單,有可能資料丟失。
*/
Oracle的資料恢複——Flashback用法匯總