參考資料:Using Oracle Flashback Technologylinux
Oracle 11g的新特性閃回操做程序員
下面會分別介紹這些操做。在介紹這些操做以前先看下閃回特性是否開啓。數據庫
參考資料:架構
Configuring Your Database for Oracle Flashback Technologyoracle
確認數據庫閃回特性已經啓用:v$databaseide
SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO
若是閃回特性沒有啓用,則須要先啓用閃回。學習
打開閃回的步驟:測試
SQL> shutdown immediate; SQL> startup mount; SQL> alter database flashback on; SQL> alter database open;
打開以後可再次檢查閃回特性是否打開。只要打開了閃回特性,就能夠進行閃回操做。ui
參考資料:Using Oracle Flashback Query (SELECT AS OF)
查詢某一個歷史時間點的數據。
查詢某個時間點表中的數據——某個時間點表中快照的數據。
SQL> create table t(x int , y int); 表已建立。 SQL> insert into t values(1,2); 已建立 1 行。 SQL> insert into t values(2,3); 已建立 1 行。 SQL> SQL> commit; 提交完成。 SQL> select * from t; X Y ---------- ---------- 1 2 2 3 SQL> set time on 21:11:45 SQL> delete from t where x=1; 已刪除 1 行。 21:12:11 SQL> commit; 提交完成。 21:12:18 SQL> select * from t; X Y ---------- ---------- 2 3 21:12:21 SQL> select * from t as of timestamp to_timestamp('2016-03-21 21:11:45' ,'yyyy-mm-dd hh24-mi-ss'); X Y ---------- ---------- 1 2 2 3
可見刪除的數據已經提交,可是仍是能夠閃回查詢到以前時間的數據。其中hh24表示能夠用24小時制,不然只能小時不能超過12。至於爲何分鐘用mi而不用mm,那是由於規定的格式就是mi,換成mm會顯示和以前的月份mm衝突,換成其餘的會顯示日期格式沒法識別。
基於SCN的閃回查詢
若是有修改時候的SCN,那麼就能夠基於SCN進行閃回查詢
21:18:34 SQL> select * from t; X Y ---------- ---------- 2 3 21:20:36 SQL> select current_scn from v$database; CURRENT_SCN ----------- 2891887 21:20:53 SQL> insert into t values(3,4); 已建立 1 行。 21:21:13 SQL> commit; 提交完成。 21:21:16 SQL> select * from t; X Y ---------- ---------- 2 3 3 4 21:21:26 SQL> select * from t as of scn 2891887; X Y ---------- ---------- 2 3
可見基於SCN閃回查詢獲得插入數據以前表中的數據
閃回版本查詢也就是flashback versions query。
一個時間段內的某一行的全部版本,以及改變該行的全部事務。
參考資料:
Using Oracle Flashback Version Query
閃回事務查詢也便是flashback trasaction query
閃回一個事務對數據的全部改變。
參考資料:
Using Oracle Flashback Transaction Query
將表閃回到歷史的某個時刻。
SQL> create table t(id int); 表已建立。 SQL> insert into t values(100); 已建立 1 行。 SQL> insert into t values(200); 已建立 1 行。 SQL> commit; 提交完成。 SQL> select rowid,id from t; ROWID ID ------------------ ---------- AAASaxAABAAAV3xAAA 100 AAASaxAABAAAV3xAAB 200 SQL> select current_scn from v$database; CURRENT_SCN ----------- 2960668 SQL> delete from t; 已刪除2行。 SQL> commit; 提交完成。 SQL> select * from t; 未選定行 SQL> alter table t enable row movement; 表已更改。 SQL> select * from t; 未選定行 SQL> flashback table t to scn 2960668 2 ; flashback table t to scn 2960668 * 第 1 行出現錯誤: ORA-08185: 用戶 SYS 不支持閃回 SQL> show recyclebin SQL>
解釋1:因爲當前是sys用戶,會顯示:
ORA-08185: 用戶 SYS 不支持閃回
閃回技術只適用於普通用戶而不適用於sys用戶。system用戶也不適用。
解釋2:必需要啓用表的行移動功能,不然不能閃回表。
參考資料:Oracle閃回功能詳解
因爲閃回技術不支持sys用戶,因此使用普通用戶測試。
Oracle10g之後,當咱們刪除表時,默認Oracle只是在數據庫字典裏面對被刪的表的進行了重命名,並無真正的把表刪除。
回收站(recyclebin):用來維護表被刪除前的名字與刪除後系統生成的名字之間的對應關係的數據字典,表上的相關對象(索引、觸發器等)也會一併進入回收站。
只有dba(sys,system)纔有權限執行查詢recyclebin的狀態。
SQL> show parameter recyclebin; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string on
能夠發現recyclebin是開啓狀態,若是發現是關閉狀態,能夠經過下面命令開啓
alter system set recyclebin=on;
若是要關閉回收站功能,使用下面的命令:
alter system set recyclebin=off;
禁用後刪除的對象將直接刪除,不會寫到Recyclebin中。
因爲sys用戶和system用戶不支持閃回技術,因此咱們須要切換到普通用戶進行實驗,實驗效果以下:
SQL> create table t(id int); 表已建立。 SQL> insert into t values(1); 已建立 1 行。 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$zqOXt7xBRA2SKyG5nGxb5w==$0 TABLE 2016-03-22:17:18:33 SQL> drop table t; 表已刪除。 SQL> commit; 提交完成。 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$lpoDEIX2SSGAQt9TL3gUTA==$0 TABLE 2016-03-22:17:22:24 T BIN$zqOXt7xBRA2SKyG5nGxb5w==$0 TABLE 2016-03-22:17:18:33 SQL> select * from "BIN$lpoDEIX2SSGAQt9TL3gUTA==$0"; ID ---------- 1 SQL> flashback table t to before drop; 閃回完成。 SQL> select * from t; ID ---------- 1
能夠所有清空回收站,也可只清空回收站的部分文件。
所有清空回收站
SQL> purge recyclebin;
部分清空回收站
##假定回收站中有一個文件的ORIGINAL NAME是t1,永久刪除他t1表 SQL> purge table t1;
雖然Oracle並沒真正刪除被回收的表,可是在Oracle看來這一塊空間已是自由的(free)。使用下面的演示能夠查看效果:(在普通用戶下驗證便可)
SQL> create table t as select * from user_objects; 表已建立。 SQL> select sum(blocks) from user_free_space where tablespace_name='USERS'; SUM(BLOCKS) ----------- 96 SQL> drop table t; 表已刪除。 SQL> select sum(blocks) from user_free_space where tablespace_name='USERS'; SUM(BLOCKS) ----------- 104 SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------- T BIN$kMskKvD5SJqmwaC5WDQiAg==$0 TABLE 2016-03-22:18:31:43 SQL> select blocks from user_segments where segment_name='BIN$kMskKvD5SJqmwaC5WDQiAg==$0'; BLOCKS ---------- 8
實驗效果代表刪除表以後用戶自由空間增大了,而且大小恰好就是回收站中的對應的表的大小。可見這一塊空間在Oracle看來已是free_space了。
參考資料:
Using Flashback Data Archive (Oracle Total Recall)
閃迴歸檔:Flashback Data Archive。Oracle Total Recall,也即Oracle全面回憶功能。
閃回數據歸檔能夠和咱們一直熟悉的日誌歸檔類比,日誌歸檔記錄的是Redo的歷史狀態,用於保證恢復的連續性;而閃迴歸檔記錄的是UNDO的歷史狀態,能夠用於對數據進行閃回追溯查詢;後臺進程LGWR用於將Redo信息寫出到日誌文件,ARCH進程負責進行日誌歸檔;在Oracle 11g中,新增的後臺進程FBDA(Flashback Data Archiver Process)則用於對閃回數據進行歸檔寫出。
具體操做見參考資料。
參考資料:Oracle DB閃回(Flashback database)開啓筆記
數據庫的閃回
閃回數據庫架構Flashback database architecture
開啓閃回數據庫功能以後,會在SGA中開闢內存Flashback buffer,會記錄buffer cache中的部分改變而後後臺恢復寫入進程RVWR將記錄寫入閃回日誌Flashback logs中。FBDA進程(Flashback Data Archive )則會將Flashback logs進行歸檔。
這個過程和重作日誌很是很是的相似。
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。
我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。
聽我說,進步多,程序人生一把梭
若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!