閃回功能

閃回功能:

1:閃回數(shù)據(jù)庫某一時刻,閃回數(shù)據(jù)庫(flashback database)

2:使用閃回表將表內(nèi)容還原到過去的特定時間點巍糯,閃回表(flashback table)

3:從刪除表中進行恢復踏幻,閃回刪除(flashback drop)

4:使用閃回查詢查看截止到任一時間點的數(shù)據(jù)庫內(nèi)容自点,閃回查詢(flashback query)

5:使用閃回版本查詢查看某一行在一段時間內(nèi)的各個版本韩脏,(flashback version query)

6:使用閃回事務查詢查看事務處理歷史記錄或行宁否,閃回事務查詢(flashback transcation query)

1:閃回數(shù)據(jù)庫

? ? ? 閃回數(shù)據(jù)庫是通過使用一類被稱為閃回數(shù)據(jù)庫日志的日志文件來實施的窒升。oracle數(shù)據(jù)庫會定期將數(shù)據(jù)塊的“前像”記錄在閃回數(shù)據(jù)庫日志中。

? 為了快速將數(shù)據(jù)文件更改回退到捕獲閃回日志的時間(就在所需目標時間之前)慕匠,可以重用塊前像饱须。然后,應用重做日志文件中的更改來填充間隔台谊。

? 在快速恢復區(qū)中會自動創(chuàng)建和管理閃回數(shù)據(jù)庫日志蓉媳。

? 閃回數(shù)據(jù)庫:是當出現(xiàn)邏輯錯誤時,能夠將整個數(shù)據(jù)庫回退到出錯前的那個時間點上锅铅。

? 比如:用戶截斷了表(trucate)酪呻,系統(tǒng)管理員誤刪除了用戶,

? ? ? ? ? ? 用戶錯誤的執(zhí)行了某個批處理任務盐须,或者該批處理任務的腳本編寫錯誤玩荠,使得多個表的數(shù)據(jù)發(fā)生混亂,




? 閃回數(shù)據(jù)庫的日志文件不是由傳統(tǒng)的Log Writer (LGWR)進程寫入丰歌,而是由一個稱為RecoVery WRiter (RVWR)的新進程寫入姨蟋,

? 閃回日志文件由RCWR進程在恢復區(qū)中自動創(chuàng)建和維護。

? 實現(xiàn)閃回數(shù)據(jù)庫的基礎是閃回日志立帖,只要我們配置了閃回數(shù)據(jù)庫眼溶,就會自動創(chuàng)建閃回日志。

? 這時晓勇,只要數(shù)據(jù)庫里的數(shù)據(jù)發(fā)生變化堂飞,oracle就會將數(shù)據(jù)被修改前的舊值保存在閃回日志里,

? 當我們需要閃回數(shù)據(jù)庫時绑咱,oracle就會讀取閃回日志里的記錄绰筛,并應用到數(shù)據(jù)庫上,從而將數(shù)據(jù)庫回退到歷史的某個時間點上描融。





? ? 啟動閃回數(shù)據(jù)庫功能

? ? 1.1) 查看數(shù)據(jù)庫是否開啟閃回

? ? ? ? ? ? select flashback_on from v$database;


? ? 1.2)啟用恢復區(qū)铝噩,存放閃回日志:閃回恢復區(qū)提供了一個集中化的存儲區(qū)域,很大程度上減小了管理開銷窿克。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這是其最主要的優(yōu)點骏庸。與 RMAN 結合使用可以進行快速恢復。

? ? ? ? ? 可以存儲:閃回日志 年叮、控制文件具被、歸檔的日志文件 、RMAN 備份集 只损、數(shù)據(jù)文件拷貝? ? ? ? ? ? ? ? ? ? ?


? ? ? ? ? show parameter recovery


? ? ? ? ? alter system set db_recovery_file_dest_size=8G ;

? ? ? ? ? alter system set db_recovery_file_dest='/opt/soft/recover';


? ? 1.3) 設置閃回日志保存時間


? ? ? ? ? show parameter db_flashback_retention_target


? ? ? ? ? alter system set db_flashback_retention_target=10080 ;

? ? 1.4) 開啟數(shù)據(jù)庫閃回

? ? ? ? ? alter database flashback on;

? ? ? ? ? select * from v$recovery_area_usage --查看閃回日志大小


? ? 1.5)使用閃回數(shù)據(jù)庫

? ? ? ? ? 1.5.1)創(chuàng)建表

? ? ? ? ? ? ? ? create table flashback_t as select * from dba_objects where rownum < 100;

? ? ? ? ? ? ? ? select count(1) from flashback_t;? ?


? ? ? ? ? ? ? ? 修改表

? ? ? ? ? ? ? ? create table flashback_t_xiu as select * from dba_objects where rownum < 100;

? ? ? ? ? ? ? ? update flashback_t_xiu set object_id=1;

? ? ? ? ? ? ? ? commit;



? ? ? ? ? ? ? ? create table flashback_t_tru as select * from dba_objects where rownum < 100;

? ? ? ? ? ? ? ? select count(1) from flashback_t_tru;? ?



? ? ? ? ? 1.5.2 )查看當前SCN和時間

? ? ? ? ? ? ? ? select dbms_flashback.get_system_change_number,

? ? ? ? ? ? ? ? ? ? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? ? ? ? ? ? ? from dual;

? ? ? ? ? ? ? ? 3216379



? ? ? ? ? 1.5.3) 刪除表一姿、修改表、TRUNCATE 表

? ? ? ? ? ? ? ? ? drop table flashback_t;

? ? ? ? ? ? ? ? ? truncate table flashback_t_tru;

? ? ? ? ? ? ? ? ? update? flashback_t_xiu set object_id=200;

? ? ? ? ? ? ? ? ? commit;



? ? ? ? ? ? ? ? ? select dbms_flashback.get_system_change_number,

? ? ? ? ? ? ? ? ? ? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? ? ? ? ? ? ? from dual;

? ? ? ? ? ? ? ? select sysdate from dual;

? ? ? ? ? ? ? ? 3216638

? ? ? ? 1.5.4) 閃回到過去時間點:閃回需要在Mount狀態(tài)下進行,可以指定Timestamp/SCN/Sequence進行閃回叮叹。

? ? ? ? ? ? ? shutdown immediate ;

? ? ? ? ? ? ? startup mount;

? ? ? ? ? ? ? flashback database to timestamp to_timestamp('2016-04-12 21:57:02','yyyy-mm-dd hh24:mi:ss');

? ? ? ? ? ? ? flashback database to SCN 3216379;


? ? ? ? 1.5.5) 以read only 方式打開艾栋,驗證數(shù)據(jù),如果不夠理想衬横,可以重新使用閃回

? ? ? ? ? ? ? alter database open read only;

? ? ? ? ? ? ? select OPEN_MODE from v$database;? ? ?


? ? ? ? 1.5.6) 驗證數(shù)據(jù)

? ? ? ? ? ? ? ? select count(1) from flashback_t;

? ? ? ? ? ? ? ? select count(1) from flashback_t_tru;?

? ? ? ? ? ? ? ? select object_id from? flashback_t_xiu;?


? ? ? ? ? ? ? ? 數(shù)據(jù)驗證正確裹粤;

? ? ? ? 1.5.7) 以resetlogs 方式打開數(shù)據(jù)庫? ? ? ?

? ? ? ? ? ? ? alter database open resetlogs;

? ? ? ? ? ? ? select * from v$log

? ? ? ? ? ? ? select resetlogs_id from v$archived_log group by resetlogs_id;


閃回數(shù)據(jù)庫:減少還原時間

閃回數(shù)據(jù)庫比使用還原文件和重做日志文件的傳統(tǒng)時間點恢復的速度要更快。隨著數(shù)據(jù)庫規(guī)模的增加蜂林,

通過還原所有數(shù)據(jù)文件來執(zhí)行傳統(tǒng)的時間點恢復所需的時間長度變得不太現(xiàn)實遥诉。使用閃回數(shù)據(jù)庫時,

因為不要需要還原數(shù)據(jù)文件噪叙,所以恢復數(shù)據(jù)庫的時間與需要回退的更改數(shù)目成比例矮锈。

在不能使用閃回數(shù)據(jù)庫功能的情況下,必須使用不完全恢復操作將數(shù)據(jù)庫返回到特定時間睁蕾。

閃回數(shù)據(jù)庫操作完成后苞笨,可在只讀模式下打開數(shù)據(jù)庫,驗證是否使用了正確的目標時間或系統(tǒng)更改號(SCN)子眶。

如果沒有瀑凝,可以再次閃回數(shù)據(jù)庫,或者通過執(zhí)行恢復操作來前滾數(shù)據(jù)庫臭杰。因此粤咪,要撤銷閃回數(shù)據(jù)庫操作,必須向前恢復數(shù)據(jù)庫渴杆。

閃回數(shù)據(jù)庫操作完成后寥枝,必須使用以下一種方法打開數(shù)據(jù)庫:

· 在只讀模式下驗證是否使用了正確的目標時間或SCN

· 使用RESETLOGS 參數(shù)才允許進行更新



優(yōu)點:

閃回技術由于只能處理更改數(shù)據(jù),所以從根本上改變了恢復技術磁奖。使用這個技術時囊拜,從錯誤中恢復花費的時間等于制造錯誤所花費的時間。

當閃回技術使用時比搭,它與介質恢復相比冠跷,在易用性、可用性和還原時間方面有明顯的優(yōu)勢身诺。

閃回數(shù)據(jù)庫使用閃回日志執(zhí)行閃回蔽莱。閃回刪除使用回收站。其他所有功能都使用還原數(shù)據(jù)戚长。

閃回數(shù)據(jù)庫限制:(不能使用閃回數(shù)據(jù)庫)

· 已還原或重新創(chuàng)建了控制文件

· 已刪除了表空間

· 已收縮了數(shù)據(jù)文件

·? Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇怠苔。

· 非歸檔模式

Flashback Database 相關的3個視圖

V$database

這個視圖可以查看是否啟用了Flashback database功能

SQL> select flashback_on from v$database;

V$flashback_database_log

Flashback Database 所能回退到的最早時間同廉,取決與保留的Flashback Database Log 的多少,

該視圖就可以查看許多有用的信息。

Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點

Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小

Retention_target: 系統(tǒng)定義的策略

Estimated_flashback_size: 根據(jù)策略對需要的空間大小的估計值

SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es

from v$flashback_database_log;

V$flashback_database_stat

這個視圖用來對Flashback log 空間情況進行更細粒度的記錄和估計迫肖。

這個視圖以小時為單位記錄單位時間內(nèi)數(shù)據(jù)庫的活動量:

Flashback_Data 代表Flashback log產(chǎn)生數(shù)量锅劝,

DB_Date 代表數(shù)據(jù)改變數(shù)量,

Redo_Date代表日志數(shù)量蟆湖,

通過這3個數(shù)量可以反映出數(shù)據(jù)的活動特點故爵,更準確的預計Flash Recovery Area的空間需求

恢復區(qū)的使用情況

v$recovery_area_usage

selecct * from v$recovery_area_usage;



復原點是手動創(chuàng)建的一個時間點,數(shù)據(jù)庫可以閃回到創(chuàng)建的該復原點隅津。

普通復原點:只是在閃回或恢復操作中為指定以前的SCN或時間點提供方便诬垂。但不保證數(shù)據(jù)庫在所有情形下都保留成功執(zhí)行閃回數(shù)據(jù)庫操作所需的閃回數(shù)據(jù)庫日志。

創(chuàng)建普通復原點:CREATE RESTORE POINT weisi_point;

有保證的復原點:保證可以把數(shù)據(jù)庫倒退到由復原點指定的SCN或時間點.

創(chuàng)建有保證的復原點:CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;

刪除復原點:DROP RESTORE POINT point_name;

DROP RESTORE POINT weisi_point;


查看復原點:v$restore_point視圖

創(chuàng)建復原點注意事項:

1.創(chuàng)建復原點必須打開歸檔模式

2.創(chuàng)建復原點可以不打開閃回

3.創(chuàng)建復原點若閃回沒打開數(shù)據(jù)庫需為裝載狀態(tài)

SQL> CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;

CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE

第 1 行出現(xiàn)錯誤:

ORA-38784: 無法創(chuàng)建還原點 'weisi_STOREPOINT'伦仍。

ORA-38787: 在閃回數(shù)據(jù)庫處于關閉狀態(tài)時, 創(chuàng)建第一個可靠還原點需要裝載模式结窘。

4.創(chuàng)建了復原點后,數(shù)據(jù)庫的閃回由原來的no狀態(tài)變成了RESTORE POINT ONLY

SQL> CREATE RESTORE POINT weisi_storepoint GUARANTEE FLASHBACK DATABASE;

還原點已創(chuàng)建充蓝。

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

RESTORE POINT ONLY

利用復原點閃回數(shù)據(jù)庫:

FLASHBACK DATABASE TO RESTORE POINT weisi_storepoint;


2: 閃回DROP

用于恢復用戶誤刪除的對象(包括表隧枫,索引等),

這個技術依賴于Tablespace Recycle Bin(表空間回收站)谓苟,這個功能和windows的回收站非常類似官脓。

Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站里拿到涝焙。

故使用SYS 或者SYSTEM用戶登陸時卑笨, show recyclebin 為空。

Flashback Drop 是基于Tablespace RecycleBin 來實現(xiàn)恢復的纱皆。

? 2.1)回收查看回收站是否開啟:初始化參數(shù)recyclebin 用于控制是否啟用recyclebin功能湾趾,缺省是ON, 可以使用OFF關閉派草。


? ? ? ? show parameter recyclebin



? 2.2) 開啟搀缠、關閉回收站

? ? ? ? ALTER SYSTEM SET recyclebin = ON;? ? ? ? ? ?

? ? ? ? ALTER SESSION SET recyclebin = ON;? ? ?

? ? ? ? ALTER SYSTEM SET recyclebin = OFF;? ?

? ? ? ? ALTER SESSION SET recyclebin = OFF;

? 2.3)回收站內(nèi)容

? ? ? ? show recyclebin;

? ? ? ? SELECT * FROM RECYCLEBIN;? ?

? ? ? ? SELECT * FROM USER_RECYCLEBIN;? ?

? ? ? ? SELECT * FROM DBA_RECYCLEBIN;

? 2.4)清空回收站

? ? ? ? dba_recyclebin;

? ? ? ? purge recyclebin;

? ? ? ? purge table weisi

? ? ? ? purge index weisi_index

? 2.5) 恢復回收站的表

? ? ? ? create table weisi_t as select * from dba_objects where rownum<100;

? ? ? ? select count(1) from user_recyclebin;

? ? ? ? drop table weisi_t;


? ? ? ? FLASHBACK TABLE? weisi_t TO BEFORE DROP RENAME TO weisi_t_recovery ;

? ? ? ? show recyclebin;




Flashback Drop 需要注意的地方:

1). 只能用于非系統(tǒng)表空間和本地管理的表空間

2). 對象能否恢復成功,取決與對象空間是否被覆蓋重用近迁。

3). 當刪除表時艺普,信賴于該表的物化視圖也會同時刪除,但是由于物化視圖并不會被放入recycle bin鉴竭,

因此當你執(zhí)行flashback table to before drop 時歧譬,也不能恢復依賴其的物化視圖,




3? 閃回表:恢復表到過去的某一時刻

? ? 注意:SYS用戶不支持閃回搏存,F(xiàn)lashback Table也是使用UNDO tablespace的內(nèi)容來實現(xiàn)對數(shù)據(jù)的回退瑰步。

? ? ? 如果想要對表進行flashback,必須允許表的row movement.

? ? ? alter table table_name enable row movement;

? ? ? alter table t_1 disable row movement;

? ? ? select TABLE_NAME,row_movement from user_tables;


? ? create table t_1 as select * from dba_objects;

? ? select count(1) from t_1;

? ? select dbms_flashback.get_system_change_number,

? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? from dual;


? ? 3219028




? ? delete t_1? where object_id < 88;? ?


alter table t_1? enable row movement;


? ? flashback table t_1 to scn 3219028


? ? flashback table weisi.t_1 to timestamp to_timestamp


? ? select count(1) from weisi.t_1;


? ? select count(1) from? weisi.t_1? AS OF SCN 2645656;


-- 授予weisi用戶使用dbms_flashback包權限

? ? grant execute on dbms_flashback to weisi;

? ? select * from user_sys_privs;


? ? select * from dba_tab_privs where grantee='WEISI'



? ? truncate table:


? ? select count(1) from t_1;


? ? select dbms_flashback.get_system_change_number,

? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? from dual;

? ? 2591903

? ? truncate table t_1;



? ? select count(1) from t_1 as of scn 2591903;


? ? flashback table t_1 to scn 2591903;


? ? drop table


? ? select count(1) from t_1;


? ? select dbms_flashback.get_system_change_number,

? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? from dual;

? ? 2592399


? ? ? ? ? select count(1) from t_1 as of scn 2592399;


? ? flashback table t_1 to scn 2591903;







? ? 總結? 基于undo 的表恢復璧眠,需要注意DDL 操作的影響缩焦。修改并提交過數(shù)據(jù)之后读虏,對表做過DDL 操作,

包括:drop袁滥、modify 列, move 表, truncate table/partition盖桥,drop table 等

這些操作會令undo 表空間中的撤銷數(shù)據(jù)失效,對于執(zhí)行過這些操作的表應用flashback query

會觸發(fā)ORA-01466 錯誤题翻】玻基于undo 的表恢復,flashback table 實際上做的也是dml 操作

4:閃回查詢:Flashback Query

實現(xiàn)從回滾段中讀取表一定時間內(nèi)操作過的數(shù)據(jù)嵌赠,可用來進行數(shù)據(jù)比對塑荒,

或者修正意外提交造成的錯誤數(shù)據(jù),該項特性也被稱為Flashback Query猾普。

可以使用SCN 或者timestamp

SCN 與 timestamp 關系: Oracle 在內(nèi)部都是使用scn袜炕,即使你指定的是as of timestamp,oracle 也會將其轉換成scn初家,

? ? ? ? ? 系統(tǒng)時間標記與scn 之間存在一張表偎窘,即SYS 下的SMON_SCN_TIME

? ? ? ? ? 一個SCN值,可能對應一段時間溜在。


? ? ? ? ? select timestamp_to_scn(to_date('2016-05-06 22:24:02','YYYY-MM-DD HH24:MI:SS')) from dual;

? ? ? ? ? select timestamp_to_scn(to_date('2016-05-06 22:24:03','YYYY-MM-DD HH24:MI:SS')) from dual;


Flashback Query:Flashback Query,Flashback Version Query陌知,F(xiàn)lashback Transaction Query

4.1 Flashback Query

? Flashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄數(shù)據(jù)。



? select dbms_flashback.get_system_change_number,

? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? from dual;


? ? 22313644

? 22313692


? create table wzx_t(name varchar2(20));

? insert into wzx_t values('wu');

? insert into wzx_t values('zhen');

? insert into wzx_t values('xing');

? insert into wzx_t values('ni');

? insert into wzx_t values('hao');


? ? alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss'; ?

? ? select sysdate from dual;


2018-08-26 10:53:27


? ? delete wzx_t;


? ? 查看過去的數(shù)據(jù):

? ? select * from wzx_t as of timestamp sysdate-2/1440;


? ? select * from wzx_t as of timestamp to_timestamp('2018-08-26 10:53:27','YYYY-MM-DD hh24:mi:ss');

? ? select * from wzx_t as of scn 2651095


? ? 插入過去數(shù)據(jù):

? ? Insert into wzx_t? select * from wzx_t as of timestamp to_timestamp('2018-08-26 10:53:27','YYYY-MM-DD hh24:mi:ss');

? ? commit;


? ? select dbms_flashback.get_system_change_number,

? ? ? SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)

? ? ? from dual;

? ? ? 2593187

? ? ? delete wzx_t;

? ? select * from wzx_t as of scn 2593187;

? ? insert into wzx_t select * from wzx_t as of scn 2593187;



? 注意:flashback query 對v$tables,x$tables 等動態(tài)性能視圖無效掖肋,dba_*,all_*,user_*等? ? ? 數(shù)據(jù)字典是有效的仆葡。

該特性也完全支持訪問遠端數(shù)據(jù)庫,比如select * from t_1@dblink as of scn 5800志笼。

4.2 Flashback version Query

? ? 相對于Flashback Query 只能看到某一點的對象狀態(tài)沿盅,F(xiàn)lashback Version Query可以看到過去某個時間段內(nèi),

? ? 記錄是如何發(fā)生變化的纫溃。 根據(jù)這個歷史腰涧,DBA就可以快速的判斷數(shù)據(jù)是在什么時點發(fā)生了錯誤,進而恢復到之前的狀態(tài)紊浩。


? ? 偽列 ORA_ROWSCN. 所謂的偽列窖铡,就是假的,不存在的數(shù)據(jù)列坊谁,用戶創(chuàng)建表時雖然沒有指定费彼,

但是Oracle為了維護而添加的一些內(nèi)部字段,這些字段可以像普通文件那樣的使用口芍。

最熟悉的偽列就是 ROWID箍铲, 它相當于一個指針,指向記錄在磁盤上的位置鬓椭。

ORA_ROWSCN 是Oracle 10g 新增的虹钮,暫且把它看作是記錄最后一次被修改時的SCN聋庵。

Flashback Version Query 就是通過這個偽列來跟蹤出記錄的變化歷史。

語法如下:

SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} --start,end可以是時間也可以是scn

Flashback Version Query偽列說明

versions_start{scn|time}? 版本開始的scn或時間戳

versions_end{scn|time}? 版本結束scn或時間戳芙粱,如果有值表明此行后面被更改過是舊版本,如果為null氧映,則說明行版本是當前版本或行被刪除(即versions_operation值為D)春畔。

versions_xid 創(chuàng)建行版本的事務ID

versions_operation? 在行上執(zhí)行的操作(I=插入,D=刪除岛都,U=更新)

? create table wzx_t(name varchar2(100)) ;

? insert into wzx_t values('weisi');

? insert into wzx_t values('abc');

? insert into wzx_t values('fdss');


? select ora_rowscn, name from wzx_t;


? Select versions_xid,versions_startscn,versions_endscn,

DECODE(versions_operation,

'I','Insert',

'U','Update',

'D','Delete', 'Original') "Operation",

name

from wzx_t versions between scn 22313673 and 22313806;

22313644

? 22313692

create table wzx_t(name varchar2(20));

? insert into wzx_t values('wu');

? insert into wzx_t values('zhen');

? insert into wzx_t values('xing');

? insert into wzx_t values('ni');

? insert into wzx_t values('hao');


? ? alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss'; ?

? ? select sysdate from dual;


? ? ? Select versions_xid,versions_startscn,versions_endscn,

DECODE(versions_operation,

'I','Insert',

'U','Update',

'D','Delete', 'Original') "Operation",

name

from wzx_t versions between scn minvalue and maxvalue;

Select versions_xid,versions_startscn,versions_endscn,

DECODE(versions_operation,

'I','Insert',

'U','Update',

'D','Delete', 'Original') "Operation",

name

from wzx_t versions between

timestamp to_timestamp('2016-05-07 07:00:37','YYYY-MM-DD HH24:MI:SS') and to_timestamp('2016-05-07 07:07:29','YYYY-MM-DD HH24:MI:SS');

4.3 Flashback Transaction Query(開啟ORALCE 附加日志)

Flashback Transaction Query也是使用UNDO信息來實現(xiàn)律姨。

利用這個功能可以查看某個事務執(zhí)行的所有變化,它需要訪問flashback_transaction_query 視圖臼疫,

? 這個視圖的XID列代表事務ID择份,利用這個ID可以區(qū)分特定事務發(fā)生的所有數(shù)據(jù)變化。

? grant select any transaction to zhenxing;


? GRANT SELECT ON flashback_transaction_query TO zhenxing;--直接賦予該表的select權限還是無法查詢烫堤,提示權限不夠

GRANT SELECT ANY TRANSACTION TO zhenxing;--必須授予ANY TRANSACTION才行


? Flashback Transaction Query實際上是查詢的數(shù)據(jù)字典flashback_transaction_query荣赶。可以根據(jù)flashback_transaction_query 的undo_sql列值返回數(shù)據(jù)以前版本鸽斟。

flashback_transaction_query 列說明:

SQL> desc flashback_transaction_query

Name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Null?? ? Type

----------------------------------------- -------- ----------------------------

XID? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RAW(8)? ? ? ? ? ? ? ? --事務ID

START_SCN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? --事務起始SCN拔创,即第一個dml的SCN

START_TIMESTAMP? ? ? ? ? ? ? ? ? ? ? ? ? ? DATE? ? ? ? ? ? ? ? ? --事務其實時間戳,即第一個dm的時間戳

COMMIT_SCN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? --提交事務時的SCN

COMMIT_TIMESTAMP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DATE? ? ? ? ? ? ? ? ? -- 提交事務時的時間戳

LOGON_USER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(30)? ? ? ? ? ? --本次事務的用戶

UNDO_CHANGE#? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NUMBER? ? ? ? ? ? ? ? ? --撤銷SCN

OPERATION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(32)? ? ? ? ? ? --執(zhí)行的dml操作:DELETE,INSERT,UPDATE,BEGIN,UNKNOWN

TABLE_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(256)? ? ? ? ? --dml更改的表

TABLE_OWNER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(32)? ? ? ? ? --表的所有者

ROW_ID? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(19)? ? ? --修改行的ROWID

UNDO_SQL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(4000)? ? ? ? --撤銷dml的sql語句


? Select xid,operation,commit_scn,undo_sql

from flashback_transaction_query

where xid in (Select versions_xid

from wzx_t versions between scn 22313673 and 22313806);

--創(chuàng)建表flashback_test

CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));

--插入三條記錄

INSERT INTO flashback_test VALUES('d1','s','s');

INSERT INTO flashback_test VALUES('d2','sw','sf');

INSERT INTO flashback_test VALUES('d3','swd','ss');

--執(zhí)行刪除操作

DELETE FROM flashback_test WHERE a='d1';

commit;

Select xid,operation,commit_scn,undo_sql

from flashback_transaction_query

where xid in (Select versions_xid

from flashback_test versions between scn minvalue and maxvalue);


5:Oracle Flashback Data Archive

Oracle 11g推出一個新特性:Oracle Flashback Data Archive.

該技術與之前的Flashback的實現(xiàn)機制不同,

通過將變化數(shù)據(jù)另外存儲到創(chuàng)建的閃回歸檔區(qū)(Flashback Archive)中富蓄,以和undo區(qū)別開來剩燥,

這樣就可以為閃回歸檔區(qū)單獨設置存儲策略,使之可以閃回到指定時間之前的舊數(shù)據(jù)而不影響undo策略立倍。

并且可以根據(jù)需要指定哪些數(shù)據(jù)庫對象需要保存歷史變化數(shù)據(jù)灭红,

而不是將數(shù)據(jù)庫中所有對象的變化數(shù)據(jù)都保存下來,這樣可以極大地減少空間需求口注。

Flashback Data Archive并不是記錄數(shù)據(jù)庫的所有變化变擒,而只是記錄了指定表的數(shù)據(jù)變化。

所以疆导,F(xiàn)lashback Data Archive是針對對象的保護赁项,是Flashback Database的有力補充。




? ? 5.1)閃回數(shù)據(jù)歸檔區(qū)

? 閃回數(shù)據(jù)歸檔區(qū)是閃回數(shù)據(jù)歸檔的歷史數(shù)據(jù)存儲區(qū)域澈段,在一個系統(tǒng)中悠菜,

可以有一個默認的閃回數(shù)據(jù)歸檔區(qū),也可以創(chuàng)建其他許多的閃回數(shù)據(jù)歸檔區(qū)域败富。

每一個閃回數(shù)據(jù)歸檔區(qū)都可以有一個唯一的名稱悔醋。同時,

每一個閃回數(shù)據(jù)歸檔區(qū)都對應了一定的數(shù)據(jù)保留策略兽叮。

閃回數(shù)據(jù)歸檔區(qū)是一個邏輯概念芬骄,是從一個或者多個表空間中拿出一定的空間猾愿,來保存表的修改歷史,

這樣就擺脫了對Undo撤銷數(shù)據(jù)的依賴账阻,不利用undo就可以閃回到歸檔策略內(nèi)的任何一個時間點上蒂秘。

select * from dba_FLASHBACK_ARCHIVE;

select * from dba_FLASHBACK_ARCHIVE_TS;

select * from dba_FLASHBACK_ARCHIVE_TABLES;

5.2) Flashback archive的后臺進程

Oracle11g為Flashback data archive特性專門引入了一個新的后臺進程FBDA,

用于將追蹤表(traced table淘太,也就是將指定使用flashback data archive的table)

的歷史變化數(shù)據(jù)轉存到閃回歸檔區(qū)姻僧。


? ? ? 5.3) Flashback archive 的限制條件

(1)Flashback data archive只能在ASSM的tablespace上創(chuàng)建

(2)Flashback data archive要求必須使用自動undo管理,即 undo_management 參數(shù)為auto?

? ? ? 5.4) 創(chuàng)建FDA? ?

? ? ? ? ? create tablespace weisi_fda_tbs1? datafile '/opt/soft/fda/fda1.dbf' size 100M;

? ? ? ? ? create tablespace weisi_fda_tbs2? datafile '/opt/soft/fda/fda2.dbf' size 100M;

? ? ? ? ? ? 創(chuàng)建一個默認的Flashback Archive蒲牧,數(shù)據(jù)保留期為1個月

? ? ? ? ? ? create flashback archive default fla1 tablespace weisi_fda_tbs1? retention 1 month;

? ? ? ? ? ? create flashback archive? fla2 tablespace weisi_fda_tbs2? retention 10 day;



? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA2 SET DEFAULT;? ?

? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA1 ADD? ? TABLESPACE TBS_DATA2;

? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA1 REMOVE? TABLESPACE TBS_DATA2;

? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA1 MODIFY RETENTION 1 MONTH;

? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA1 PURGE ALL;

? ? ? ? ? ? ? ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

? ? ? ? ? ? ? DROP FLASHBACK ARCHIVE FLA2;



? ? ? 5.5)? 使用閃回數(shù)據(jù)歸檔

閃回數(shù)據(jù)歸檔區(qū)創(chuàng)建完成以后撇贺,就可以指定特定的表,使其對應到特定的數(shù)據(jù)歸檔區(qū)冰抢。把表指定到對應的數(shù)據(jù)歸檔區(qū)有兩種方法松嘶,

一是在創(chuàng)建的時候直接指定歸檔區(qū),一種是對現(xiàn)有的表指定一個歸檔區(qū)挎扰。

注意翠订,如果不指定歸檔區(qū)的名稱,則指定到默認歸檔區(qū)鼓鲁,否則蕴轨,就屬于指定的數(shù)據(jù)歸檔區(qū)。

grant flashback archive on fla1 to weisi;

grant flashback archive on fla2 to weisi;

grant flashback archive administer to weisi_huif;

1)create table wzx_date(a int) flashback archive;

2)alter? table wzx_t flashback archive ;

3)alter table wzx_t no flashback archive;

4) alter table wzx_t no flashback archive fla2;

? ? ? insert into wzx_date values(1);

? ? insert into wzx_date values(2);

? insert into wzx_date values(3);

insert into wzx_date values(4);

? ? insert into wzx_date values(5);

delete wzx_date where a=1;

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;

insert into wzx_date values(11);

? insert into wzx_date values(22);

? ? insert into wzx_date values(33);

? insert into wzx_date values(44);

insert into wzx_date values(55);

set autotrace on

select * from wzx_date as of timestamp to_timestamp('2016-05-07 00:57:14', 'yyyy-mm-dd hh24:mi:ss');

select * from weisi.wzx_date as of timestamp to_timestamp('2016-05-07 00:57:14', 'yyyy-mm-dd hh24:mi:ss');

alter table wzx_t add? id int;

5.6) FBDA會產(chǎn)生兩個內(nèi)部表

對某一個表使用FBDA后骇吭,我們可以根據(jù)視圖dba_flashback_archive_tables找出其中一個內(nèi)部表SYS_FBA_HIST_XXX橙弱。

? ? 當然我們知道他是用來存儲所有的在這個表上發(fā)生過的數(shù)據(jù)變化。

但我又發(fā)現(xiàn)了其實還有另一個內(nèi)部表也被使用燥狰,這個表叫做SYS_FBA_TCRV_XXX棘脐。

SYS_FBA_HIST_XXX是存放發(fā)生過的transaction的數(shù)據(jù)更改的前鏡像。

SYS_FBA_TCRV_XXX則是存放transaction的信息龙致。

FBDA只記錄update和delete蛀缝,不會記錄insert到SYS_FBA_HIST_XXX.

? ? ? select table_name,FLASHBACK_ARCHIVE_NAME,ARCHIVE_TABLE_NAME from dba_flashback_archive_tables;


動Flashback Data Archive的表支持以下的DDL 操作

(1)ALTER TABLE statement that does any of the following:

1)Adds, drops, renames, or modifies a column

2)Adds, drops, or renames a constraint

3)Drops or truncates a partition

or subpartition operation

(4)TRUNCATE TABLE statement

(5)RENAME statement that renames a table

-- 啟動Flashback Data Archive的表上的一些DDL 操作可能觸發(fā)ORA-55610的錯誤,

這些DDL 如下:

(1)ALTER TABLE statement that moves or exchanges a partition

or subpartition operation

(2)DROP TABLE statement

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末目代,一起剝皮案震驚了整個濱河市屈梁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榛了,老刑警劉巖在讶,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霜大,居然都是意外死亡构哺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門战坤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙强,“玉大人残拐,你說我怎么就攤上這事〉欤” “怎么了溪食?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娜扇。 經(jīng)常有香客問我眠菇,道長,這世上最難降的妖魔是什么袱衷? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮笑窜,結果婚禮上致燥,老公的妹妹穿的比我還像新娘。我一直安慰自己排截,他們只是感情好嫌蚤,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著断傲,像睡著了一般脱吱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上认罩,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天箱蝠,我揣著相機與錄音,去河邊找鬼垦垂。 笑死宦搬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的劫拗。 我是一名探鬼主播间校,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼页慷!你這毒婦竟也來了憔足?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酒繁,失蹤者是張志新(化名)和其女友劉穎滓彰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欲逃,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡找蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稳析。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洗做。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弓叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诚纸,到底是詐尸還是另有隱情撰筷,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布畦徘,位于F島的核電站毕籽,受9級特大地震影響,放射性物質發(fā)生泄漏井辆。R本人自食惡果不足惜关筒,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杯缺。 院中可真熱鬧蒸播,春花似錦、人聲如沸萍肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塘揣。三九已至包雀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亲铡,已是汗流浹背才写。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奴愉,地道東北人琅摩。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像锭硼,于是被迫代替她去往敵國和親房资。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • SCN System Change Number. A database ordering primitive. ...
    wqh8384閱讀 740評論 0 0
  • 1檀头、開啟轰异、關閉閃回策略開啟閃回需要數(shù)據(jù)庫在歸檔模型下,所以首先需要開啟歸檔暑始。并且在mount狀態(tài)下搭独。 注意:不開啟...
    笑才閱讀 734評論 0 0
  • shutdown immediate --1.創(chuàng)建表空間 create tablespace EAMP ...
    零點145閱讀 682評論 0 0
  • 1. 服務端安裝 https://jingyan.baidu.com/article/363872eccfb926...
    約見閱讀 1,106評論 0 0
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒廊镜。表情可以傳達很多信息牙肝。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,050評論 2 7