程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> oracle中關於flashback閃回的介紹(基礎教程)

oracle中關於flashback閃回的介紹(基礎教程)

編輯:更多數據庫知識

    1、必須設定undo保留時間足夠大以能夠重構需要閃回的數據
    ALTER SYSTEM SET UNDO_RETENTION=<SECONDS>; seconds值是undo數據保持的秒數。
    Flashback view是由undo retention interval來限制的。
    2、包DBMS_FLASHBACK提供了需求接口
    call dbms_flashback.enable_at_time(‘2010-10-19:11:00:00’);
    call dbms_flashback.disable();
    -------------------------------------
    enable_at_time:會話級的enable flashback,映像時間被設定為最接近指定時間戳的scn
    enable_at_system_change_number:將數據庫閃回到指定的scn號。
    get_system_change_number:返回當前的scn。
    disable:這個存儲過程允許我們在整個會話內停止flashback並將你帶回當前時間的數據狀態。
    ----------
    dbms_flashback.enable存儲過程不可以在有活動事務的時候執行,並且,這個包不能用sys身份執行。
    在使用DBMS_FLASHBACK.ENABLE_AT_TIME前,你必須設定你的NLS_DATE_FORMAT的精確程度,Oracle默認的是精確到天
    3、timestamp 與scn(系統改變號) 的對應關系
    事實上,Oracle在內部都是使用scn,即使你指定的是as of timestamp,oracle也會將其轉換成scn,系統時間標記與scn之間存在一張表,即SYS下的SMON_SCN_TIME表。
    每隔5分鐘,系統產生一次系統時間標記與scn的匹配並存入sys.smon_scn_time表,該表中記錄了最近1440個系統時間標記與scn的匹配記錄,由於該表只維護了最近的1440條記錄,因此如果使用as of timestamp的方式則只能flashback最近5天內的數據(假設系統是在持續不斷運行並無中斷或關機重啟之類操作的話)。SYS.SMON_SCN_TIME最多擁有1440條記錄。這個最大記錄數是這樣計算出來的,ORACLE平均每5分鐘同步一次該表數據,最大保存最近5天的記錄,因此就相當於12(每小時更新次數)*24*5=1440。
    可以用sql驗證一下:
    Sql代碼
    select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time;
    10g中提供了兩個函數scn_to_timestamp() 和timestamp_to_scn() 用來執行時間戳和SCN的轉換。
    下面使用閃回進行演示一下:
    1、登陸到數據庫。
    Sql代碼
    C:\>sqlplus tivan/tivan
    SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 19 22:24:03 2010
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    連接到:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options
    2、查看表的記錄。
    Sql代碼
    SQL> select count(*) from t1
    2  ;
    COUNT(*)
    ----------
    8302
    3、刪除所有的記錄提交。
    Sql代碼
    SQL> delete from t1
    2  ;
    已刪除8302行。
    SQL> commit;
    提交完成。
    4、獲得當前SCN
    如果能夠確切知道刪除之前SCN最好,如果不知道,可以進行閃回查詢嘗試。
    Sql代碼
    SQL> select dbms_flashback.get_system_change_number from dual;
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
    1482649
    SQL> select count(*) from t1 as of scn 1482600;
    COUNT(*)
    ----------
    8302
    SCN=1482600時,t1表中的所有記錄都還在。
    5、利用閃回恢復數據。
    查看驗證一下:
    Sql代碼
    SQL> insert into t1 select * from t1 as of scn 1482600;
    已創建8302行。
    SQL> commit;
    提交完成。
    結果OK
    或者還可以如下操作
    Sql代碼
    SQL>flashback table t1 to scn 1482600;
    SQL> commit;
    Commit complete.
    --對於drop table t1 的操作flashback
    SQL> drop table t1;
    SQL>COMMIT;
    SQL> flashback table t1to before drop;
    SQL>commit;
    對於怎麼取的SCN可以使用timestamp_to_scn() 函數,如:
    Sql代碼
    select timestamp_to_scn(to_timestamp('2010-10-19 21:00:00','YYYY-MM-DD HH:MI:SS')) from dual;

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved