FlashBack總結之閃回資料庫與閃回刪除

jelephant發表於2016-01-03

閃回資料庫的特性

Flashback Database 功能非常類似與RMAN的不完全恢復, 它可以把整個資料庫回退到過去的某個時點的狀態, 這個功能依賴於Flashback log 日誌,而且比RMAN更快速、高效。 因此Flashback Database 可以看作是不完全恢復的替代技術。 但它也有某些限制:
1. Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇
2. 如果刪除了資料檔案或者利用Shrink技術縮小資料檔案大小,這時不能用Flashback Database技術回退到改變之前的狀態,這時候就必須先利用RMAN把刪除之前或者縮小之前的檔案備份restore 出來, 然後利用Flashback Database 執行剩下的Flashback Datbase。
3. 如果控制檔案是從備份中恢復出來的,或者是重建的控制檔案,也不能使用Flashback Database。
4. 使用Flashback Database鎖能恢復到的最早的SCN, 取決與Flashback Log中記錄的最早SCN。

閃回資料庫的架構
Flashback Database 整個架構包括一個程式Recover Writer(RVWR)後臺程式,Flashback Database Log日誌和Flash Recovery Area。一旦資料庫啟用了Flashback Database, 則RVWR程式會啟動,該程式會向Flash Recovery Area中寫入Flashback Database Log, 這些日誌包括的是資料塊的 " 前映象(before image)", 這也是Flashback Database 技術不完全恢復塊的原因。RVWR程式寫入的是閃回資料庫日誌,詳細流程圖見下圖。


[oracle@dg1 ~]$ ps -ef|grep rvw|grep -v grep
oracle    2665     1  0 08:53 ?        00:00:00 ora_rvwr_orcl

RVWR和LGWR的區別

假設T表C1列預設值為null,並進行了如下操作

時間點

作用的列T(C1)的SQL

RVWR

LGWR

09:00:00

Update T set c1=1;

改變前的值null

改變前的值null,改變後的值1

09:10:00

Update T set c1=2;

改變前的值1

改變前的值1,改變後的值2

09:15:00

Update T set c1=3;

改變前的值2

改變前的值2,改變後的值3

09:20:00

Update T set c1=4;

改變前的值3

改變前的值3,改變後的值4

閃回日誌和聯機重做日誌雖然作用相似,但他們還是有不少差異。閃回日誌不是迴圈使用的,聯機重做日誌是迴圈使用的。當事務修改了buffer cache中的資料塊時,會將改變前的值和改變後的值以重做記錄的形式儲存在log buffer中,然後透過LGWR將重做記錄寫入聯機重做日誌中。但是在記錄閃回日誌時,只會將改變前的值儲存在flashback buffer中,再由RVWR寫入閃回日誌中。
閃回時,從閃回日誌的尾部向頭部方向,依次取出閃回日誌中的記錄並應用在資料庫上。而應用重做日誌在進行例項恢復時,從閃回日誌的頭部向尾部方向依次取出重做記錄並應用到資料庫上。
比如當前時間
09:20:00表T中C1列的值為4,當需要閃回到09:10:00表T中C1為2的時候。從尾部應用日誌開始,先取出C1=3這個值覆蓋C1=4,之後繼續取出C1=2覆蓋C1=3。發現已經滿足條件,故停止應用閃回日誌。
與閃回資料庫相關的幾個檢視

1.v$flashback_database_log
Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少,該檢視就可以檢視許多有用的資訊。
Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點
Fashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小
Retention_target: 目標儲存的實際(分鐘)
Estimated_flashback_size: 根據策略對需要的空間大小的估計值

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.

SQL>  select OLDEST_FLASHBACK_SCN os,OLDEST_FLASHBACK_TIME ot,RETENTION_TARGET rt ,FLASHBACK_SIZE fs,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_log;
        OS        OT                                     RT         FS               EFS
----------        ------------------------             ----------   ----------          ---------
    858471   2011-03-23 12:19:20       1440   79970304    95920128

2.v$flashback_database_stat
這個檢視用來對Flashback log  空間情況進行更細粒度的記錄和估計。 這個檢視以小時為單位記錄單位時間內資料庫的活動量, Flashback_Data  代表 Flashback log 產生數量, DB_Date  代表資料改變數量, Redo_Date 代表日誌數量,透過這 3 個數量可以反映出資料的活動特點,更準確的預計 Flash Recovery Area 的空間需求

SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat;
BT                                     ET                               FD                 DD              RD            EFS
-------------------             -----------------------------      ------------    -------------     ----------      ----------
2011-03-24 20:50:40 2011-03-24 21:08:19    2727936    3760128     854016      0
2011-03-24 19:44:19 2011-03-24 20:50:40    5488640    8716288     2470400    93757440

3.v$flashback_database_logfile

該檢視主要記錄閃回日誌的詳細資訊,NAME閃回日誌的位置,FIRST_CHANGE#閃回日誌中記錄的最早的SCN,FIRST_TIME閃回日誌中記錄的最早時間

SQL> select * from v$flashback_database_logfile;

NAME                                                                    LOG#    THREAD#  SEQUENCE#      BYTES FIRST_CHANGE# FIRST_TIME
----------------------------------------------------------------- ---------- ---------- ---------- ---------- ------------- -------------------
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rhqmnl8_.flb            1          1         31    8192000        913156 2011-03-24 21:00:30
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj46g7l_.flb            2          1         13    4096000        861743 2011-03-23 14:00:25
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj7q75f_.flb            3          1         14    3981312        863845 2011-03-23 15:00:41
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjc824j_.flb            4          1         15    3981312        865919 2011-03-23 16:00:57
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjgrsmg_.flb            5          1         16    3981312        867909 2011-03-23 17:00:21

啟用資料庫閃回模式
如果想啟動FLASHBACK DATABASE的功能,您必須在MOUNT模式下,將資料庫透過如下命令至於歸檔模式

SQL> alter database archivelog;
Database altered.

開啟閃回模式

SQL> alter database flashback on;
Database altered.

關閉閃回執行可透過如下命令

SQL> alter database flashback off;
Database altered.

確認閃回是否開啟

select name,current_scn,flashback_On from v$database
NAME                                   CURRENT_SCN         FLASHBACK_ON
---------------------------           ------------------------       ------------------------------                
ORCL                                           0                              YES

與閃回資料庫相關的幾個引數

1.DB_RECOVERY_FILE_DEST_SIZE和DB_RECOVERY_FILE_DEST
要想使用Flashback Database, 必須使用Flash Recovery Area,因為Flashback Database Log只能儲存在這裡。 要配置的2個引數如下,一個是大小,一個是位置。如果資料庫是RAC,flash recovery area 必須位於共享儲存中。資料庫必須處於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 設定的越大,flashback database 的恢復能力就越強,因此建議flash recovery area 能夠放的下所有的資料檔案,增量備份,以及所有尚未備份的歸檔檔案,當然還有它自己產生的flashback logs。
在資料庫執行過程中,oracle 自動向該區域寫入檔案,當剩餘空間不足15%的時候,它就會在alert 中增加警告,提示你空間不足。但此時不會影響資料庫的正常運轉,直到所有空間統統被用掉之後,oracle 首先嚐試刪除尋些過期的檔案,冗餘檔案或備份過的檔案以及閃回日誌,如果這些做完了,還是沒有空閒空間的話,資料庫就被hang住了。

2.DB_FLASHBACK_RETENTION_TARGET:
該引數用來控制flashback log 資料保留的時間,或者說,你希望flashback database 能夠恢復的最早的時間點。預設值是1440,單位是minute,即24 小時,需要注意的是該引數雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如資料庫每天有10%左右的資料變動的話,如果該初始化引數值設定為1440,則flash recovery area 的大小至少要是當前資料庫實際容量的10%,如果該初始化引數設定為2880,則flash recovery area 的大小就至少是資料庫所佔容量的20%。

SQL>alter system set db_flashback_retention_target=1440 scope=both;
啟用閃回資料庫

資料庫的Flashback Database功能預設是關閉的,要想啟用這個功能,就需要做如下配置。

啟用歸檔模式

SQL> alter database archivelog;
Database altered.

開啟閃回模式

SQL> alter database flashback on;
Database altered.

關閉閃回執行可透過如下命令

SQL> alter database flashback off;
Database altered.

閃回資料庫實際操作

1、確認開啟歸檔模式
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app
Oldest online log sequence     1
Next log sequence to archive   4
Current log sequence           4

2.確認開啟閃回

SQL> select flashback_on from v$database;
FLASHBACK_ON                                                                   
------------------------------------------------------                         
YES                                                                    
3.確認閃回日誌的存放位置和最大容量
SQL> show parameter db_recovery
NAME                                       TYPE                                      VALUE     
                                            
------------------------------------      ---------------------------------    -----------------------------------             
db_recovery_file_dest             string                                     /u01/app/flash_recovery_area         
db_recovery_file_dest_size    big integer                            2G                

閃回資料庫

查詢當前時間點

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS')                                                                                                                                                                
---------------------------------------------------------                                                                                                                                              
2011-03-24 09:40:10    
                                                                                                                                                             
查詢當前SCN
SQL> select current_scn from v$database;
CURRENT_SCN                                                                                                                                                                                            
-----------                                                                                                                                                                                            
 905962  
                                                                                                                                                                               
刪除HR使用者
SQL> drop user hr cascade;
User dropped.

進行閃回資料庫

SQL> startup mount;
ORACLE instance started.
Total System Global Area  373293056 bytes                                                                                                                                                              
Fixed Size                  1219496 bytes                                                                                                                                                              
Variable Size             163578968 bytes                                                                                                                                                              
Database Buffers          205520896 bytes                                                                                                                                                              
Redo Buffers                2973696 bytes                                                                                                                                                              
Database mounted.

基於時間點的閃回
SQL> flashback database to timestamp to_timestamp('2011-03-24 09:40:10','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
基於SCN的閃回
SQL> flashback database to scn 905962;
Flashback complete.

開啟資料庫:
在執行完flashback database 命令之後,oracle 提供了兩種方式讓你修復資料庫:
1). 直接alter database open resetlogs 開啟資料庫,當然,指定scn 或者timestamp 時間點之後產生的資料統統丟失。
2). 先執行alter database open read only 命令以read-only 模式開啟資料庫,然後立刻透過邏輯匯出的方式將誤操作涉及表的資料匯出,再執行recover database 命令以重新應用資料庫產生的redo,將資料庫修復到flashback database 操作前的狀態,然後再透過邏輯匯入的方式,將之前誤操作的表重新匯入,這樣的話對現有資料的影響最小,不會有資料丟失。

下面以只讀方式開啟確認是否正確閃回
SQL> alter database open read only;
Database altered.
SQL> conn hr/hr;
Connected.


SQL> select count(*) from user_tables;
  COUNT(*)
----------
        26

以RESETLOGS方式開啟資料庫

SQL> alter database open resetlogs;

閃回資料庫需要注意的幾點:

1.一旦關閉閃回資料庫,flashback recovery area中的閃回日誌將自動全部刪除

2.即便以resetlogs開啟資料庫,當前閃回日誌裡的內容仍然保留,仍然 可以繼續進行閃回以restlogs方式開啟資料庫。之所以考慮以read only放是開啟資料庫,主要是因為以resetlog方式開啟資料庫後,使用者即可運算元據庫,無法校驗閃回的準確性。另外,當閃回資料庫與DATA GUARD結合後,當主庫發生邏輯損壞,我們可以閃回備庫,然後以read only方式開啟備庫,將資料從備庫中匯出後匯入到主庫中,這樣將對資料和業務的影響減小到最小。

3.如果閃回資料庫的時間點之間進行了控制檔案的恢復或重建,資料檔案的收縮,或刪除了某個表空間,則閃回將失敗。

4.閃回日誌在出現空間壓力的情況下,oracle會自動刪除閃回日誌,則有可能導致無法閃回到指定的時間點。如果希望閃回到指定的時間點,可進行如下操作

SQL> create restore point must_to_flashback guarantee flashback database;

這樣我們就給當前時間點取must_to_flashback這個名字,確保能閃回到該時間點上
5.閃回刪除 只能用於非系統表空間和本地管理的表空間
6. 物件的參考約束、索引不會被恢復,指向該物件的外來鍵約束需要重建。
7. 物件能否恢復成功,取決與物件空間是否被覆蓋重用。
8. 當刪除表時,信賴於該表的物化檢視也會同時刪除,但是由於物化檢視並不會被放入recycle bin,因此當你執行flashback table to before drop 時,也不能恢復依賴其的物化檢視,需要dba 手工介入重新建立。
9. 對於Recycle Bin中的物件,只支援查詢.

閃回刪除
Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復使用者誤刪除的物件(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。
Flashback 不支援sys使用者. system表空間下的物件,也不能從回收站裡拿到。故使用SYS 或者SYSTEM使用者登陸時, show recyclebin 為空。
從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當使用者執行drop命令時, 被刪除的表和表的關聯物件( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除, 這些物件先轉移到回收站中,這就給使用者提供了一個恢復的可能。
初始化引數recyclebin 用於控制是否啟用recyclebin功能,預設是ON, 可以使用OFF關閉,如:

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中,當然在刪除時,指定purge 引數,表也將直接刪除,不會寫到recyclebin中。

SQL> drop table test1;
Table dropped.
SQL> drop table uk_czm purge;
Table dropped.

可以看到test1刪除並被放入回收站中而uk_czm沒有放入回收站
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$nzam0J++vbPgQAB/AQARTg==$0 TABLE        2011-03-24:16:56:22

檢視recyclebin中的物件

SQL>select object_Name,original_name from recyclebin
OBJECT_NAME                                        ORIGINAL_NAME
-------------------------------------------------- ------------------
BIN$nzam0J++vbPgQAB/AQARTg==$0                     TEST1
檢視物件的相信內容
SQL> select * from "BIN$nzam0J++vbPgQAB/AQARTg==$0";
        ID NAME
---------- ------------------------------
         1 AA
         2 BB
         3 CC

表空間的Recycle Bin 區域只是一個邏輯區域,而不是從表空間上物理的劃出一塊區域固定用於回收站,因此Recycle Bin是和普通物件共用表空間的儲存區域,或者說是Recycle Bin的物件要和普通物件搶奪儲存空間。當發生空間不夠時,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: 刪除當前使用者的Recycle Bin中的物件
4).
Purge dba_recyclebin: 刪除所有使用者的Recycle Bin中的物件,該命令要sysdba許可權
5).
Drop table table_name purge:  刪除物件並且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復。
6).
Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢復表時,可以透過釋放該物件的index所佔用的空間來緩解空間壓力。 因為索引是可以重建的。

SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40
FLASH_DROP       BIN$nzoFsXtzrUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:56:22

使用原有的表名稱來清空回收站中的表,預設清空回收站中最早的同名表

SQL> purge table FLASH_DROP;
Table purged.

可以看到2011-03-24:19:56:22”也就是最早的“FLASH_DROP”被清除了
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40

執行閃回刪除操作

SQL> flashback table flash_drop to before drop;
flashback table flash_drop to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object

由於資料庫中已經重新建立了flash_drop表,故需加上rename to選項
使用原有的表名稱來閃回回收站中的表,預設閃回回收站中最晚的同名表

SQL> flashback table flash_drop to before drop rename to flash_1;
Flashback complete.

可以看到2011-03-24:19:59:45”也就是最晚的“FLASH_DROP”被閃回了
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                                 OBJECT TYPE           DROP TIME
----------------                  ---------------------------------------------        -------------------------- ------------------------------
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0     TABLE                     2011-03-24:19:59:40


使用回收站中的物件名稱可明確指定需要刪除或閃回的表
SQL> purge table "BIN$nzoFsXt0rUPgQAB/AQAKww==$0";
SQL> flashback table"BIN$nzoFsXt0rUPgQAB/AQAKww==$0" to before drop;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29337971/viewspace-1970208/,如需轉載,請註明出處,否則將追究法律責任。

相關文章