Oracle flashback之傳統恢復vs.重現數據庫

簡介 數據庫

  Flashback數據庫是一種時點(PIT)數據庫恢復的方式。這種不徹底的恢復策略能夠用於恢復因爲人爲錯誤致使邏輯損壞的數據庫。在10g中引入以後,它的設計目標就是以縮減恢復時間而得到最大的可用性。這篇文章將會探索Flashback數據庫,將其與傳統的恢復方法相比較,而且演示一下如何配置和執行重現恢復。

緩存

傳統恢復vs.重現數據庫服務器

  致使停機的第一個緣由就是人爲錯誤致使的邏輯損壞,這一點已經被普遍認可。關於邏輯損壞的例子,從用戶不正確的更新數據和截取表,到批處理任務錯誤運行2次或者打亂順序,比比皆是。結果都是相同的——數據庫損壞,而且範圍廣闊且難以辨認。Oracle經過了兩種策略來將數據庫返回到先前的某個時點上:傳統恢復和重現數據庫。oracle

不徹底的恢復是數據庫恢復到先前某個狀態的恢復。這個過程有兩個步驟:從新存儲數據,並向前恢復事務活動到某個你想要的時間。傳統恢復和重現數據庫之間的主要區別就是,傳統恢復從從新存儲全部的數據文件開始,而後才恢復到某個想要的恢復時間,而重現數據庫則是在損壞以後經過從新存儲被改變的塊來向後操做。從這個角度考慮問題的話,讓咱們想一想在一個10TB的數據庫上,有1MB的數據損壞了。傳統的恢復從開始從新存儲10TB的應用程序數據開始,而重現數據庫則是取回這1MB的應用程序數據,從而達到損壞前的那個點。如今咱們分別看看每一種策略。app

傳統恢復ide

  在Oracle 10g以前,將因爲人爲錯誤致使問題的數據庫恢復到先前某個時點的惟一選項就是傳統恢復。這個策略包括了從備份中取出並從新存儲全部的數據庫數據文件,而後再執行向前恢復到某個想要的時間點。媒體恢復能夠基於服務器(RMAN),也能夠基於用戶(操做系統工具)。函數

下圖演示了這個複雜的、成本高昂的、效率極低的多步驟恢復策略。工具



   如今咱們看一下用戶執行了SQL而且損壞了數據庫的狀況。用戶通知了命令中心而且報告了錯誤。系統分析師經過與公司不一樣部門的另一些人協商管理此次事件。恢復經過從備份中從新存儲全部的數據文件而且向前回滾redo日誌到但願的時間點而完成。恢復時間與數據庫的規模成正比,而不是須要恢復的更改的數量。這就意味着恢復時間(MTTR)實際上隨着數據庫的規模增加而不斷增長。性能

重現數據庫測試

  在Oracle 10g中,一項新的重現技術特性,稱爲Flashback Database(重現數據庫)的,做爲傳統恢復的替代品引入了。重現數據庫可讓你快速恢復整個數據庫到先前的某個時間點,而不須要從備份中從新存儲數據庫。在數據庫中常常被描述爲倒轉按鈕,它只是將那些被修改的數據塊恢復到你但願的恢復時間以前。而後應用Redo更改記錄來達到但願的恢復時間點。這個被修改的數據塊就叫作重現日誌。

重現數據庫提供了相對於傳統數據庫很是明顯的優點。對於分析型數據庫則沒有這麼明顯的優點。在數據倉庫中,塊的操做一般是以不記錄日誌的模式執行的。在重現數據庫中,只要數據庫運行的是 歸檔日誌模式,它就能夠返回到塊操做以前的某個狀態,由於被修改的塊能夠經過恢復而撤銷執行的操做。

注意:雖然重現數據庫是集成到數據庫中的,可是它在Oracle的 Express Edition (XE)中是不可用的。

  這裏咱們看一下用戶執行了SQL而且損壞了數據庫的狀況。用戶通知了應用程序數據庫管理員,他執行了重現數據庫命令,數據庫自動恢復到損壞以前的某個點。重現數據庫很快,使由於它只針對被修改的數據進行操做。重現的時間與犯錯誤的數量有關,而與數據庫的規模無關。

配置重現數據庫

  如下的例子演示了命令行配置。這也能夠用企業管理器來完成。

在咱們配置重現數據庫以前,咱們須要照顧如下一些先決條件。

Flash Recovery Area

首先,咱們須要配置一個Flash Recovery Area (FRA)。在10g中,這是個新東西,FRA只不過是一個恢復相關文件的磁盤定位。對於重現數據庫,一個新的後臺進程,名爲Recovery Writer (RVWR),在來自SGA的數據庫重現緩存的映像以前,階段性地寫入磁盤,做爲FRA中的重現日誌。重現日誌是在FRA中由Oracle數據庫自動管理的。


  重現日誌的成本是以空間和性能來衡量的。空間是數據庫寫密度的一個因素。一個24小時運行的,以5%的數據塊寫入做爲重現日誌的方式必然會致使磁盤總體空間的5%的增加。由於塊是以規律的間隔寫入的,而不是事務的一部分,因此對性能的影響是能夠忽略不計的。

要配置FRA,你須要設置以下的初始化參數:

alter system set db_recovery_file_dest=

 'C:\oracle\product\10.2.0\flash_recovery_area' scope=both;

alter system set db_recovery_file_dest_size = 10G scope=both;

歸檔

  接下來,咱們須要配置歸檔。再一次,咱們須要使用FRA做爲咱們的文檔日誌目的地。與傳統恢復相似,重現數據庫須要存檔以向前恢復提交的事務,在重現日誌從新存儲了但願時間以前的時點以後。

要最小化配置存檔,執行以下的命令,按照順序:

SQL> startup mount

ORACLE instance started.

Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     2

Next log sequence to archive   4

Current log sequence           4

重現數據庫

  配置了這些先決條件以後,咱們準備好配置重現數據庫了。

  首先,咱們須要設置重現保持目(db_flashback_retention_target)標。這個初始化參數,以分鐘來計算,表明咱們能夠把數據庫返回到多長時間以前。它的值決定了FRA中重現日誌的數量和時間段。下面咱們的例子將其設置爲24小時。要理解這個保持時間段並非保證是很是重要的。若是FRA須要空間,重現日誌將會自動刪除目標保持時間點以前的記錄。稍後咱們會看到,咱們保證重現日誌的方式在FRA中進行維護。有了保持時間段設置,重現數據庫能夠激活。

SQL> startup mount;

ORACLE instance started.

Database mounted.

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

System altered.

SQL> alter database flashback on;

Database altered.

SQL> alter database open;

Database altered.

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES

重現數據庫示例

下面的例子用於演示,它想要描述單個表以外的損壞。

45. 監控FRA

46. select name,space_limit,space_used, space_reclaimable from v$recovery_file_dest;

47.

48. NAME        SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE

49. --------------------------------------------

50. C:\oracle\product\10.2.0/flash_recovery_area 2147483648  166646272  0

51.

52.

53. select * from v$flash_recovery_area_usage;

54.

55. FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

56. ------------ ------------------ ------------------------- ---------------

57. CONTROLFILE                   0                         0               0

58. ONLINELOG                     0                         0               0

59. ARCHIVELOG                 7.38                         0              29

60. BACKUPPIECE                   0                         0               0

61. IMAGECOPY                     0                         0               0

62. FLASHBACKLOG                .38                         0               1

63. 在表的映像以前顯示

64. select c1, ora_rowscn from my_table;

65.

66.         C1 ORA_ROWSCN

67. ---------- ----------

68.          1    1320954

69. 判斷數據庫的時間點

  在10gR1中,你有兩種選擇來捕捉你的數據庫的PIT:時間戳和系統修改號碼(SCN)。這個信息是做爲重現操做的一部分要求的。捕捉到提交的SCN或者稍後的很是重要,而不是數據管理語言操做。Oracle提供了一種比較笨拙的方式來捕捉提交的SCN,經過userenv('commitscn')函數。咱們的示例在發生損壞的數據管理語言操做以前捕捉到了這個信息。

select current_scn from v$database;


CURRENT_SCN

-----------

   1321065

or

select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')

 "Recover Time" from v$database;

Recover Time

-------------------

2006-09-23:20:13:48


  在10gR2中,Oracle經過從新存儲點簡化了這個過程。一個從新存儲點就是一個用戶定義的與數據庫PIT相關連的名字,能夠在時間戳或者SCN中使用。能夠認爲從新存儲點是一個redo歷史的參考標記。從新存儲點保留在控制文件中,直到從新存儲點被刪除或者重現日誌被刪除。第二個例子保證了重現數據庫對於恢復是可用的。

create restore point my_restore_point;

Operation 206 succeeded.

或者建立從新存儲點my_restrore_point來保證重現數據庫;

注意:從新存儲點並不會保證全部的事務都在那個時間點上提交。它不該該與DB2的關係型數據庫管理系統中的靜默點混淆了。

模擬數據庫損壞


70. 模擬數據庫損壞

71. insert into my_table values (2);

72.

73. 1 row created.

74.

75. commit;

76.

77. 提交完成

78. 判斷數據庫是否因爲人爲錯誤致使邏輯損壞。

79. select c1, ora_rowscn from my_table;

80.

81.         C1 ORA_ROWSCN

82. ---------- ----------

83.          1    1320954

84.          2    1321231

  注意:在默認狀況下,Oracle在時鐘級別上檢索SCN。固然,時鐘當中的全部行都有同樣的SCN。激活行級別的SCN檢索,能夠在CREATE TABLE命令中使用ROWDEPENDENCIES關鍵字。

檢驗重現數據庫是可能的。 判斷你能夠重現的最先的時間。

SELECT OLDEST_FLASHBACK_SCN

     ,to_char(OLDEST_FLASHBACK_TIME,'YYYY-MM-DD:HH24:MI:SS')

     "OLDEST_FLASHBACK_TIME"

 FROM V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI

-------------------- -------------------

            1319629 2006-09-23:19:51:56

判斷你是否有從新存儲點。

select name, scn, time from v$restore_point;

NAME                    SCN TIME

---------------- ---------- ----------------------------

MY_RESTORE_POINT 1321136 23-SEP-06 08.16.24.000000000 PM

這裏是一些你感興趣的視圖。

重現數據庫

你能夠在SQL*Plus 或者 RMAN中執行重現數據庫。重現數據庫能夠是基於修改和從新存儲點的時間。RMAN提供了額外的基於選項的日誌順序。

使用先前建立的從新存儲點來重現數據庫。

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Database mounted.

SQL> flashback database to restore point my_restore_point;

Flashback complete.

在警告日誌中檢查重現數據庫消息

Sat Sep 23 20:38:11 2006

flashback database to restore point my_restore_point

Sat Sep 23 20:38:12 2006

Flashback Restore Start

Flashback Restore Complete

Flashback Media Recovery Start

parallel recovery started with 2 processes

Sat Sep 23 20:38:14 2006

Recovery of Online Redo Log: Thread 1 Group 2 Seq 33 Reading mem 0

 Mem# 0 errs 0:

C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG

Sat Sep 23 20:38:16 2006

Incomplete Recovery applied until change 1321137

Flashback Media Recovery Complete

Completed: flashback database to restore point my_restore_point

驗證你的數據庫恢復到你想要的狀態若是你不滿意,你能夠再次重現,把數據庫向前恢復,直到或者執行了徹底恢復:recover database.注意:重現數據庫能夠經過RESETLOGS執行。

SQL> alter database open read only;

Database altered.

SQL> select c1, ora_rowscn from my_table;

C1 ORA_ROWSCN

---------- ----------

        1    1321002

爲通常用途打開數據庫

對咱們的恢復滿意了以後,爲了通常用途打開數據庫。

SQL> shutdown;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Database mounted.

SQL> alter database open resetlogs;

Database altered.

結論

  重現數據庫將會成爲我最喜歡的Oracle10g特性之一。不管你是否糾正了用戶的錯誤,只是看看先前的數據庫狀態,或者在衰退測試以後回到測試環境中,這個特性都是減小恢復時間的最好策略。咱們看到這項技術很容易使用,比傳統的恢復更快,而且最好的是,它是免費的!我但願你也會認爲重現數據庫是可用性體系結構中的一項主要組件。



oracle視頻教程請關注:http://down.51cto.com/4202939/up

相關文章
相關標籤/搜索