閃回功能:
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