Oracle閃回技術(Flashback)
oracle的閃回技術有一種時間的穿越的功能,主要是針對誤操作,比如說誤刪除了表、誤刪除數據、其它錯誤的數據庫操作等等,這些都是有可能是人為的,因此針對這些誤操作,Oracle發明了閃回技術(flashback)
oracle的閃回操作主要有兩大類:一種是閃回查詢,另一種是閃回數據。
其中閃回查詢主要有:
- 普通閃回查詢
- 閃回版本查詢
- 閃回事務查詢
而閃回數據主要有:
- 閃回表
- 閃回刪除
- 閃回事務
- 閃回數據庫
- 閃回數據歸檔
一、閃回查詢(Flashback Query)
以表為單位查詢過去的數據為閃回查詢,主要有兩種方式:1.閃回時間點查詢。利用select命令的"as of"子句與PL/SQL包dbms_flashback在過去的一個時間點上的查詢。2.閃回版本查詢。利用select命令的”versions between"子句在過去的一段時間范圍內的查詢。
1.閃回時間點查詢
利用'as of'子句
1. 查詢7788號員工在具體時間的工資 SQL> select sal from emp as of timestamp to_timestamp('2014-09-16 10:02:30','yyyy-mm-dd,hh24:mi:ss') where empno=7788; 2. 查詢7788號員工在五分鍾前的工資 SQL> select sal from emp as of timestamp (systimestamp - interval '5' minute) where empno=7788; 3. 查詢具體SCN SQL> select * from emp as of scn 1095000; 4. 將7788號員工的工資修改為15分鍾之前的值 SQL> update emp set sal=(select sal from emp as of timestamp(systimestamp - interval '15' minute) where empno=7888) where empno=7788;
2.利用dbms_flashback包
利用dbms_flashback包的enable_at_time或enable_at_scn存儲過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨后的查詢命令可以省略'as of’,直接調用dbms_flashback_disable存儲過程將其關閉位置。需要注意的是這里需要給用戶賦予這個包的可執行權限
首先賦予test用戶對這個包可執行權限
grant execute on sys.dbms_flashback to test;
比如,將閃回模式會話定格在15分鍾前: SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute); 現在進行查詢,注意,此時查詢的是15分鍾之前的表。 SQL> select sal from emp where empno=7788; --忽略了“as of”子句 此時若訪問SYSDATE、SYSTIMESTAMP等日期函數,它們的返回值仍是當前值,而不是15分鍾之前的值。 處於閃回會話模式時,執行dml和ddl將報錯 SQL> update emp set sal=4000 where empno=7788; update emp set sal=4000 where empno=7788 * ERROR at line 1: ORA-08182: operation not supported while in Flashback mode 如果查詢完畢,可調用disable存儲過程關閉閃回會話模式。 SQL> exec dbms_flashback.disable;
3.基於SCN查詢
基於scn的查詢也是使用語法as of進行查詢的
1.##查看當前的scn select currnet_scn from v$database; 2.插入數據 insert into test values(3,'可愛'); commit; 3.##基於scn的查詢 select * from t as of scn scn號
4.閃回版本查詢
閃回版本查詢可以貫穿一定長度的時間窗口,通過只使用一條查詢命令就能返回該時間窗口內不同時間點上的數據。
比如,首先通過3個數據將7788號員工的工資進行修改,其值原來是4000,然后是5000,然后是10000,最后是3000
SQL> select sal from emp where empno=7788; SAL ---------- 4000 SQL> update emp set sal=5000 where empno=7788; 1 row updated. SQL> commit; Commit complete. SQL> update emp set sal=10000 where empno=7788; 1 row updated. SQL> commit; Commit complete. SQL> update emp set sal=3000 where empno=7788; 1 row updated. SQL> commit; Commit complete.
執行閃回版本查詢
SQL> select empno,sal from emp 2 versions between timestamp(systimestamp -interval '15' minute) and maxvalue 3 where empno=7788; EMPNO SAL ----- ---------- 7788 3000 7788 10000 7788 5000 7788 4000
通過‘version between',我們可以看到在15分鍾之內,7788號員工的工作用4個值,說明共有3個事務對其進行過修改。為了能看清這些事務的先后順序,可以在查詢列表中使用偽字段。如下所示:
SQL> select 2 versions_xid,versions_startscn,versions_endscn, 3 empno,sal 4 from emp 5 versions between timestamp(systimestamp - interval '15' minute) and maxvalue 6 where empno=7788 7 order by 2 nulls first; VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN EMPNO SAL ---------------- ----------------- --------------- ----- ---------- 060002000F030000 1097139 7788 4000 02001100FB020000 1097139 1097148 7788 5000 03001D001E030000 1097148 1097153 7788 10000 0900170000030000 1097153 7788 3000
其中,versions_xid為事務號,versions_startscn和versions_endscn分別是事務開始時的scn和修改該行的下一個事務開始時的scn。首尾銜接這兩個字段的scn號很容易得出真實的修改順序:4000,5000,10000,最后是3000,