2008年01月15日

Oracle 10g FlashBack


主要內容如下:
  1. Configure and use flashback database
  2. Use the Flashback drop feature to recover dropped tables
  3. Use the Flashback Versions Query feature to retrieve row history information
  4. Use the Flashback transaction query fasture to audit or recover from transactions
  5. Use the Flashback table feature to recover tables to a point in time
  6. 官方網址 http://download-west.oracle.com/docs/cd/B13789_01/appdev.101/b10795/adfns_fl.htm#1011142

Recovery at all levels:
  1. Database level:可使用flashback把database還原於指定的時間
    • 在10g以前如db確定需要還原時,需要把備份檔從磁帶中取出,再進行還原。現在可以利用flashback省下這些時間,而直接進行還原
  2. Table level:可使用flashback把table還原到指定的時間,也可利用這個特性把刪除的table復原回來(就跟windows的資源回收桶功能一樣)
  3. Row level:可使用flashback還原特定的一筆資料到指定的時間

Flashback的好處:
  1. 當使用者誤動作時,需要還原db到特定時間點的標準處理流程為:
    user error-->restore files --> apply logs forward-->repaired database,如有使用flashback的功能的話,將變成 user error --> apply logs backward --> repaired database
  2. 可省下restore datafile的時間
  3. flashback操作是簡單的,不需要繁雜的操作
  4. flashback還原是快速的,因為只有還原被修改的資料
  5. 主要是取代incomplete recovery,但是,有一些限制:
    1.檔案損壞無法用 flashback 修復
    2. 如果 controlfile restore或重建,無法使用 flashback 進行還原
    3. database 使用 resetlogs 打開後,無法使用 flashback 進行還原
    4. 當使用 flashback database 不能恢複資料庫,當 SCN 早於 flashback log 中最早的 log

Flashback 結構:
  1. flashback 有 flashback logs 專門記錄一些訊習,跟 redo log 、undo tablespace的功用類似
  2. flashback logs跟 redo logs不同之處於flashback logs檔案是由OMF (Oracle Managed FIles),並且不需要手動管理,oracle會自動維護相關的運作
  3. 當開起flashback的功能後,會帶起 RVWR (Recovery Write),將會定期的把SGA裏的buffer cache的變動的 block ,整塊整塊的寫入flashback buffer,然後才會寫入flashback logs中。(flashback buffer跟LOG_BUFFER的大小有關,最少值要為 8M 以上)
  4. flashback logs的單位是"塊"並不是以 row 為單位,在 redo buffer 把資料寫到 redo log file之前,需要把 flashback buffer寫到flashback log中,這是為了資料一致性需求
  5. flashback logs觸發刪除、建立、覆寫的絛件:
    1. flashback logs需要被建立時,他會先檢查保留時間的設定跟flashback 空間是否足夠,如都沒有問題才會建立
    2. 當舊的 flashback logs 不需要被保留時或新的 flashback logs要被建立時,舊的 logs 將有可能會被覆寫
    3. flashback logs觸發建立的條件是看設定的"保留時間"

使用 Flashback 的要求:
  1. 你可能要是在archive log mode,為何是可能要在 archive log mode呢? 因為有些flashback提供的功能運作是使用undo技術,並不必用到flashback logs,只有用到flashback logs這個技術時,才而要在 archive log mode ;如 flash query、flash table、flash version query 都是使用 undo ,所以他們的保留時間就為 undo_retention的設定值有密切關係


flashback 管理
  1. 除了可在 EM 的web管理介面設定開起/關畢  flashback 的功能之外,可以手動操作開/關
  2. 操作流程為
    • SQL>alter system set db_recovery_file_dest_size=10G;
    • SQL>alter  system set db_recovery_file_dest='d:/oracle/product/10.2.0/flashback/raw';
    • SQL>alter system  set db_flashback_retention_target =2880; (2880分,為2天)
    • SQL>alter database flashback on;
  3. 查看是否flashback功能是否有開起
    • select flashback_on from v$database;
  4. 必要的條件
    • database must be in mount exclusive的狀態下才能操作
    • database 必需要為 archivelog mode
  5. 新增加 一個 undo tablespace 額外的參數,retention guarantee,主要是讓oracle自已依 undo_retention 的設定值自已調整 undo tablespace 的大小。undo_retention 的預設值為900秒
    • SQL> create  undo tablespace  undotbs1
               datafile  'undotbs01.dbf'
               size 100M  autoextend on
               RETENTION  GUARANTEE;
      SQL> select  tablespace_name , retention
               from  dba_tabelspaces;
      SQL>alter  tablespace  undotbs1  RETENTION  NOGUARANTEE;



操作面:


查看flash recovery area當用的指令
SQL> select estimated_flashback_size , flashback_size from v$flashback_database_log;
SQL>select oldest_flashback_scn , oldest_flashback_time from v$flashback_database_log;
SQL>select * from v$flashback_database_stat;

oldest_flashback_scn/oldest_flashback_time : 在使用flashback做不完全還原時,可還原到的最舊的scn值跟時間點
v$flashbacj_database_stat :每一個小時更新一次資訊,裏面記錄著大可還原的scn值,現在flahback recovery空間的使用大小。用於評估我們是否需要調整 flashback的保留時間、使用空間等參數

設定tablespace內的boject是否要使用 flashback 的功能
SQL>alter tablespace <ts_name> flashback {on | off}
SQL>select  name , flashback_on from v$tablespace;

note:當你重建 control file 後 ,tablespace 會設為預設值為 on



Flashback database:
RMAN>flashback database to time = to_date('2007-01-01 12:00:00','yyyy-mm-dd hh24:mi:ss');
RMAN>flashback database to scn = 1234567;
RMAN>flashback database to sequence=123 thread=1;

SQL>flashback database to timestamp(sysdate-1/24);
SQL>flashback database to scn 123456;

在 data guard 中的應用,我們都知道 standby機器在平常運作時都是處於 mount ,但我們可以利用 flashback database的方式,將standby開起後,進行測試相關程式後,再把他 flashback 到未變的時間點
SQL>create restore point  test_standby guarantee flashback database; (建立一個新的還原點)
SQL>drop restore point  test_standby; (刪除一個還原點)
SQL>flashback database to restore point test_standby; (還原整個db到指定的還原點)
SQL>flashback table  employees to  restore  point  test_standby; (還原指定的 table 到時定的時間點,,而時間就依指定的還原點建立的時刻)

可在sqlplus裏可做flashback的動作,也可在rman中執行。要注意的是,當使用timestamp時,需要指定 "小數秒" 的值,不然會出現錯誤

注意:
  • date和timestamp都是對日期和時間的表示,只是兩種類型的精確度不同,前者精確到秒,後者精確到小數秒(fractional_seconds_precision),可以是 0~9,預設值為 6
  • 當 使用flashback database 到特定的 scn 點時,oracle會先找需要 flashback logs,再配合 online redo log file,然後就可使用alter database open resetlogs 開起db。如所需要的flashback logs不存在的話,那將回傳錯誤的訊習
  • 預設恢復時間為24小時內,而佔用的空間就要看你的db大小了,受參數 DB_FLASHBACK_RETENTION_TARGET 設定值影響
  • 當control file 被重建後或restore後,flashback的記錄將重新開始
  • data file size被修改後,無法用flashback還原成原來的size
  • 使用 flashback logs 技術來實現
  • 要能 flashback database 於用 resetlogs  之前的時間點的話,必要的 flashback logs 和 archive logs的檔案都必需要存在
  • 要有 sysdba 權限的使用者才能執行

flashback  table/index/trigger/constraints
  • 參數 recyclebin 要為 true
  • 當 user 或 tablespace被刪除時,存在 recycle 裏有關 user或 tablespace的資料將會被自動刪除
  • 每個人只能看到自已刪除的,就算你有權限刪除別人的 table ,被刪除的 table 的資料會存在 table 的 owner那邊的 recyclebin。除非你是sysdba才有辦法看到全部 recycle 裏的資料
  • 檔案格式為:BIN$unique_id$version,其中unique_id是26個字元的對象唯一編號,version則是 object 在數據庫中的版本編號。所以可以避免重覆 table 名稱存在
  • 當有多個相同名稱 table 被刪除的話,存放在 recyclebin 裏的資料是 LIFO (last in, first out)方式存放
  • 在還原時除了可用原來的名稱,也可指定新的名稱
    flashback table <table_name> to before drop [rename to <new_name>];
  • 可直接查尋存放在 recyclebin 裏的table (只可查尋資料,不可做任何的 DML 、 DDL的動作)
    select * from "BIN$zzddjjert==$0" [as of .......] where ............;
  • alter  table  employees  enable  row  movement;
    (因為 flashback table 不會記錄 row id,所以這行必需執行)
  • flashback  employees  to  timestamp(sysdate-1);
  • flashback table employees , departments  to  scn 1234567  enable  triggers;

注意
  • table的tablespace是system的話,當刪除後,並不會存放在 recyclebin 中
  • tablespace 必需為 locally managed (9g以後(含),預設值都為locally managed)
  • 當 table 有 Fine Grain Auditing (FGA) or Virtual Private Database (VPD)設定時,刪除後,並不會存放在 recyclebin 中
  • bitmap join index被刪除也不會存放在 recyclebin 中
  • materialized view log被刪除也不會存放在 recyclebin 中
  • 需要flashback any table權限才能執行
  • 需要有權限操作被處理的object
  • flashback table這個動作會寫 log 到 alter_xxxx.log 裏
  • 需要有必要的權限操作被處理object


flashback version query
  • 查特定時間內,資料的變化
  • select version_xid , salary from employees version betweeb  time1 and time2 where last_name = 'Fox';
    version_xid是虛欄位,就像 rowid 一樣,是用來標明版本;而 time1 跟 time2 可用scn (system change number)來取代
  • 如是 IOT (index-organized tables )的話,會將 update 轉變成 delete、insert 語法
  • 使用undo來實現

  • select version_xid  as  XID,
             version_startscn  as   START-SCN,
             version_endscn  as  END_SCN,
             version_operation  as  OPERATION , first_name
    from  employees
    versions  betweeb  scn  minvalue  and  maxvalue
    AS  OF  SCN  5525300
    where  employee_id = 111;

    XID                               START_SCN               END_SCN            O         FIRST_NAME
    8c0025003A00000        5525293                                                     I          Tom
    8c0025003A00000        5525291                                                     D        Mike
    8c0025003A00000         5525277                         5525291             I          Mike

    從上面的資料可得知
    1. 查scn 5525300跟employee_id = 111 後,可得到3筆變動的資料
    2. 最底一行資料可得知查到的 transaction 值為 8c0025003A0000,然後初始 SCN 值為 5525277, 然後結束的 SCN 值為5525291
    3. 中間那行資訊可看到 END_SCN 為 NULL值 ,這代表了二種情況,一種是他是被刪除了,另一種是他還未COMMIT,狀態未明
    4. 最後一行可看到建立一個新的值,並且得到一個新的 START_SCN值
    PS:當 START_SCN、END_SCN值都為NULL的話,代表你查尋的SCN或時間內,這個"值"尚未有變動過
          當 START_SCN值為NULL ,而 END_SCN有值的話,代表你查尋的SCN或時間的起始點之前都未有改變過
          當 START_SCN有值,而END_SCN值為NULL的話,代表你查尋的SCN或時間點內他的狀態還未確定,另一個可能就是被刪除了
          當沒有多下  AS  OF  的語法的話,就會直接抓指定的時間點或scn值為取出資料量的區間


無法使用的情況:
  • external tables
  • temporary tables
  • fixed tables
  • views
  • 改變資料結構的 DDL 動作,如修改欄位字元數,由6位改成10位


flashback transaction query
  • 主要用於解決使用者下了錯誤的 DML ,利用這個功能可取得 undo SQL 以修復錯誤的資料
  • 要使用這個功能,需要有 SELECT ANY  TRANSACTION 的系統權限
  • 當 undo data 的空間不夠時,在 table flashback_trainsaction_query的 operation 欄位會回傳 unknown的值

  • select  operation, undo_sql, table_name from  flashback_transaction_query;
    (最標準的應用,查尋 undo sql 來進行修復使用者下錯的操作)

  • select  operation, undo_sql, table_name from  flashback_trainsaction_query 
    where xid = HEXTORAW ('8c0024003A000000')
    order  by undo_change#;
    (In a Flashback Transaction Query, the type of the xid column is RAW(8). To take advantage of the index built on the xid column, use the HEXTORAW conversion function: HEXTORAW(xid)。簡單的來說是使用index來查尋)

  • select  operation,  undo_sql,  table_name
    from  flashback_transaction_query
    where  start_timestamp  >= to_timestamp('2007-11-11 11:00:00','yyyy-mm-dd hh:mi:ss')
    and  commit_timestamp  <= to_timestamp('2007-12-12 12:00:00','yyyy-mm-dd hh:mi:ss');
    (查特定時間內全部的 undo_sql)

  • flashback versions query 和 flashbach transaction query
    select  versions_xid , first_name from  hr.employess  
    versions  between  scn  minvalue  and  maxvalue
    where  employee_id = 111;

    select  operation , undo_sql  from flashback_transaction_query
    where  xid = HEXTORAW('8c0024003A000000');
    ( xid = hextoraw ('8x0024003A000000')的值就是看 versions_xid)

注意
  • 需要有select  any  transaction 的權限


常用指令
  • select object_name,original_name from recyclebin; (查看放 recyclebin 裏的資料)
  • show recyclebin ; (只能查放 recyclebin 裏的 table 資料)
  • alter system set  recyclebin=off; (關畢 recyclebin 功能,如要開始把 off 用 on 取代)
  • purge table test; (直接使用 table 名稱刪除存放在 recyclebin 裏的 table,如有相同的名字存在的話,會採用FIFO的方式刪除最舊的資料)
  • purge index id_test; (直接使用 index 名稱刪除存放在 recyclebin 裏的 index,如有相同的名字存在的話,會採用FIFO的方式刪除最舊的資料)
  • purge table "BIN$+7J5MgT2RbCX+tka+zjpgA==$0"; (也可指定完整名稱進行刪除)
  • purge tablespace users_tp; (刪除屬於tablespace user_tp 的全部 object)
  • purge tablespace users fk_user; (刪除屬於 fk_user 使用者的全部 object)
  • purge recyclebin; (刪除屬於自已的全部 object )
  • purge dba_recyclebin; (刪除全部的 recyclebin 裏的資料,只有sysdba權限的人才能執行)
  • flashback table rc_test  to scn
  • flashback table recycletest to scn 123456789;
  • show recyclebin; show user_recyclebin;

  • drop table table_name [pugre]; (直接刪除table不進行回收)
  • drop tablespace  tablespace_name [including contents] (直接刪除tablespace不進行回收)
  • drop user user_name [cascade]; (直接刪除user不進行回收)
  • referential integrity constraints
  • 假如先刪除 index,然後接著刪除 table 的話,那index並不會存在 recyclebin


額外
  • v$database 的 current_scn 欄位可查現在的 scn 值
  • 提供二組函數可自由的轉換 scn 跟  time
    • scn_to_timestamp
    • timestamp_to_scn
    • select  current_scn , SCN_TO_TIMESTAMP(current_scn) from  v$database;


總結:
object levelscenarioflashback  technology
database drop userflashback database
 truncate tableflashback database
 batch job:partial changesflashback database
tabledrop table flashback drop
 update with wrong where clauseflashback table
 compare current data against
the data at some time in the past
flashback query
TxBatch job runs twice,but you
are unsure of the objects affected
flashbacj query

補充:
supplemental log
  • alter  database  add  supplemental  log   data;
    主要是提供額外的 log 記錄,當在做data guard、stream replication時需要設定。主要是因為當來源端要寫到目地端時,如有 table 沒有定義 index、pk的話,有情況之下不會傳送變動的資料給目地端的db。
    也代表了,在 data guard 中,如你的整個 database 中的所有 table 都有定義 index pk,是可以不必設定
    在 stream replication 中,如你要處理的 table 中有定義 index、pk,是可不必設定
    但為了以防萬一,多半還是建意要設定開起 supplemental log。

Posted by my_work at 樂多Roodo! │17:11 │回應(1)引用(0)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/4987759
回應文章
Lovely. Great site.
Posted by home loan at 2009年01月30日 05:36