<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    oracle 10g flashback總結(jié)(轉(zhuǎn):http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx)

    Flashback 技術(shù)是以Undo segment中的內(nèi)容為基礎(chǔ)的, 因此受限于UNDO_RETENTON參數(shù)。要使用flashback 的特性,必須啟用自動撤銷管理表空間。
    在Oracle 10g中, Flash back家族分為以下成員: Flashback Database, Flashback Drop,F(xiàn)lashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三種) 和Flashback Table。
     
    一. Flashback Database

    Flashback Database 功能非常類似與RMAN的不完全恢復(fù), 它可以把整個數(shù)據(jù)庫回退到過去的某個時點(diǎn)的狀態(tài), 這個功能依賴于Flashback log 日志。 比RMAN更快速和高效。 因此Flashback Database 可以看作是不完全恢復(fù)的替代技術(shù)。 但它也有某些限制:

    1. Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復(fù)仍是唯一選擇
    2. 如果刪除了數(shù)據(jù)文件或者利用Shrink技術(shù)縮小數(shù)據(jù)文件大小,這時不能用Flashback Database技術(shù)回退到改變之前的狀態(tài),這時候就必須先利用RMAN把刪除之前或者縮小之前的文件備份restore 出來, 然后利用Flashback Database 執(zhí)行剩下的Flashback Datbase。
    3. 如果控制文件是從備份中恢復(fù)出來的,或者是重建的控制文件,也不能使用Flashback Database。
    4. 使用Flashback Database鎖能恢復(fù)到的最早的SCN, 取決與Flashback Log中記錄的最早SCN。
     
    Flashback Database 架構(gòu)

    Flashback Database 整個架構(gòu)包括一個進(jìn)程Recover Writer(RVWR)后臺進(jìn)程,F(xiàn)lashback Database Log日志 和Flash Recovery Area。一旦數(shù)據(jù)庫啟用了Flashback Database, 則RVWR進(jìn)程會啟動,該進(jìn)程會向Flash Recovery Area中寫入Flashback Database Log, 這些日志包括的是數(shù)據(jù)塊的 " 前鏡像(before image)", 這也是Flashback Database 技術(shù)不完全恢復(fù)塊的原因。

    [oracle@dba ~]$ ps -ef|grep rvw
    oracle   12620 12589  0 13:21 pts/1    00:00:00 grep rvw
     
    啟用Flashback Database
    數(shù)據(jù)庫的Flashback Database功能缺省是關(guān)閉的,要想啟用這個功能,就需要做如下配置。
    1. 配置Flash Recovery Area
      要想使用Flashback Database, 必須使用Flash Recovery Area,因?yàn)镕lashback Database Log只能保存在這里。 要配置的2個參數(shù)如下,一個是大小,一個是位置。如果數(shù)據(jù)庫是RAC,flash recovery area 必須位于共享存儲中。數(shù)據(jù)庫必須處于archivelog 模式.
     
    啟用Flash Recovery Area:
    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH;
    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH;

    禁用Flash Recovery Area:
    SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;
     
    對于Flash Recovery Area,Oracle 是這樣建議的,flash recovery area 設(shè)置的越大,flashback database 的恢復(fù)能力就越強(qiáng),因此建議flash recovery area 能夠放的下所有的數(shù)據(jù)文件,增量備份,以及所有尚未備份的歸檔文件,當(dāng)然還有它自己產(chǎn)生的flashback logs。
    在數(shù)據(jù)庫運(yùn)行過程中,oracle 自動向該區(qū)域?qū)懭胛募?dāng)剩余空間不足15%的時候,它就會在alert 中增加警告,提示你空間不足。但此時不會影響數(shù)據(jù)庫的正常運(yùn)轉(zhuǎn),直到所有空間統(tǒng)統(tǒng)被用掉之后,oracle 首先嘗試刪除尋些過期的文件,冗余文件或備份過的文件,如果這些做完了,還是沒有空閑空間的話,數(shù)據(jù)庫就被hang 住了。

    對于因Flash Recovery Area導(dǎo)致的數(shù)據(jù)庫hang的處理,請參考:
    http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668991.aspx
    或者
    http://user.qzone.qq.com/251097186/blog/1244650673
     
    2. 啟用數(shù)據(jù)庫Flashback 功能

    1). 數(shù)據(jù)庫啟動到mount狀態(tài)
    SQL> startup mount;
    2). 檢查Flashback 功能, 缺省時功能是關(guān)閉的。
    SQL> select name, current_scn, flashback_on from v$database;
    NAME    CURRENT_SCN  FLASHBACK_ON
    --------    -----------          ------------------
    DBA      945715          NO
     
    3). 啟動Flashback功能
    SQL>  alter database flashback on;
    數(shù)據(jù)庫已更改。

    SQL>  select name, current_scn, flashback_on from v$database;
    NAME      CURRENT_SCN FLASHBACK_ON
    --------- ----------- ------------------
    DBA                 0 YES

    4). 設(shè)置初始化參數(shù):DB_FLASHBACK_RETENTION_TARGET:

    SQL>alter system set db_flashback_retention_target=1440 scope=both;

    該參數(shù)用來控制flashback log 數(shù)據(jù)保留的時間,或者說,你希望flashback database 能夠恢復(fù)的最早的時間點(diǎn)。默認(rèn)值是1440,單位是minute,即24 小時,需要注意的是該參數(shù)雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如數(shù)據(jù)庫每天有10%左右的數(shù)據(jù)變動的話,如果該初始化參數(shù)值設(shè)置為1440,則flash recovery area 的大小至少要是當(dāng)前數(shù)據(jù)庫實(shí)際容量的10%,如果該初始化參數(shù)設(shè)置為2880,則flash recovery area 的大小就至少是數(shù)據(jù)庫所占容量的20%。

    5). 啟動數(shù)據(jù)庫
    SQL>alter database open;
     
     
    Flashback Database操作示例

    做操作前先備份數(shù)據(jù)庫
    RMAN> backup database;

    1. 檢查是否啟動了flash recovery area:­
    SQL> show parameter db_recovery_file
    NAME                    TYPE        VALUE
    ------------------------------------  ----------- ------------------------------
    db_recovery_file_dest       tring       D:\oracle/flash_recovery_area
    db_recovery_file_dest_size  big integer 1G

    2. 檢查是否啟用了歸檔­
    SQL> archive log list;
    數(shù)據(jù)庫日志模式      存檔模式
    自動存檔            啟用
    存檔終點(diǎn)            USE_DB_RECOVERY_FILE_DEST
    最早的聯(lián)機(jī)日志序列  9
    下一個存檔日志序列  11
    當(dāng)前日志序列        11

    3. 檢查是否啟用了flashback database
    SQL> select flashback_on from v$database;
    FLASHBACK_ON    
     ------------------
    YES              

    4. 查詢當(dāng)前的scn­
    SQL> SELECT CURRENT_SCN FROM V$DATABASE;

    CURRENT_SCN
    -----------
    947921

    5. 查詢當(dāng)前的時間
    SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;

    TIME
    -----------------
    09-10-14 14:37:05

    6. 刪除表A
    SQL> select * from A;

    ID  NAME
    ---------- ----------
    1  tianle
    2  dave

    SQL> drop table A;
    表已刪除。
    SQL> commit;

    7. Flashback Database 實(shí)際是對數(shù)據(jù)庫的一個不完全恢復(fù)操作,因?yàn)樾枰P(guān)閉數(shù)據(jù)庫重啟到mount狀態(tài)。
    SQL> shutdown immediate
    數(shù)據(jù)庫已經(jīng)關(guān)閉。
    已經(jīng)卸載數(shù)據(jù)庫。
    ORACLE 例程已經(jīng)關(guān)閉。
    SQL> startup mount
    ORACLE 例程已經(jīng)啟動。

    Total System Global Area  209715200 bytes
    Fixed Size                  1248116 bytes
    Variable Size              79692940 bytes
    Database Buffers          121634816 bytes
    Redo Buffers                7139328 bytes
    數(shù)據(jù)庫裝載完畢。

    8. 執(zhí)行恢復(fù):分timestamp 或者SCN兩種

    SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd
    hh24:mi:ss');
    閃回完成。

    或者:
    SQL> Flashback database to scn 947921;
    閃回完成。

    9. 打開數(shù)據(jù)庫:
    在執(zhí)行完flashback database 命令之后,oracle 提供了兩種方式讓你修復(fù)數(shù)據(jù)庫:
    1). 直接alter database open resetlogs 打開數(shù)據(jù)庫,當(dāng)然,指定scn 或者timestamp 時間點(diǎn)之后產(chǎn)生的數(shù)據(jù)統(tǒng)統(tǒng)丟失。
    2). 先執(zhí)行alter database open read only 命令以read-only 模式打開數(shù)據(jù)庫,然后立刻通過邏輯導(dǎo)出的方式將誤操作涉及表的數(shù)據(jù)導(dǎo)出,再執(zhí)行recover database 命令以重新應(yīng)用數(shù)據(jù)庫產(chǎn)生的redo,將數(shù)據(jù)庫修復(fù)到flashback database 操作前的狀態(tài),然后再通過邏輯導(dǎo)入的方式,將之前誤操作的表重新導(dǎo)入,這樣的話對現(xiàn)有數(shù)據(jù)的影響最小,不會有數(shù)據(jù)丟失。

    這里演示,就以resetlogs方式打開:
    SQL> alter database open resetlogs;
    數(shù)據(jù)庫已更改。

    驗(yàn)證數(shù)據(jù):
    SQL> select * from A;

            ID NAME
    ---------- ----------
             1 tianle
             2 dave
     
     
     
    和Flashback Database 相關(guān)的2個視圖:
    1. V$database
     這個視圖可以查看是否啟用了Flashback database功能
    SQL> select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    YES

    2. V$flashback_database_log
     Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少, 該視圖就可以查看許多有用的信息。
    Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復(fù)到最早的時點(diǎn)
    Flashback_size: 記錄了當(dāng)前使用的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 hh2
    4:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
     from v$flashback_database_log;

    OS       OT             RT      FS        ES
    ----------  -----------------     ----------  ----------    ----------
    946088  09-10-14 13:49:59  1440     16384000  350920704

    3. V$flashback_database_stat
    這個視圖用來對Flashback log 空間情況進(jìn)行更細(xì)粒度的記錄和估計。 這個視圖以小時為單位記錄單位時間內(nèi)數(shù)據(jù)庫的活動量,F(xiàn)lashback_Data 代表Flashback log產(chǎn)生數(shù)量,DB_Date 代表數(shù)據(jù)改變數(shù)量,Redo_Date代表日志數(shù)量,通過這3個數(shù)量可以反映出數(shù)據(jù)的活動特點(diǎn),更準(zhǔn)確的預(yù)計Flash Recovery Area的空間需求

    SQL> alter session set nls_date_format='hh24:mi:ss';

    會話已更改。

    SQL> select *from v$flashback_database_stat;

    BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
    -------- -------- -------------- ---------- ---------- ------------------------
    14:43:10 15:15:28        6455296   29310976    3898368              0
     
     
    Flashback DROP

    Flashback Drop 是從Oracle 10g 開始出現(xiàn)的, 用于恢復(fù)用戶誤刪除的對象(包括表,索引等), 這個技術(shù)依賴于Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。

    Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站里拿到。故使用SYS 或者SYSTEM用戶登陸時, show recyclebin 為空。
     
    1. Tablespace Recycle Bin

    從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區(qū)域,當(dāng)用戶執(zhí)行drop命令時, 被刪除的表和表的關(guān)聯(lián)對象( 包括索引, 約束,觸發(fā)器,LOB段,LOB index 段) 不會被物理刪除, 這些對象先轉(zhuǎn)移到回收站中,這就給用戶提供了一個恢復(fù)的可能。
     
    初始化參數(shù)recyclebin 用于控制是否啟用recyclebin功能,缺省是ON, 可以使用OFF關(guān)閉。

    SQL> show parameter recycle

    NAME                    TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    buffer_pool_recycle            string
    db_recycle_cache_size         big integer 0
    recyclebin                    string      on

    禁用該功能:
    SQL> alter system set recyclebin=off;
    SQL> alter system set recyclebin=on;

    SQL> alter session set recyclebin=off;
    SQL> alter session set recyclebin=on;

    禁用后刪除的對象將直接刪除,不會寫到Recycle中,當(dāng)然在刪除時,指定purge 參數(shù),表也將直接刪除,不會寫到recyclebin中。
    SQL> drop table name purge;

    查看recyclebin中的對象列表:
    SQL> select * from A;
            ID
            ----------
             1
             2
             3
    SQL> drop table A;
    表已刪除。
    SQL> show recyclebin
    ORIGINAL NAME    RECYCLEBIN NAME       OBJECT TYPE  DROP TIME
    ----------------      -----------------------------          ------------       -------------------

    A            BIN$RWXQQcTPRde0ws4h9ewJcg==$0  TABLE     2009-10-15:12:44:33

    查看recyclebin中對象:
    SQL> select original_name,object_name from recyclebin;

    ORIGINAL_NAME                    OBJECT_NAME
    -------------------------------- ------------------------------
    A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0

    查看recyblebin對象里的內(nèi)容:
    SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";

            ID
           ----------
             1
             2
             3

    表空間的Recycle Bin 區(qū)域只是一個邏輯區(qū)域,而不是從表空間上物理的劃出一塊區(qū)域固定用于回收站,因此Recycle Bin是和普通對象共用表空間的存儲區(qū)域,或者說是Recycle Bin的對象要和普通對象搶奪存儲空間。當(dāng)發(fā)生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。也可以手動的刪除Recycle Bin占用的空間。
    1). Purge tablespace tablespace_name : 用于清空表空間的Recycle Bin
    2). Purge tablespace tablespace_name user user_name: 清空指定表空間的Recycle Bin中指定用戶的對象
    3). Purge recyclebin: 刪除當(dāng)前用戶的Recycle Bin中的對象
    4). Purge dba_recyclebin: 刪除所有用戶的Recycle Bin中的對象,該命令要sysdba權(quán)限
    5). Drop table table_name purge:  刪除對象并且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復(fù)。
    6). Purge index recycle_bin_object_name: 當(dāng)想釋放Recycle bin的空間,又想能恢復(fù)表時,可以通過釋放該對象的index所占用的空間來緩解空間壓力。 因?yàn)樗饕强梢灾亟ǖ摹?/div>
    2. Flashback Drop 實(shí)例操作
    SQL> select original_name,object_name from recyclebin;
    ORIGINAL_NAME                    OBJECT_NAME
    -------------------------------- ------------------------------
    A                                BIN$RWXQQcTPRde0ws4h9ewJcg==$0
    SQL> flashback table a to before drop;
    閃回完成。
    SQL> select * from a;
            ID
             ----------
             1
             2
             3

    當(dāng)我們刪除表A后,在新建表A,這時在恢復(fù)的時候就會報錯,此時我們在閃回時,對表重命名就可以了:
    SQL> drop table a;
    表已刪除。
    SQL> create table a
      2  (id number(1));
    表已創(chuàng)建。
    SQL> flashback table a to before drop ;
    flashback table a to before drop
    *
    第 1 行出現(xiàn)錯誤:
    ORA-38312: 原始名稱已被現(xiàn)有對象使用

    SQL> flashback table a to before drop rename to B;
    閃回完成。
    SQL> select * from B;
            ID
            ----------
             1
             2
             3

    當(dāng)我們刪除表A,在新建表A,在刪除它,這是在Recycle Bin中就會有2個相同的表明,此時恢復(fù)我們就要指定object_name才行.

    SQL> select * from B;
            ID
            ----------
             1
             2
             3
    SQL> drop table B;
    表已刪除。
    SQL> create table B(name varchar(20));
    表已創(chuàng)建。
    SQL> drop table B;
    表已刪除。
    SQL> select original_name,object_name from recyclebin;
    ORIGINAL_NAME                    OBJECT_NAME
    --------------------------------            ------------------------------
    B                                BIN$vYuv+g9fTi2exYP9X2048Q==$0
    B                                BIN$geQ9+NekSjuRvzG+TqDVWw==$0
    SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;
    閃回完成。
    SQL> select * from B;
            ID
           ----------
             1
             2
             3
    一旦完成閃回恢復(fù),Recycle Bin中的對象就消失了. Flashback Drop 需要注意的地方:
    1). 只能用于非系統(tǒng)表空間和本地管理的表空間
    2). 對象的參考約束不會被恢復(fù),指向該對象的外鍵約束需要重建。
    3). 對象能否恢復(fù)成功,取決與對象空間是否被覆蓋重用。
    4). 當(dāng)刪除表時,信賴于該表的物化視圖也會同時刪除,但是由于物化視圖并不會被放入recycle bin,因此當(dāng)你執(zhí)行flashback table to before drop 時,也不能恢復(fù)依賴其的物化視圖,需要dba 手工介入重新創(chuàng)建。
    5). 對于Recycle Bin中的對象,只支持查詢.
     
     
    Flashback Query
    Flashback 是ORACLE 自9i 就開始提供的一項(xiàng)特性,在9i 中利用oracle 查詢多版本一致的特點(diǎn),實(shí)現(xiàn)從回滾段中讀取表一定時間內(nèi)操作過的數(shù)據(jù),可用來進(jìn)行數(shù)據(jù)比對,或者修正意外提交造成的錯誤數(shù)據(jù),該項(xiàng)特性也被稱為Flashback Query。

    一、Flashback Query
    正如前言中所提,F(xiàn)lashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄數(shù)據(jù)!

    什么是多版本讀一致性
    Oracle 采用了一種非常優(yōu)秀的設(shè)計,通過undo 數(shù)據(jù)來確保寫不堵塞讀,簡單的講,不同的事務(wù)在寫數(shù)據(jù)時,會將數(shù)據(jù)的前映像寫入undo 表空間,這樣如果同時有其它事務(wù)查詢該表數(shù)據(jù),則可以通過undo 表空間中數(shù)據(jù)的前映像來構(gòu)造所需的完整記錄集,而不需要等待寫入的事務(wù)提交或回滾。

    flashback query 有多種方式構(gòu)建查詢記錄集,記錄集的選擇范圍可以基于時間或基于scn,甚至可以同時查詢出記錄在undo 表空間中不同事務(wù)時的前映象。用法與標(biāo)準(zhǔn)查詢非常類似,要通過flashback query 查詢undo 中的撤銷數(shù)據(jù),最簡單的方式只需要在標(biāo)準(zhǔn)查詢語句的表名后面跟上as of timestamp(基于時間)或as of scn(基于scn)即可。as of timestamp|scn 的語法是自9iR2 后才開始提供支持。

    1、As of timestamp 的示例:

    SQL>  alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
    會話已更改。
    SQL> select sysdate from dual;
    SYSDATE
    -------------------
    2009-10-15 19:04:16

    SQL> select * from A;

            ID
            ----------
             2
             1
             3
             4

    模擬用戶誤操作,刪除數(shù)據(jù)
    SQL> delete from A;
    已刪除4行。
    SQL> commit;
    提交完成。
    SQL> select * from A;
    未選定行
    查看刪除之前的狀態(tài):
    假設(shè)當(dāng)前距離刪除數(shù)據(jù)已經(jīng)有5 分鐘左右的話:
    SQL> select * from A as of timestamp sysdate-5/1440;

            ID
            ----------
             2
             1
             3
             4
    或者:
    SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

            ID
            ----------
             2
             1
             3
             4
    用Flashback Query恢復(fù)之前的數(shù)據(jù):
    SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
    已創(chuàng)建4行。
    SQL> COMMIT;

    提交完成。

    SQL> select * from A;

            ID
            ----------
             2
             1
             3
             4
    如上述示例中所表示的,as of timestamp 的確非常易用,但是在某些情況下,我們建議使用as of scn 的方式執(zhí)行flashback query,比如需要對多個相互有主外鍵約束的表進(jìn)行恢復(fù)時,如果使用as of timestamp 的方式,可能會由于時間點(diǎn)不統(tǒng)一的緣故造成數(shù)據(jù)選擇或插入失敗,通過scn 方式則能夠確保記錄的約束一致性。

    2. As of scn 示例

    查看SCN:
    SELECT dbms_flashback.get_system_change_number FROM dual;
    SELECT CURRENT_SCN FROM V$DATABASE;

    SQL> SELECT CURRENT_SCN FROM V$DATABASE;
    CURRENT_SCN
    -----------
    1095782

    刪除數(shù)據(jù):
    SQL> delete from A;
    已刪除4行。
    SQL> commit;
    提交完成。
     
    查看刪除之前的狀態(tài):
    SQL> select * from A as of scn 1095782;
            ID
         ----------
             2
             1
             3
             4

    用Flashback Query恢復(fù)之前的數(shù)據(jù):
    SQL> insert into A select * from A as of scn 1095782;
    已創(chuàng)建4行。
    SQL> commit;
    提交完成。
    SQL> select * from A;
            ID
            ----------
             2
             1
             3
             4

    事實(shí)上,Oracle 在內(nèi)部都是使用scn,即使你指定的是as of timestamp,oracle 也會將其轉(zhuǎn)換成scn,系統(tǒng)時間標(biāo)記與scn 之間存在一張表,即SYS 下的SMON_SCN_TIME

    SQL> desc sys.smon_scn_time
     名稱                       是否為空? 類型
     ----------------------------------------- --------    ---------------------------

     THREAD                               NUMBER
     TIME_MP                              NUMBER
     TIME_DP                              DATE
     SCN_WRP                             NUMBER
     SCN_BAS                              NUMBER
     NUM_MAPPINGS                       NUMBER
     TIM_SCN_MAP                         RAW(1200)
     SCN                                   NUMBER
     ORIG_THREAD                         NUMBER

    每隔5 分鐘,系統(tǒng)產(chǎn)生一次系統(tǒng)時間標(biāo)記與scn 的匹配并存入sys.smon_scn_time 表,該表中記錄了最近1440個系統(tǒng)時間標(biāo)記與scn 的匹配記錄,由于該表只維護(hù)了最近的1440 條記錄,因此如果使用as of timestamp 的方式則只能flashback 最近5 天內(nèi)的數(shù)據(jù)(假設(shè)系統(tǒng)是在持續(xù)不斷運(yùn)行并無中斷或關(guān)機(jī)重啟之類操作的話)。
    注意理解系統(tǒng)時間標(biāo)記與scn 的每5 分鐘匹配一次這句話,舉個例子,比如scn:339988,339989 分別匹配08-05-3013:52:00 和2008-13:57:00,則當(dāng)你通過as of timestamp 查詢08-05-30 13:52:00 或08-05-30 13:56:59 這段時間點(diǎn)
    內(nèi)的時間時,oracle 都會將其匹配為scn:339988 到undo 表空間中查找,也就說在這個時間內(nèi),不管你指定的時間點(diǎn)是什么,查詢返回的都將是08-05-30 13:52:00 這個時刻的數(shù)據(jù)。
    查看SCN 和 timestamp 之間的對應(yīng)關(guān)系:
    select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
     
    Flashback version Query

    相對于Flashback Query 只能看到某一點(diǎn)的對象狀態(tài), Oracle 10g引入的Flashback Version Query可以看到過去某個時間段內(nèi),記錄是如何發(fā)生變化的。 根據(jù)這個歷史,DBA就可以快速的判斷數(shù)據(jù)是在什么時點(diǎn)發(fā)生了錯誤,進(jìn)而恢復(fù)到之前的狀態(tài)。

    先看一個偽列 ORA_ROWSCN.  所謂的偽列,就是假的,不存在的數(shù)據(jù)列,用戶創(chuàng)建表時雖然沒有指定,但是Oracle為了維護(hù)而添加的一些內(nèi)部字段,這些字段可以像普通文件那樣的使用。

    最熟悉的偽列就是 ROWID, 它相當(dāng)于一個指針,指向記錄在磁盤上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暫且把它看作是記錄最后一次被修改時的SCN。 Flashback Version Query 就是通過這個偽列來跟蹤出記錄的變化歷史。

    舉個例子:
    SQL> select * from A;
            ID
            ----------
             2
             1
             3
             4
    SQL> insert into A values(5);
    已創(chuàng)建 1 行。
    SQL> select * from A;
            ID
            ----------
             2
             1
             3
             4
             5

    SQL> commit;
    提交完成。
    SQL> select ora_rowscn, id from A;
    ORA_ROWSCN       ID
    ----------             ----------
       1098443          2
       1098443          1
       1098443          3
       1098443          4
       1098443          5

    獲取更多的歷史信息
    SQL>Select versions_xid,versions_startscn,versions_endscn,
       DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original') "Operation", id from A versions between scn minvalue and maxvalue;
    或者
    SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
    from flashback_transaction_query q where q.xid in(select versions_xid from B versions between scn 413946 and 413959);

    VERSIONS_XID     VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio    ID
    ---------------- ----------------- --------------- -------- ----------
    05001A0054020000           1099482                 Update            3
    05001A0054020000           1099482                 Delete            3
    05001A0054020000           1099482                 Delete            2
    05001A0054020000           1099482                 Delete            1
    0400150005020000           1098443                 Insert             5

    下面我們來講下偽列, Flashback Version Query 技術(shù)其實(shí)有很多偽列,但是ORA_ROWSCN是最重要。它記錄的是最后一次被修改時的SCN, 注意是被提交的修改。如果沒有提交,這個偽列不會發(fā)生變化。
     
    ORA_ROWSCN 缺省是數(shù)據(jù)塊級別的,也就是一個數(shù)據(jù)塊內(nèi)的所有記錄都是一個ORA_ROWSCN,數(shù)據(jù)塊內(nèi)任意一條記錄被修改,這個數(shù)據(jù)庫塊內(nèi)的所有記錄的ORA_ROWSCN都會同時改變。上例的查詢結(jié)果以證明。

    不過我們可以在建表時使用關(guān)鍵字 rowdependencies, 可以改變這種缺省行為,使用這個關(guān)鍵字后,每條記錄都有自己的ORA_ROWSCN。

    舉例:
    SQL> create table B (id number(2)) rowdependencies;
    表已創(chuàng)建。
    SQL> insert into B values(1);
    已創(chuàng)建 1 行。
    SQL> insert into B values(2);
    已創(chuàng)建 1 行。
    SQL> insert into B values(3);
    已創(chuàng)建 1 行。
    SQL> commit;
    提交完成。
    SQL> select ora_rowscn, id from B;
    ORA_ROWSCN         ID
    ---------- ----------
       1100560          1
       1100560          2
       1100560          3

    此處SCN一樣,一定很奇怪,這正好說明是最后一次被修改時的SCN,如果沒有提交,是不會變的,我們重做一下就清楚了。

    SQL> analyze table B compute statistics;
    表已分析。
    SQL> select ora_rowscn, id from B;
    ORA_ROWSCN         ID
    ---------- ----------
       1100560          1
       1100560          2
       1100560          3

    SQL> delete from B;
    已刪除4行。
    SQL> select ora_rowscn, id from B;
    未選定行
    SQL> insert into B values(1);
    已創(chuàng)建 1 行。
    SQL> commit;
    提交完成。
    SQL> insert into B values(2);
    已創(chuàng)建 1 行。
    SQL> commit;
    提交完成。
    SQL> select ora_rowscn, id from B;
    ORA_ROWSCN         ID
    ---------- ----------
       1100723          1
       1100729          2
     
     
     
     
     
     
    Flashback Transaction Query
    Flashback Transaction Query也是使用UNDO信息來實(shí)現(xiàn)。利用這個功能可以查看某個事務(wù)執(zhí)行的所有變化,它需要訪問flashback_transaction_query 視圖,這個視圖的XID列代表事務(wù)ID,利用這個ID可以區(qū)分特定事務(wù)發(fā)生的所有數(shù)據(jù)變化。
    示例:
    SQL> insert into B values(3);
    已創(chuàng)建 1 行。
    SQL> commit;
    提交完成。
    SQL> select * from B;

            ID
           ----------
             1
             2
             3

    查看視圖,每個事務(wù)都對應(yīng)相同的XID

    SQL>Select xid,operation,commit_scn,undo_sql from flashback_transaction_query where xid in (
    Select versions_xid from B versions between scn minvalue and maxvalue);
    或者
    SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
    from flashback_transaction_query q where q.xid in(select versions_xid from B versions between scn 413946 and 413959);

    XID              OPERATION                        COMMIT_SCN
    ---------------- -------------------------------- ----------
    UNDO_SQL
    --------------------------------------------------------------------------------

    03001C006A020000 DELETE                              1100723
    insert into "SYS"."B"("ID") values ('4');

    03001C006A020000 DELETE                              1100723
    insert into "SYS"."B"("ID") values ('3');

    03001C006A020000 DELETE                              1100723
    insert into "SYS"."B"("ID") values ('2');
     
    Flashback Table

    注意SYS用戶不支持閃回,這點(diǎn)前面已經(jīng)說明過。

    Flashback Table也是使用UNDO tablespace的內(nèi)容來實(shí)現(xiàn)對數(shù)據(jù)的回退。該命令相對簡單,輸入:flashback table table_name to scn(to timestamp) 即可。

    注意:如果想要對表進(jìn)行flashback,必須允許表的row movement.
    Alter table table_name row movement;
     
    要查看某表是否啟用row movement,可以到user_tables 中查詢(或all_tables,dba_tables),
    例如:
    SQL> select row_movement from user_tables where table_name='C';
    ROW_MOVE
    --------
    ENABLED

    要啟用或禁止某表row movement,可以通過下列語句:

    --啟用
    JSSWEB> ALTER TABLE table_name ENABLE ROW MOVEMENT;
    表已更改。
    --禁止
    JSSWEB> ALTER TABLE table_name DISABLE ROW MOVEMENT;
    表已更改。

    舉例:

    SQL> create table C (id number(2));
    表已創(chuàng)建。
    SQL> insert into C values(1);
    已創(chuàng)建 1 行。
    SQL> insert into C values(2);
    已創(chuàng)建 1 行。
    SQL> commit;
    提交完成。
    SQL> select * from c;
            ID
    ----------
             1
             2

    SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
    會話已更改。
    SQL> select sysdate from dual;
    SYSDATE
    -------------------
    2009-10-15 21:17:47
    SQL> select current_scn from v$database;

    CURRENT_SCN
    -----------
          1103864

    刪除數(shù)據(jù)并恢復(fù)
    SQL> delete from C;
    已刪除2行。
    SQL> commit;
    提交完成。
    SQL> alter table c enable row movement;
    表已更改。
    SQL> flashback table c to scn  1103864;
    閃回完成。
    或者:
    SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-
    dd hh24:mi:ss');

    SQL> select * from c;
            ID
    ----------
             1
             2

    Flashback table 命令支持同時操作多個表,表名中間以逗號分隔即可,如果你執(zhí)行一條flashback table命令時同時指定了多個表,要記住單個flashback table 是在同一個事務(wù)中,因此這些表的恢復(fù)操作要么都成功,要么都失敗。
    如:
    flashback table a,b ,c to scn 1103864;
     
    一些注意事項(xiàng)
    1. 基于undo 的表恢復(fù),需要注意DDL 操作的影響
    第三個就是修改并提交過數(shù)據(jù)之后,對表做過DDL 操作,包括:
    drop/modify 列, move 表, drop 分區(qū)(如果有的話), truncate table/partition,這些操作會另undo 表空間中的撤銷數(shù)據(jù)失效,對于執(zhí)行過這些操作的表應(yīng)用flashback query 會觸發(fā)ORA-01466 錯誤。另外一些表結(jié)構(gòu)修改語句雖然并不會影響到undo 表空間中的撤銷記錄,但有可能因表結(jié)構(gòu)修改導(dǎo)致undo 中重做記錄無法應(yīng)用的情況,比如對于增加了約束,而flashback query 查詢出的undo 記錄已經(jīng)不符合新建的約束條件,這個時候直接恢復(fù)顯然不可能成功,你要么暫時disable 約束,要么通過適當(dāng)邏輯,對要恢復(fù)的數(shù)據(jù)進(jìn)行處理之后,再執(zhí)行恢復(fù)。
    另外,flashback query 對v$tables,x$tables 等動態(tài)性能視圖無效,不過對于dba_*,all_*,user_*等數(shù)據(jù)字典是有效的。同時該特性也完全支持訪問遠(yuǎn)端數(shù)據(jù)庫,比如select * from tbl@dblink as of scn 360;的形式。
     
    2. 基于undo 的表恢復(fù),flashback table 實(shí)際上做的也是dml 操作(會在被操作的表上加dml 鎖),因此還需要注意triggers 對其的影響,默認(rèn)情況下,flashback table to scn/timestamp 在執(zhí)行時會自動disable 掉與其操作表相差的triggers,如果你希望在此期間trigger 能夠繼續(xù)發(fā)揮做用,可以在flashback table 后附加
    ENABLE TRIGGERS 子句。
     
    補(bǔ)充:

    什么是Automatic Undo Management( 自動撤銷管理表空間)
    提到自動撤銷管理表空間,就不得不提手動管理的回滾段。在9i 之前,回滾段的管理和監(jiān)控是需要dba手工介入的,創(chuàng)建合適的回滾段是件非常耗費(fèi)dba 精力的事情,你可能需要不斷關(guān)注oracle 運(yùn)行狀況很長一陣子時間后,通過不斷的調(diào)整才能基本確認(rèn)一段時期內(nèi)回滾段的大小,一旦回滾段創(chuàng)建的不合適,就極有可能引起性能問題甚至錯誤,比如ora-1555 就是典型的回滾段設(shè)置不合適觸發(fā)的。
    9i 之后呢(含9i),oracle 為了清晰它的整個概念,取消了回滾段這個說法(實(shí)際上并未取消回滾段),而完全以undo 來代替,這也它正好與redo 相對應(yīng),一個重做,一個撤銷。回滾段可以不再由dba 手工介入,而是完全由它自己在運(yùn)行時自動分配,這在一定程度上即解放了dba,也確實(shí)起到了提高性能的作用,比如采用自動管理表空間就可以最大程序的降低ora-1555發(fā)生的機(jī)率(注意是降低,不是避免,我們不可能創(chuàng)建一個無限大的回滾段,ora-1555 也并不完全是回滾段造成的,關(guān)于ora-1555 的問題這里就不深入討論了,互聯(lián)網(wǎng)上已經(jīng)有太多文章描述和介紹該問題及解決方案)
    是否起用自動管理的撤銷表空間由二個初始化參數(shù)決定:
    UNDO_MANAGEMENT:值為AUTO 表示使用了自動撤銷管理表空間,MANUAL 則表示手動管理
    UNDO_TABLESPACE:當(dāng)UNDO_MANAGEMENT 值為AUTO 時,該參數(shù)用來指定當(dāng)前的undo 表空間名稱。
    undo 表空間的大小,直接影響到flashback query 的查詢能力,因?yàn)槎喟姹静樵兯蕾嚨膗ndo 數(shù)據(jù)都存儲在undo 表空間中,該表空間越大,所能夠存儲的undo 數(shù)據(jù)自然也越多,如果該表空間可用空間非常小,別說flashback 了,恐怕正常查詢都有可能觸發(fā)ora-1555 吧。

    初始化參數(shù)UNDO_RETENTION
    該參數(shù)用來指定undo 記錄保存的最長時間,以秒為單位,是個動態(tài)參數(shù),完全可以在實(shí)例運(yùn)行時隨時修改通常默認(rèn)是900 秒,也就是15 分鐘。
    一定要注意,undo_retention 只是指定undo 數(shù)據(jù)的過期時間,并不是說,undo 中的數(shù)據(jù)一定會在undo表空間中保存15 分鐘,比如說剛一個新事務(wù)開始的時候,如果undo 表空間已經(jīng)被寫滿,則新事務(wù)的數(shù)據(jù)會自動覆蓋已提交事務(wù)的數(shù)據(jù),而不管這些數(shù)據(jù)是否已過期,因此呢,這就又關(guān)聯(lián)回了第一點(diǎn),當(dāng)你創(chuàng)建
    一個自動管理的undo 表空間時,還要注意其空間大小,要盡可能保證undo 表空間有足夠的存儲空間。
    同時還要注意,也并不是說,undo_retention 中指定的時間一過,已經(jīng)提交事務(wù)中的數(shù)據(jù)就立刻無法訪問,它只是失效,只要不被別的事務(wù)覆蓋,它會仍然存在,并可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數(shù)據(jù)庫又不是那么繁忙,那么其實(shí)undo_retention 參數(shù)的值并不會影響到你,哪怕你設(shè)置成1,只要沒有事務(wù)去覆蓋undo 數(shù)據(jù),它就會持續(xù)有效。因此呢,這里還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。

    只有在一種情況下,undo 表空間能夠確保undo 中的數(shù)據(jù)在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數(shù)據(jù)不會覆蓋,
    例如:
    SQL> Alter tablespace undotbs1 retention guarantee;
    如果想禁止undo 表空間retention guarantee,
    例如:
    SQL> Alter tablespace undotbs1 retention noguarantee;



    本文轉(zhuǎn)載于:http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx

    posted on 2010-03-17 15:33 duduli 閱讀(1302) 評論(3)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    評論

    # re: oracle 10g flashback總結(jié)(轉(zhuǎn):http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx) 2010-06-18 10:23 53中文網(wǎng)

    頂一下吧  回復(fù)  更多評論   

    # re: oracle 10g flashback總結(jié)(轉(zhuǎn):http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx) 2010-07-27 19:57 戰(zhàn)斗的小飛俠

    非常好,謝謝  回復(fù)  更多評論   

    # re: oracle 10g flashback總結(jié)(轉(zhuǎn):http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx) 2010-09-08 14:41 貓王

    很經(jīng)典  回復(fù)  更多評論   

    <2010年3月>
    28123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導(dǎo)航

    統(tǒng)計

    • 隨筆 - 140
    • 文章 - 0
    • 評論 - 211
    • 引用 - 0

    公告

    welcome to my place.

    常用鏈接

    留言簿(5)

    我參與的團(tuán)隊

    隨筆分類

    隨筆檔案

    新聞分類

    石頭JAVA擺地攤兒

    搜索

    •  

    積分與排名

    • 積分 - 256107
    • 排名 - 220

    最新評論

    閱讀排行榜

    評論排行榜

    @duduli 主站蜘蛛池模板: 麻豆最新国产剧情AV原创免费| 亚洲电影国产一区| 99爱在线观看免费完整版 | 久久青草91免费观看| 亚洲精品无码你懂的| 久久亚洲中文字幕精品有坂深雪 | 亚洲国产第一站精品蜜芽| 国产一级淫片a视频免费观看| 亚洲视频在线免费看| 久久免费高清视频| 猫咪www免费人成网站| 亚洲综合在线一区二区三区| 亚洲网红精品大秀在线观看| 国产亚洲av片在线观看播放| 亚洲欧洲久久久精品| 四虎永久成人免费| 日韩一级在线播放免费观看| 青青青免费国产在线视频小草| 日韩在线不卡免费视频一区| 中文字幕视频在线免费观看| 无码AV动漫精品一区二区免费 | 日日麻批免费40分钟日本的| 一区二区三区四区免费视频| 三年在线观看免费观看完整版中文| 国产AV无码专区亚洲AV琪琪| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲色精品VR一区区三区| 亚洲乱码中文论理电影| 亚洲综合图片小说区热久久| 久久精品国产亚洲AV大全| 亚洲精品线在线观看| 亚洲av永久无码制服河南实里| 国产成人精品日本亚洲| 国产精品亚洲一区二区三区在线| 亚洲无码视频在线| 中文字幕亚洲综合久久菠萝蜜 | 亚洲国产成人久久99精品| 亚洲福利电影在线观看| 噜噜噜亚洲色成人网站∨| 亚洲尹人香蕉网在线视颅| 中文字幕亚洲综合精品一区|