在oracle 9i中引入了flashback查詢,flashback query實際上是利用UNDO資訊來獲得過去的資料。由於UNDO空間是迴圈使用的,事務的前映像不可能永久儲存,因此flashback query只能支援過去一段時間內的資料查詢,這個時間與undo_retention相關,undo_retention預設設定900s
下面我們來看下flashback查詢恢複資料的例子:
1、建立使用者flySQL> create user fly identified by fly;User created.SQL> grant dba,connect,resource to fly;Grant succeeded.2、建立表和索引SQL> conn fly/flyConnected.SQL> create table fly as select * from dba_objects;Table created.SQL> create index idx_fly on fly(object_id);Index created.SQL> select count(1) from fly;COUNT(1)----------781933、更改會話時間顯示格式SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> select sysdate from dual;SYSDATE-------------------2013-12-05 21:19:524、假設誤刪除刪除資料並提交了,如下所示:SQL> delete from fly where rownum<500;499 rows deleted.SQL> commit;Commit complete.5、可考慮如下方法恢複資料,優先使用flashback5.1 flashback5.2 imp/impdp5.3 rman5.4 logminer6、通過flashback技術來閃回查詢表被刪除前的時間點的資料,並儲存為一張暫存資料表SQL> create table fly_tmp_1205 as select * from fly as of timestamp to_timestamp('2013-12-05 21:19:52','yyyy-mm-dd hh24:mi:ss');Table created.SQL> select count(*) from fly_tmp_1205;COUNT(*)----------78193如果只是大概記得是幾分鐘前被delete的,假設目前時間資料被刪除了11分鐘左右的話:SQL> select count(1) from fly as of timestamp sysdate-11/1440;COUNT(1)----------78193
在Oracle 10g中,增強了閃回查詢功能,並且提供了將整個資料庫回退到過去某個時刻的能力,這個功能
是通過flashback log實現的。flashback log有點類似redo log,只不過redo log將資料庫往前滾,flashback log
則將資料庫往後滾。為了儲存管理和備份恢複相關的檔案,oracle10g提供了一個叫做閃回恢複,這個地區預設建立在ORACLE_BASE目錄下。可以將所有恢複相關的檔案,比如flashback log,archive log,
backup set等,放到這個地區集中管理。
到了Oracle 11g,閃回又出了一個新特性:Oracle Flashback Data Archive. FDA通過將變化資料存放區到另外建立的閃迴歸檔區Flashback Archive)中,和undo區別開來,這樣就可以為閃迴歸檔區單獨設定儲存策略,也可以閃回到指定時間之前的舊資料而不影響undo策略,就是減少對undo的依賴性。 因為在一個很忙的系統,undo保
存的時間是很有限的。 但通過FDA,我們就要靈活很多了。
Flashback技術可以細分以下4種:
Flashback Database,需要開啟閃回功能,預設不開啟閃回功能,生產庫一般不開啟閃回功能
Flashback Drop,需要開啟資源回收筒,預設開啟
Flashback Query(分Flashback Query, Flashback Version Query, Flashback Transaction Query 三種), 基於undo資訊
Flashback Table。 用的不多,其原理也是基於undo資訊,一般恢複資料使用flashback query來代替flashback table
如何查看閃回恢複區裡包含的內容SQL> select file_type from v$flash_recovery_area_usage;FILE_TYPE--------------------CONTROL FILEREDO LOGARCHIVED LOGBACKUP PIECEIMAGE COPYFLASHBACK LOGFOREIGN ARCHIVED LOG7 rows selected.
從Oracle 10g開始,在一些動態效能檢視裡面,如 V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等都新增加了一列:IS_RECOVERY_DEST_FILE ,指明相關的檔案是否在恢複區內。
SQL> select recid,is_recovery_dest_file from v$archived_log where recid<=5;RECID IS_---------- ---1 YES2 YES3 YES4 YES5 YES
1、設定flashback recovery area參數
閃回恢複區主要通過3個初始化參數來設定和管理:
db_recovery_file_dest:指定閃回恢複區的位置
db_recovery_file_dest_size:指定閃回恢複區的可用空間大小
db_flashback_retention_target:指定資料庫可以回退的時間,單位為分鐘,預設1440分鐘,也就是一天。
當然,實際上可回退的時間還決定於閃回恢複區的大小,因為裡面儲存了回退所需要的flash log。所以這個
參數要和db_recovery_file_dest_size配合修改。
SQL> show parameter db_recoveryNAME TYPE VALUE-----------------------------------------------------------------------------db_recovery_file_dest string /home/oracle/flash_recovery_areadb_recovery_file_dest_size big integer 2GSQL> alter system set db_recovery_file_dest_size=8G scope=both;System altered.SQL> alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';System altered.SQL> show parameter db_recoveryNAME TYPE VALUE-----------------------------------------------------------------------------db_recovery_file_dest string /u01/app/oracle/flash_recovery _areadb_recovery_file_dest_size big integer 8G
說明:
設定閃回恢複區後,如果沒有設定過log_archive_dest_n參數,則歸檔日誌預設是儲存到該地區的。我們需要
注意閃回恢複區空間的使用率,如果閃回恢複區滿了,就沒地方放歸檔了,資料庫會hang住,實際上,oracle是通
過隱式的設定log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'來實現的。多個資料庫的閃回恢
複區可以指定到同一個位置,但是db_name不能一樣,或者db_unique_name不一樣。RAC的閃回恢複區必須位於
共用磁碟上,能被所有執行個體訪問。
生產環境,一般建議更改歸檔路徑到非閃回恢複區SQL>alter system set log_archive_dest_1='location=/archivelog';
2、Flashback Database
2.1、如何啟用和禁用Flashback Database
資料庫的Flashback Database功能預設是關閉的,要想啟用這個功能,就需要做如下配置。
1)配置Flash Recovery Area
2)啟動flashback database 預設可以將資料庫閃回1天內,根據db_flashback_retention_target參數
預設情況資料庫的flashback database是關閉,可以在mount狀態下開啟。在設定了閃回恢複區後,可以啟動閃回資料庫功能。
SQL> select flashback_on from v$database;FLASHBACK_ON------------------NO--資料庫必須已經處于歸檔模式:SQL> archive log list;SQL> shutdown immediate;SQL>startup mount;SQL>alter database flashback on;SQL>alter database open;SQL>select flashback_on from v$database;SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 3240239104 bytesFixed Size 2164048 bytesVariable Size 2499807920 bytesDatabase Buffers 721420288 bytesRedo Buffers 16846848 bytesDatabase mounted.SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination /archivelogOldest online log sequence 511Next log sequence to archive 514Current log sequence 514SQL> alter database flashback on;Database altered.SQL> alter database open;Database altered.SQL> select flashback_on from v$database;FLASHBACK_ON------------------YES
2.2 使用Flashback Database 實現對資料庫進行不完全恢複的樣本
2.2.1. 查詢當前的scn和時間SQL> show userUSER is "SYS"SQL>select dbms_flashback.get_system_change_number from dual;或者SQL> select current_scn from v$database;CURRENT_SCN-----------32945957SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> select sysdate from dual;SYSDATE-------------------2013-12-05 23:12:392.2.2. 建立表SQL> conn fly/flyConnected.SQL> drop table fly;Table dropped.SQL> create table fly as select * from dba_objects;Table created.2.2.3. 重啟資料庫到mountSQL> conn sys/oracle as sysdbaConnected.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 3240239104 bytesFixed Size 2164048 bytesVariable Size 2499807920 bytesDatabase Buffers 721420288 bytesRedo Buffers 16846848 bytesDatabase mounted.SQL>2.2.4. 執行恢複:可以使用timestamp或者scn兩種方式進行閃回SQL>flashback database to timestamp to_timestamp('2013-12-05 23:12:39','yyyy-mm-dd hh24:mi:ss');或者SQL> flashback database to scn 32945957;2.2.5. 需要以resetlogs開啟資料庫,查看fly表不存在SQL>alter database open resetlogs;SQL>select count(*) from fly;
3、flashback drop
flashback drop是從Oracle 10g開始出現的,用於恢複使用者誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(資料表空間資源回收筒),功能和windows的資源回收筒非常類似。
flashback drop不支援sys,system使用者,因為它們建立的對象預設在system資料表空間。system資料表空間下的對象,被刪除後,不會進入資源回收筒。故使用sys或者system使用者登陸時, show recyclebin 為空白。
3.1.Tablespace Recycle Bin
從Oracle 10g 開始, 每個資料表空間都會有一個叫作資源回收筒的邏輯地區,當使用者執行drop命令時, 被刪除的表和表的關聯對象( 包括索引,約束,觸發器,LOB段,LOB index 段)不會被物理刪除, 這些對象先轉移到資源回收筒中,這就給使用者提供了一個恢複的可能。
注意:dba_recyclebin只保留非SYSTEM資料表空間下的對象,對於SYSTEM資料表空間的對象,在DROP的時候,也是直接刪除,不會清除。
當一個對象drop後,如果開啟了資源回收筒功能.它並沒有真正被刪除,實際上只是修改了一下名字,我們用select * from user_objects where type= 'TABLE'還能查到.只是它的名字有點怪.例如BIN$qAUuckGyd3TgQKjAFAFTAg==$0
參數recyclebin用於控制是否啟用recyclebin功能,預設是ON, 可以使用OFF關閉。SQL> show parameter recyclebinNAME TYPE VALUE------------------------------------ ----------- ------------------------------recyclebin string on資料表空間的Recycle Bin 地區只是一個邏輯地區,而不是從資料表空間上物理的划出一塊地區固定用於資源回收筒,因此Recycle Bin是和普通對象共用資料表空間的儲存地區,或者說是Recycle Bin的對象要和普通對象搶奪儲存空間。當發生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。也可以手動的刪除Recycle Bin佔用的空間:1. Purge dba_recyclebin: 刪除所有使用者的Recycle Bin中的對象,該命令要sysdba許可權2. Purge recyclebin: 刪除目前使用者的Recycle Bin中的對象3. Drop table table_name purge: 刪除對象並且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢複。4. Purge tablespace tablespace_name : 用於清空資料表空間的Recycle Bin5. Purge tablespace tablespace_name user user_name: 清空指定資料表空間的Recycle Bin中指定使用者的對象6. Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢複表時,可以通過釋放該對象的index所佔用的空間來緩解空間壓力。 因為索引是可以重建的。3.2.查看資源回收筒內容禁用資源回收筒後刪除的對象將直接刪除,不會寫到recyclebin中,當然在刪除時,指定purge 參數,表也將直接刪除,不會寫到recyclebin中。查看recyblebin對象裡的內容:SQL>select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";3.3.Flashback Drop 執行個體操作恢複fly表:SQL> flashback table fly to before drop;如果fly表被刪除後,又重新建立表的名字和fly一樣,則可以恢複的時候rename成另外一張表名:SQL>flashback table fly to before drop rename to fly007;
4、Flashback Query 是利用多版本讀一致性的特性從UNDO 資料表空間讀取操作前的記錄資料。
flashback query對v$tables,x$tables 等動態效能檢視無效,但對於dba_*,all_*,user_*等資料字典是有效。補充閃回查詢恢複函數,預存程序,包,觸發器等對象Flashback Drop 可以閃回與表相關聯的對象, 如果是其他的對象,比如function,procedure,trigger等。 這時候,就需要使用到all_resource表來進行Flashback Query。
4.1.查看dba_source 的所有typeSQL> select type from all_source group by type;TYPE------------PROCEDUREPACKAGEPACKAGE BODYLIBRARYTYPE BODYTRIGGERFUNCTIONTYPE8 rows selected.4.2.建立一函數SQL> conn fly/flyConnected.SQL> CREATE OR REPLACE function getdate return date2 as3 v_date date;4 begin5 select sysdate into v_date from dual;6 return v_date;7 end;8 /Function created.SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> select getdate() from dual;GETDATE()-------------------2013-12-05 23:51:234.3.查詢dba_source 表:SQL>select text from dba_source where name='GETDATE' order by line;SQL>drop function getdate;4.4 Flashback Query 查詢SQL>select text from dba_source as of timestamp to_timestamp('2013-12-05 23:51:23','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;
本文出自 “斜陽悠悠寸草心” 部落格,請務必保留此出處http://fly1116.blog.51cto.com/8301004/1336893