Oracle例項恢復和介質恢復

dbasdk發表於2017-09-07

一、恢復解決方案


錯誤型別及解決方案

錯誤分類

恢復解決方案

介質失敗

如果是少量的塊損壞,使用塊介質恢復;如果是大量的塊、資料檔案、表空間的損壞,可能需要對損壞的資料檔案或者表空間執行完全恢復;如果是歸檔Redo日誌檔案或者聯機Redo日誌檔案的丟失,那麼只需要不完全恢復方式。

邏輯損壞

如果是程式設計師錯誤導致出現的問題,可透過補丁應用修復問題。對於無法修復的問題,也可採用介質恢復手段來恢復資料。

使用者錯誤

根據不同使用者錯誤,選擇不同的Flashback技術恢復,使用Flashback技術恢復使用者錯誤是首選方案。如果Flashback不能很好的恢復資料再考慮使用介質恢復或者表空間時間點恢復。

注意:恢復依賴於備份,當生產環境中部署完成就應該確保有一次資料庫的全庫備份,且確保歸檔Redo日誌被開啟。

二、SCN時間機制

SCNSystem Change Number,系統改變號)是Oracle內容非常重要的時間機制,一致性、資料恢復都與SCN有著非常密切的關係。Oracle啟動時,也是透過SCN的驗證來確認資料庫是否需要執行例項恢復的。雖然RAC有多個例項,但是隻有一個資料庫,SCN是對應資料庫級別的改變號,所以在不同的例項產生的SCN都必須是唯一的、有序的,這是由SCN生成器完成的工作。系統時間和SCN之間可以非常容易的相互轉換,下面是系統時間和SCN相互轉換的例子:

SQL> select timestamp_to_scn(sysdate) from dual;

 

TIMESTAMP_TO_SCN(SYSDATE)

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

               6980593

 

SQL> select scn_to_timestamp(6980593) from dual;

 

SCN_TO_ TIMESTAMP (6980593)

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

02-DES-13 11.12.21.000000000 PM

 

SQL>

以下為幾種常見的SCN

?  檢查點SCN

查詢當前最近的檢查點SCN

SQL> select checkpoint_change# from v$database;

 

CHECKPOINT_CHANGE#

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

        3.6555E+12

 

SQL>

每執行一次檢查點就由CKPT程式來更新,這個SCN儲存在控制檔案中。檢查點的執行能夠確保檢查點執行時刻資料的完整性和一致性。例項恢復也是從上一次檢查點開始進行恢復,檢查點執行的頻率決定了Crash恢復或者例項恢復需要花費的時間。當發生日誌切換或者請求的SGA空間不足等情況時就會觸發檢查點。發生檢查點,DBWn程式會將所有的髒資料寫回磁碟,從而能夠確保已提交的一致性資料被寫回磁碟。單個聯機Redo日誌檔案越大,發生檢查點的間隔時間可能越長,例項恢復的時間也相應地增長,日誌檔案的丟失也會導致更多的資料丟失。

?  最新SCN

執行以下SQL語句檢視資料庫最新的SCN

SQL> select current_scn from v$database;

 

CURRENT_SCN

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

3.6555E+12

 

SQL>

SCN是最新生成的全域性SCN,它在不斷更新,並且只會增大不會減小。

?  資料檔案SCN

執行以下SQL檢視所有資料檔案的SCN

SQL> select checkpoint_change# from v$datafile;

 

CHECKPOINT_CHANGE#

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

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

 

6 rows selected.

 

SQL>

每個資料檔案都有一個資料檔案SCN,每執行一次檢查點便由CKPT程式來更新一次,該SCN儲存在控制檔案中。

?  啟動SCN

執行以下SQL語句查詢所有資料檔案的啟動SCN

SQL> select checkpoint_change# from v$datafile_header;

 

CHECKPOINT_CHANGE#

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

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

        3.6555E+12

 

6 rows selected.

 

SQL>

每個資料檔案都有一個啟動SCN,沒執行一次檢查點都由CKPT程式來更新一次,該SCN儲存在資料檔案頭中。

?  終止SCN

執行下面SQL語句查詢所有資料檔案的終止SCN

SQL> select last_change# from v$datafile;

 

LAST_CHANGE#

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

 

 

 

 

 

 

 

6 rows selected.

 

SQL>

        每個資料檔案都有一個終止SCN,沒執行一次檢查點都由CKPT程式更新一次。該SCN儲存在控制檔案中,當資料庫開啟時,由於沒有終止SCN存在,所以看到的是空,表示無窮大。

        資料庫啟動過程中,首先會檢查控制檔案和資料檔案的檢查點執行次數是否一致,如果不一致需要對資料檔案進行介質恢復。如果一致,進一步檢查資料檔案的啟動SCN和終止SCN是否相同。如果資料庫是非正常關閉,那麼終止SCN肯定是空,這個時候需要執行Crash恢復或例項恢復的過程。Crash恢復或例項恢復過程需要用到聯機Redo日誌和UNDO表空間執行前滾和回滾操作,如果聯機Redo日誌或者UNDO表空間被損壞,那麼資料庫可能無法正常開啟。如果啟動SCN和終止SCN相同,那麼資料庫就可以正常開啟。

?  日誌SCN

執行以下SQL語句查詢與日誌相關的SCN

SQL> select status,first_time,first_change#,next_time,next_change# from v$log;

 

STATUS               FIRST_TIME     FIRST_CHANGE# NEXT_TIME      NEXT_CHANGE#

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

INACTIVE             02-12鏈13        3.6555E+12 02-12鏈13       3.6555E+12

CURRENT              02-12鏈13        3.6555E+12                  2.8147E+14

CURRENT              02-12鏈13        3.6555E+12                  2.8147E+14

INACTIVE             02-12鏈13        3.6555E+12 02-12鏈13       3.6555E+12

 

SQL>

    在上面查詢中,first_time表示該日誌組開始的時間,first_change#表示該日誌組開始的SCN。可以看到,狀態為current的日誌組的first_change#值與前面討論到的檢查點的SCN值相同,說明發生日誌切換的時候會觸發檢查點生成一致的檢查點SCNNext_time表述結束日誌組的時間,next_change#表示結束日誌組的SCN,該SCN值等於下一個日誌組的first_change#值。當前日誌組的next_time為空,next_change#是一個很大的值。

三、日誌執行緒與聯機Redo日誌

Redo日誌記錄了資料的所有操作,以及操作的順序。Redo日誌主要包括聯機Redo日誌、歸檔Redo日誌和Standby Redo日誌三種型別,這三種型別的日誌在結構上是完全相同的,只有用途不同而已。

Redo資料只有在資料庫恢復時才能體現出它的價值。在RAC環境中,每個例項的歸檔Redo日誌可以存放在本地檔案系統,但是恢復的時候需要將所有節點的歸檔Redo日誌放在一起,確保恢復的例項能夠訪問到所有例項的歸檔Redo日誌。

每個例項都對應一個維護日誌的日誌執行緒(Redo thread),單例項只有一個執行緒號為1的日誌執行緒。對於RAC來說,日誌執行緒與例項的關係可以透過以下SQL語句查詢得到。

1)   查詢來自控制檔案的執行緒資訊:

SQL> select thread#,checkpoint_change#,last_redo_change# from gv$thread;

 

   THREAD# CHECKPOINT_CHANGE# LAST_REDO_CHANGE#

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

         1         3.6555E+12        3.6555E+12

         2         3.6555E+12        3.6555E+12

         1         3.6555E+12        3.6555E+12

         2         3.6555E+12        3.6555E+12

 

SQL>

2)   查詢執行緒與例項之間的關係:

SQL> select thread#,instance_name from gv$instance;

 

   THREAD# INSTANCE_NAME

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

         1 PROD1

         2 PROD2

 

SQL>

3)  查詢執行緒與日誌組之間的關係:

SQL> select group#,thread# from v$log;

 

    GROUP#    THREAD#

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

         1          1

         2          1

         3          2

         4          2

 

SQL>

四、UNDO表空間

UNDO表空間存放的是資料塊的前映象,是塊的多版本資料,用於資料庫恢復、一致性讀和事務回滾,對資料庫併發下讀一致性起著重要的作用。

RAC環境中,與連線Redo日誌一樣,每個例項都有自己的UNDO表空間,UNDO表空間必須放在共享儲存上,每個例項都能訪問到所有例項的UNDO表空間,以便任一活動例項都能執行所有例項的恢復操作。每個例項都有自己獨立的UNDO表空間還能減少例項間對UNDO表空間的爭用。

例項對應的Redo日誌組由Redo執行緒來指定,例項對應的UNDO表空間是直接透過初始化引數檔案中的引數指定。下面是引數檔案中指定UNDO表空間對應例項的引數:

Prod01.undo_tablespace = ‘UNDOTBS1’

Prod02.undo_tablespace = ‘UNDOTBS2’

1.       UNDO引數

l   UNDO_MANAGEMENT初始化引數

UNDO_MANAGEMENT指定系統使用的UNDO空間管理模式。設定為AUTO,例項開啟自動化UNDO管理模式;設定為MANUAL表示使用回滾段的手動管理模式自動UNDO管理(AUM)是從Oracle9i開始引入,以代替回滾段,也可以稱為系統管理UNDOSMU)。自動UNDO管理自動分配和管理DML操作所需空間的UNDO表空間,代替分配很多不同大小的回滾段。

l   UNDO_RETENTION初始化引數

UNDO_RETENTION指定的是事務提交之後UNDO資料保留的時間。事務提交之後,UNDO資料不再需要用於回滾或者事務恢復,但一致性讀可能還需要用到這些UNDO資料。

l   UNDO_TABLESPACE初始化引數

每個資料庫可以有多個UNDO表空間,但是對於每個例項只有一個活動的UNDO表空間。在RAC環境中,每個例項都對應一個UNDO表空間,UNDO_TABLESPACE用於指定例項對應的UNDO表空間。UNDO表空間無法進行收縮,如果UNDO表空間過大,只有透過替換的方式縮小UNDO表空間的大小。

l   GUARANTEED UNDO RETENTION特性

預設guaranteed undo retention特性是禁用的,如果啟動這個特性意味著資料庫不能覆蓋已提交但保留時間為超過undo_retention指定時間的UNDO資料。啟用這個特性需要更大的UNDO表空間來支撐,如果UNDO表空間沒有足夠的空間會導致DML操作分配UNDO段失敗。啟用這個特效能夠緩解出現ORA-01555錯誤機率,確保在一定的時間內能夠使用部分Flashback特性閃回資料。執行以下SQL語句啟用UNDO表空間的RETENTION特性:

SQL> alter tablespace undotbs1 retention guarantee;

2.       UNDO檢視

l   V$undostat檢視

V$undostatv$rollstat的代替和提升,包含很多對UNDO空間的監控和統計資訊。這個檢視對於瞭解例項對UNDO空間的使用情況非常有用,能夠透過監控估算出當前負載需要的UNDO表空間大小,能夠根據統計資訊提供建議調整UNDO_RETENTION,還能夠找出長時間執行的SQL語句。在系統中,資料也使用這個檢視提供的資訊調整UNDO表空間的使用。只有自動化UNDO管理模式才能使用該檢視。

l   dba_undo_extents檢視

dba_undo_extents描述了在資料中所有undo表空間包含的區間。這個檢視顯示UNDO中每個區間大小。執行以下SQL語句顯示UNDO表空間中不同區間狀態的統計資訊。

l   v$transaction

l   dba_rollabck_segs檢視


Oracle例項恢復 

例項恢復

Oracle例項在非正常關閉或執行SHUTDOWN ABORT強制關閉後,例項在下次開啟資料庫之前會執行例項恢復過程,這個過程是由Oracle自動完成的。執行例項恢復的目的是確保資料的一致性,只有當聯機Redo日誌檔案和UNDO表空間的介質沒有被破壞才能確保例項恢復能夠成功。

1.        RAC的例項恢復

當軟體、硬體或者人為問題導致例項失敗之後,Oracle資料庫自動使用聯機Redo日誌和UNDO資料執行例項恢復操作。

Crash恢復與例項恢復的區別:

l   一個單例項資料庫或者RAC資料庫所有例項失敗之後,第一個開啟資料庫的例項會自動執行例項恢復。這種形式的例項恢復稱為Crash恢復。

l   一個RAC資料庫的一部分但不是所有例項失敗後,在RAC中倖存的例項自動執行失敗例項的恢復稱為例項恢復。

根據Crash恢復和例項恢復的不同,由倖存例項或者第一個重啟的例項讀取失敗例項生成的聯機Redo日誌和UNDO表空間資料,使用這些資訊確保只有已提交的事務被寫到資料庫中,回滾在失敗時候活動的事務,並釋放事務使用的資源。

2.        例項恢復的階段

在例項發生異常終止的情況下,資料庫處於以下的狀態:

l   事務提交的資料塊只寫入聯機Redo日誌中,沒有更新到資料檔案(那麼未寫入資料檔案的更新必須重新寫入資料檔案)。

l   由於DBWR程式是非同步向磁碟寫入資料的,資料檔案中可能包含沒有被提交但已經寫入資料檔案的改變,這些改變必須回滾到之前的狀態,以確保資料的一致性。

例項恢復利用聯機Redo日誌檔案解決第一個問題,利用UNDO資料同步資料檔案解決第二個問題,從而確保資料庫資料的一致性。

因此,例項恢復過程會經歷兩個階段:

u  例項恢復的第一個階段稱為Cache恢復或者前滾,確保聯機Redo日誌中所有已提交的事務操作的資料寫回到資料檔案中。如果正在執行的檢查點還未完全執行完畢時發生例項失敗,前滾過程可能需要透過多個聯機Redo日誌檔案才能使資料恢復到之前時間的狀態。前滾之後,資料中就包含了連線Redo日誌檔案中所有已提交的資料。在失敗之前,資料檔案中可能也包含未提交的改變,或者是記錄在聯機Redo日誌中但未提交的資料,在前滾的時候被寫到硬碟中。

u  例項恢復的第二個階段稱為回滾或者事務恢復,Oracle資料庫應用UNDO塊回滾在資料塊中未提交的改變,這些資料塊是在失敗之前或者Cache恢復期間被寫入的。回滾完成之後,整個例項恢復才算完成,而Redo和UNDO的丟失或者損壞都可能導致例項恢復失敗。Oracle資料庫能同時回滾多個事務。所有在失敗的時候是活動的事務都被打上了終止的標記,等待SMON程式回滾終止的事務。

            資料庫由SMON後臺程式自動應用聯機Redo日誌檔案中的條目和讀取UNDO表空間中的資料完成例項恢復。



 
Oracle介質恢復

介質恢復是基於物理備份恢復資料,介質恢復技術是Oracle資料庫出現介質故障時恢復的重要保障。

1.        介質恢復的過程

介質恢復包括塊恢復、資料檔案恢復、表空間恢復和整個資料庫的恢復。介質恢復主要是針對錯誤型別中的介質失敗,如果是少量的塊失敗,可以使用介質恢復中的塊恢復來快速修復;但如果是其它情況的丟失,根據具體情況,可使用資料檔案恢復、表空間恢復甚至全庫恢復。

介質恢復過程包括還原(RESTORE)和恢復(RECOVER)兩個步驟:

還原是將某個時間點資料檔案的複製再複製回去,還原後的資料庫處於不一致性的狀態,或不是最新的狀態,還需要執行恢復操作。恢復就是使用歸檔Redo日誌檔案和聯機Redo日誌檔案將不一致的資料庫應用到一致性狀態。如果是完全恢復,資料庫就是最新的一致性狀態;如果是不完全恢復,資料庫是非最新的一致性狀態。

注意:還原只是建立在資料庫備份的基礎版本上,例如,如果資料庫備份包括0級備份和很多1級備份,還原只是應用0級備份,恢復過程會根據情況自動應用1級備份或Redo日誌將資料庫恢復到一致性的狀態。 |

資料庫的恢復過程又分為完全恢復和不完全恢復:

u  完全恢復

完全恢復是一種沒有資料庫丟失的恢復方式,能夠恢復到最新的聯機Redo日誌中已提交的資料。在傳統恢復方式中,因介質失敗破壞了資料檔案之後,可以在資料庫、表空間和資料檔案上執行完全介質恢復。

u  不完全恢復

不完全恢復是一種與完全恢復相反的恢復方式,是一種丟失資料的恢復方式,也稱為資料庫時間點恢復。通常情況下,若Flashback Database沒有啟用或者變得無效,可以執行不完全恢復撤銷一個使用者錯誤,不完全恢復不一定在原有的資料庫環境執行,可以在測試環境下執行不完全恢復,將找回的資料再重新匯入生產庫中。對於不完全恢復來說,只能執行整個資料庫的恢復,不能執行某個資料檔案或表空間的不完全恢復。

不完全恢復根據備份情況恢復到與指定時間、日誌序列號和SCN具有一致性的資料,之後的資料都將丟失。執行不完全恢復一方面是因為歸檔Redo日誌、聯機Redo日誌的丟失不得不執行不完全恢復,另一方面可能是因為在某個時刻錯誤地操作了資料,過了一段時間之後才發現問題,而其它的恢復手段都無法恢復資料,這時也不得不使用不完全恢復來找回資料。

執行不完全恢復必須從備份中還原所有的資料檔案,備份檔案必須是要恢復的時間點之前建立的。當恢復完成,使用RESTLOGS選項開啟資料庫,將重新初始化聯機Redo日誌,建立一個新的日誌序列號流,日誌序列號從1開始,RESETLOGS之後的SCN還是在遞增。

2.        物理壞塊和邏輯壞塊

Oracle資料檔案的壞塊可以分為物理壞塊和邏輯壞塊。物理壞塊指的是塊格式本身已經損壞,塊內的資料沒有任何意義。而邏輯壞塊,指的是塊內的資料在邏輯上存在問題,比如說索引塊的索引值沒有按從小到大排列導致的邏輯壞塊。物理壞塊一般是由於記憶體問題、OS問題、I/O子系統問題或硬體引起的,邏輯壞塊一般是有Oracle bug等原因引起的。

各種各樣的塊損壞通常是透過OracleORA-1578錯誤報告出來的,詳細的損壞描述會在告警日誌中列印出來。

l   物理塊損壞

塊的物理損壞有很多種情況,例如塊頭(Cache Header)被一個不正確的值替換、塊被破壞或變得不完整、塊的頭和尾不匹配、塊的校驗和(CHECKSUM)不正確、塊錯位、塊被歸零。

n   破裂塊

一個破裂塊的意思即塊是不完整的,塊頭的資訊不能匹配塊尾的資訊。在告警日誌中可能出現如下的日誌資訊:

Corrupt block relative dba:0x0380e573(file 14,block 58739)

Fractured block found during buffer read

……

n   不正確的校驗和

塊的校驗和也是資料塊的一致性檢查的依據。塊的一致性檢查由DB_BLOCK_CHECKSUMDB_BLOCK_CHECKING兩個初始化引數控制。DB_BLOCK_CHECKSUM是一種物理檢查,DB_CHECK_CHECKING是一種邏輯檢查。

 

引數1 DB_CHECK_CHECKSUM

DB_BLOCK_CHECKSUM只有在寫入(DBWn常規寫或使用者程式直接路徑寫入)時,根據一個CHECKSUM演算法計算資料塊的校驗和,然後寫入資料塊的一個特定位置(CACHE HEADER,具體是以0位元組算起,塊的第16~17位元組),在讀取塊時再進行檢驗。主要是防止I/O硬體和I/O子系統的錯誤。

CHECKSUM的演算法只是根據塊的位元組值計算一個校驗和,演算法比較簡單。該引數預設在所有表空間上都起作用。

DB_BLOCK_CHECKSUM引數屬性

屬性

描述

語法

DB_BLOCK_CHECKSUM={OFF|FALSE|TYPICAL|TURE|FULL}

預設值

TYPICAL

修改範圍

ALTER SESSION,ALTER SYSTEM

只有當引數值是TYPICAL或者FULL,並且塊的最後一次寫是儲存了一個校驗和時,讀取這個塊,校驗和才會被驗證。在FULL模式,Oracleupdate/delete語句改變資料之前會驗證校驗和,改變被應用之後還會重新計算校驗和。

Oracle Database 11g開始,大多數日誌校驗和都是透過前臺程式產生的,同時LGWR執行其餘的工作,這是為了更好地發揮CPU和快取的效率。當這個引數設定為FULL,寫日誌塊到磁碟之前,LGWR驗證透過前臺程式生成的每個日誌塊的校驗和。在Oracle Database 11g之前的版本中,LGWR獨自執行日誌塊校驗和。資料檔案塊的校驗和是由DBWR程式負責計算和管理的。

這個引數設定為OFF時,DBWn只為SYSTEM表空間計算校驗和,不為使用者表空間計算校驗和。另外,此時資料庫也不會執行日誌的校驗工作。

校驗和可以使Oracle資料庫察覺到磁碟、儲存系統或者I/O系統引起的損壞。如果設定為FULL,DB_BLOCK_CHECKSUM也會捕捉在記憶體中的損壞,並停止它們對磁碟的操作。設定這個引數為TYPICAL值只會引起系統額外的1%~2%的負載,設定為FULL會引起4%~5%的負載。Oracle推薦設定DB_BLOCK_CHECKSUMTYPICAL。為了保持向後相容性,TRUEFALSE值被保留,TRUE等同於TYPICALFALSE等同於OFF

如果DB_BLOCK_CHECKSUM不等於FALSE值,每次讀取塊,Oracle計算校驗和,都與儲存在塊頭中的校驗和進行對比。如下例子:

Corrupt block relative dba: 0x0380a58f (file 14,block 42383)

Bad check value found during buffer read

……

引數DB_BLOCK_CHECKING

DB_BLOCK_CHECKING引數主要是用於資料塊的邏輯一致檢查,但只是在塊內,不包括塊間的邏輯檢查。主要用於防止在記憶體中損壞或資料損壞。

無論該引數如何設定,對SYSTEM表空間來說,邏輯一致檢查始終處於“開啟”狀態,在其他表空間該引數預設是關閉的。

DB_BLOCK_CHECKING引數的屬性

引數值

含義

OFF或者FALSE

對於使用者表空間沒有任何邏輯一致性檢查工作

LOW

塊的內容在記憶體中改變之後,執行基本的塊頭檢查,如UPDATE語句、INSERT語句、磁碟讀或者在RAC中內部例項之間的塊傳遞之後發生檢查工作

MEDIUM

除了索引以外的所有物件執行LOW檢查和完全語義檢查,由於索引能在遭遇損壞的情況下的重建,所以可以不考慮對它檢查

FULL或者TRUE

所有物件執行MEDIUM檢查和完全語義檢查

Oracle透過遍歷在塊中的資料來檢查一個塊,確保它在邏輯上手尾一致。根據系統負載和引數值,塊檢查通常一起1%~10%的負載。開啟塊檢查,大量的UPDATE或者INSERT將造成更大負載,對於一個繁忙的系統,特別有大量插入或者更新操作的系統來說,效能影響是比較明顯的。如果效能負載可以被接受,應該考慮設定DB_BLOCK_CHECKINGFULL。為了保持向後的相容性,TUREFALSE引數值同樣可以使用,FALSE等同於OFFTRUE等同於FULL

如果啟用DB_BLOCK_CHECKING引數,在磁碟的塊發生邏輯損壞,下一次塊更新將作為軟損壞標記這個塊,之後讀取這個塊產生ORA-1578的錯誤。

n   塊錯位

Oracle察覺讀取塊的內容屬於不同塊但是校驗和又是正確的時,會產生錯誤。

l   邏輯塊損壞

若塊包含一個正確的校驗和,塊頭以下的結構是損壞的(塊內容損壞),這可能引起不同的ORA-600錯誤。邏輯塊損壞的詳細損壞描述通常不會列印到告警日誌。DBV將報告塊具體的邏輯錯誤。

3.        壞塊的檢測工具

以下為損壞塊的檢測工具和使用方法:

l   DBVERIRY壞塊驗證工具

DBVERIRY不能驗證聯機Redo日誌、歸檔Redo日誌、控制檔案和RMAN備份集,只能用於資料檔案的塊驗證。

n   DBV驗證傳統資料檔案

下面是使用DBV工具驗證資料檔案塊的例子:

$ dbv file=/testdb/test01.dbf blocksize=8192

注意:DBV工具除了用於檢測資料檔案是否有壞塊外,也用於獲得壞塊的詳細資訊。

n   DBV驗證裸裝置資料檔案

DBV要求file後面跟的必須是一個包含副檔名的檔案,所以如果資料庫使用裸裝置作為儲存方式,就必須使用ln命令連線裸裝置一個帶副檔名的檔案,然後使用DBV工具透過對連結檔案的驗證實現對裸裝置資料檔案的驗證。

n   DBV驗證ASM儲存的資料檔案

如果是驗證儲存在ASM中的資料檔案則需要指定使用者名稱和密碼,如果不指定使用者名稱和密碼,將收到DBV-00008USERID must bu specified for OSM files的報錯。下面是使用DBV工具驗證儲存在ASM中的資料檔案的塊的例子:

$ dbv file=+DATAFILE/testdb/datafile/test.234.648839 userid=sys/oracle

l   ANALYZE命令

Analyze命令的主要目的是透過分析資料庫物件,為最佳化器收集資料庫物件的統計量資訊,以便最佳化器生成準確的執行計劃。同時,它也能檢查某個表或索引是否存在損壞的情況。Analyze執行壞塊檢查,但是不會標記壞塊為corrupt,檢測結果儲存在USER_DUMP_DEST目錄下的使用者trace檔案中。Analyze語法:

Analyze table/index / validate structure ;

Analyze命令會驗證每個資料塊、每條記錄和索引的完整性。CASCADE關鍵字表示驗證表及其相關的所有索引。與DBVERIFY不同的是,analyze只驗證高水位線以下的資料塊,analyze不會對未使用的空間進行驗證。

SQL> analyze table fengpin.test validate structure;

l   RMAN工具

RMAN是一塊備份工具,就像一個過濾器,RMAN需要透過快取過濾每一個塊,其中一個特點就是檢查塊是否被損壞。如果備份的資料庫中包含有壞塊,將會收到錯誤

l   EXP工具

對於包含壞塊的表執行匯出操作,會收到相關的錯誤資訊。對於這種情況,在非歸檔模式無法透過塊恢復修復塊的情況下,有如下兩種處理方法:

方法1:啟用10231事件

透過設定10231診斷事件可以在匯出的時候讓Oracle忽略表損壞的塊,10231Oracle的內部診斷事件,設定在全表掃描時跳過壞塊的資料塊,只匯出包含正確塊的資料,之後把表刪除,再把匯出的表資料匯入新表,從而修復該表。

1)   啟用10231診斷事件

SQL> alter system set events=’10231 trace name context forever,level 10’;

2)   禁用10231診斷事件:

SQL> alter system set events=’10231 trace name context forever,level 0’;

方法2:使用DBMS_REPAIR包標記損壞的塊。

可以使用DBMS_REPAIR包標記損壞的資料庫物件,這樣在對損壞的物件執行全表掃描的時候會跳過損壞的塊。語法如下:

SQL> exec dbms_repair.skip_corrupt_blocks(‘’,’tablename’);

EXP壞塊檢查有一定的侷限性,不會發現如下型別的壞塊:

ü   HWM(高水位線)以上的壞塊

ü   索引中存在的壞塊

ü   資料字典中存在的壞塊

l   Expdp工具

使用expdp工具不會給出壞塊的提示,只會將物件正確的資料匯出。

4.        塊的損壞與恢復

塊已經不是Oracle的格式,或者其內部是不一致的,那麼這個塊就被認為已損壞。塊介質恢復是當資料檔案是聯機時,還原和恢復資料塊的技術。如果只有一些塊被破壞,那麼塊介質恢復是較好的恢復選擇。

BBED(Block Brower and EDitor)是Oracle的一款內部工具,可以用來直接檢視和修改Oracle資料檔案塊的內容。BBED是一個針對Oracle的二進位制編譯工具。該工具不受Oracle支援,預設是不生成可執行檔案的,在使用錢需要重新編譯。

1)   編譯BBED

直接在Oracle 11gR2 的環境中編譯BBED,將收到以下錯誤資訊:

$ cd $ORACLE_HOME/rdbms/lib

$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

……

gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/ssbbded.o: No such file or directory

gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/sbbdpt.o: No such file or directory

Oracle 11gR2 環境中編譯BBED可執行檔案所需要的ssbbded.o和sbbdpt.o物件檔案被移除,不過可以從Oracle 10g環境中將這兩個檔案複製到Oracle 11g環境中進行編譯。

除了將上面的ssbbded.o和sbbdpt.o檔案複製到Oracle 11g環境外,BBED還需要用到$ORACLE_HOME/rdbms/mesg目錄下的bbedus.msg和bbedus.msb兩個資訊檔案,這幾個檔案都需要從Oracle 10g中複製到Oracle 11g中對應的目錄中。下面是將以上4個檔案從Oracle 10g中複製到Oracle 11g對應目錄之後的編譯過程:

            $ cd $ORACLE_HOME/rdbms/lib

            $ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

            $ file bbed

            $ size bbed

            $ ldd bbed

            $ cp bbed $ORACLE_HOME/bin/

            $ cd /

            $ which bbed

             /u01/app/oracle/product/11.2.0/db_1/bin/bbed

            編譯成功後登入BBED,登入時需要密碼(預設密碼是:blockedit)

            $ bbed

2)   BBED模擬表資料塊的損壞

a.        建立測試表

SQL> create table test.testbbed as select * from dba_tables;

b.        建立BBED引數檔案

由於BBED無法對ASM進行操作,所以這裡將表建立到ACFS檔案系統的儲存裝置上。這裡建立兩個BBED引數檔案,filelist.txt儲存要操作的資料檔案的ID和路徑,bbed.par儲存資料檔案的塊大小、filelist.txt的位置和操作模式:

$ more filelist.txt

6 /testbbed/tbtbs01.dbf

$ more bbed.par

blocksize=8192

listfile=filelist.txt

mode=edit

filelist.txt的內容可透過select file_id,file_name from dba_data_filesSQL查詢得到。

c.        BBED基本操作

ü   使用指定的引數檔案登入BBED:

$ bbed parfile=bbed.par

ü  顯示BBED配置檔案中指定的資料檔案資訊:

BBED> info

ü  設定要操作的資料檔案:

BBED> set file 6

ü  顯示要操作的資料檔案的詳細資訊:

BBED> show

d.        模擬壞塊

修改檔案號為6的第136號塊:

BBED> modify 1000 file 6 block 136

如果修改錯誤,可以執行revert命令回滾。

e.        驗證壞塊

在BBED執行以下命令驗證資料塊,發現block 136已經損壞

BBED> verify

f.         使用DBV工具驗證

使用DBV工具驗證發現file 6 block 136已經損壞

$ dbv file=/testbbed/tbtbs01.dbf blocksize=8192

g.        執行塊讀取操作

執行一個test.testbbed的全表掃描,收到ORA-01578錯誤

SQL> alter system flush buffer_cache;

SQL> select /*+FULL(T)*/ COUNT(1) FROM TEST.TESTBBED T;

3)   RMAN的塊恢復

塊介質恢復用來恢復一個單獨的塊或者資料檔案中資料塊的集合,如果是小資料量的資料丟失或損壞,而不是整個資料檔案,這種型別的恢復是很有用的。通常,塊損壞會在跟蹤檔案中報告錯誤資訊。

塊級別的資料丟失通常是由以下兩個原因造成的:

n   I/O錯誤引起的映象資料丟失。

n   記憶體損壞,重新整理到磁碟。

a.        使用RMAN BLOCKRECOVER命令的注意事項

n   目標資料庫必須在MOUNT或者OPEN狀態,如果執行某個資料檔案的塊介質恢復,那麼該資料檔案不能是離線狀態。

n   塊介質恢復不支援基於時間點的塊恢復。

n   只能在損壞的塊上執行塊介質恢復。

n   塊被標記為介質損壞之後是不能訪問的,直達恢復完成。

n   當使用備份的控制檔案載入資料庫時,不能執行塊的介質恢復。

n   必須有一個包含損壞塊檔案的全備份,塊介質恢復不能使用增量備份。

n   如果RMAN訪問塊介質恢復需要特定歸檔Redo日誌檔案失敗,那麼將執行還原FAILOVER,嘗試使用RMAN資料庫中列出的適合這個操作的所有其它備份,如果沒有合適的備份存在執行才會失敗。

n   資料檔案頭不能被恢復

n   不能在非歸檔模式下執行塊介質恢復。

b.        RMAN BLOCKRECOVER命令的使用方式

RMAN BLOCKRECOVER命令有以下三種使用方式:

方式1 使用BLOCKRECOVER CORRUPTION LIST命令恢復在V$DATABASE_BLOCK_CORRUPTION檢視中報告的所有塊:

RMAN> blockrecover corruption list;

方式2 使用BLOCKRECOVER 命令的時候指定檔案號和塊號:

RMAN> blockrecover datafile block ;

方式3 執行blockrecover命令的時候指定表空間和資料塊地址(DBA):

RMAN> blockrecover tablespace DBA ;

c.        RMAN BLOCKRECOVER使用的例子

例子1 恢復3個資料檔案的損壞塊:

RMAN> BLOCKRECOVER DATAFILE 2 BLOCK 12,13 DATAFILE 3 BLOCK 5,98,99 DATAFILE 4 BLOCK 19;

例子2:從資料檔案複製中還原、恢復一系列塊:

RMAN> RUN

{

BLOCKRECOVER DATAFILE 3 BLOCK 2,3,4,5 TABLESPACE sales DBA 4194405,4194409,4194412 from DATAFILECOPY;

}

例子3:從指定的tag備份總還原、恢復塊

RMAN> BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404,4194405 FROM TAG “weekly_backup”;

例子4:從用於恢復資料到兩天以前的備份中還原、恢復SYSTEM表空間中的兩個塊:

RMAN> BLOCKRECOVER TALBESPACE SYSTEM DBA 4194404,4194405 RESOTRE UNTILL TIME ‘sysdate-2’;

例子5:執行備份驗證資料庫,修復在V$DATABASE_BLOCK_CORRUPTION中記錄的所有損壞塊:

RMAN> BACKUP VALIDATE DATABASE;

RMAN> BLOCKRECOVER CORRUPTION LIST;

4)   確定損壞塊對應的物件

要確定一個損壞的物件需要知道AFN(Absolute File Numbe,絕對檔案號)和BL(Block Number,塊號)。AFN和RFN(Relative File Number,相對檔案號)通常是相同的,但是也可能不同(特別是如果資料庫從Oracle7遷移或者如果使用的是可傳輸、可插拔的表空間),獲得正確的AFN和RFN就顯得非常重要,如果指定了錯誤的AFN將導致找不到物件或錯誤識別物件。

a.        確定AFN和BL

方法1:從ORA-1578得到AFN

ORA-1578之後產生的ORA-1110錯誤提供AFN號碼。

方法2:從DBVERIFY輸出獲得AFN。

透過使用DBV工具會報告損壞的塊,DBV工具透過提供與相關的RDBA、RFN和BL資訊。

方法3:從RMAN獲得AFN

RMAN在V$DATABASE_BLOCK_CORRUPTION檢視報告損壞的塊。該檢視的欄位FILE#表示AFN,欄位BLOCK#表示BL。

b.        定位損壞的物件

一旦AFN被識別,執行以下SQL語句定位損壞的物件:

SQL> select *

From DBA_EXTENTS

Where file_id=&AFN

And &BL BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS-1;

5.資料庫完全恢復

如果損壞的塊是資料檔案開頭,這將導致資料庫無法正常啟動和關閉,並且使用RMAN BLOCKRECOVER也不能恢復。因此此時就要進行完全恢復或者嘗試使用BBED修改塊頭。

1)   模擬損壞資料檔案頭的塊

使用BBED方法將資料檔案6的第1個塊損壞,DBV的檢查結果如下:

$ dbv file=/test/test01.dbf

2)   嘗試使用RMAN BLOCKRECOVER進行恢復

執行以下命令使用RMAN的BLOCKRECOVER對資料檔案6的第1個塊進行恢復:

RMAN> blockrecover datafile 6 block 1;

Starting recover as 2013-12-07 16:24

Using channel ORA_DISK_1

 

Starting media recovery

Media recovery complete,elapsed time: 00:00:00

 

Finished recover at 2013-12-07 16:24

恢復顯示是完成的,也沒有報錯。但是執行DBV驗證命令發現標記的壞塊還是兩個,及沒有真正修復。說明使用RMAN BLOCKRECOVER對資料檔案頭的修復是沒有作用的。

嘗試正常關閉資料庫,由於資料庫無法完成檢查點工作,所以正常關閉操作失敗:

SQL> shutdown immediate

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/test/test01.dbf’

ORA-01210: data file header is media corrupt

強制關閉資料庫:

SQL> shutdown abort

重啟資料庫,發現資料庫無法開啟資料檔案:

SQL> startup

……

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/test/test01.dbf’

ORA-01210: data file header is media corrupt

3)   執行資料檔案的完全恢復

執行以下命令還原、恢復6號資料檔案:

RMAN> restore datafile 6;

RMAN> recover datafile 6;

嘗試開啟資料庫:

SQL> alter database open;

Database altered.

Oracle資料庫中有各種各樣的塊,如空塊、表頭塊、資料塊、索引塊、資料檔案頭塊、UNDO段塊等。如果損壞的是普通表的資料塊,那即不會影響啟動資料庫,也不會影響其他表的正常訪問,只是在訪問該表的時候會出現問題。如果損壞的是資料檔案的塊頭,那麼將導致資料庫無法正常啟動和停止,執行塊恢復不能修復這個問題,執行資料檔案的完全恢復才能恢復資料檔案塊頭的損壞或嘗試使用BBED修改資料檔案塊頭。

6.資料庫不完全恢復

不完全恢復又稱為資料庫基於時間點恢復,是將整個資料庫恢復到之前的某個時間點、日誌序列號或者SCN號。如下不完全恢復的選項:

不完全恢復的選項

不完全恢復方式

RMAN選項

使用者管理備份選項

恢復到某個時間點

until time

until time

恢復到某個日誌序列號

until suquence

until cancel

恢復到某個SCN

until SCN

until change

不完全恢復只能針對整個資料庫而言,並不能執行資料檔案和表空間的不完全恢復;另外,對於非歸檔模式的恢復來說,也不能執行不完全恢復。

1)   基於時間點的不完全恢復

RMAN> run {

shutdown immediate;

startup mount;

SQL “alter session set nls_date_format=’’YYYY-MM-DD HH24:MI:SS’’”;(兩個單引號之間沒有空格)

set until time ‘2013-12-07 17:24:00’;

restore database;

recover database;

alter database open resetlogs;}

SET UNTIL TIME時間可以使用多種表示方式,可以使用TO_DATE函式來表示時間,還可以使用SYSDATE-1方式來表示時間。

注意:不完全恢復是針對整個資料而言,如果在上面的指令碼中,還原和恢復的是某個資料檔案或表空間,那麼指令碼將忽略set until time設定,對資料檔案或表空間進行完全恢復。對RESTORE命令指定until time或者until scn的意義在於這樣可以自動選擇最近的RMAN備份來恢復資料,以上的批次命令相當於為RESTORE和RECOVER都指定了until time子句,這樣比單命令模式更加簡單和合理。基於時間點的恢復不能恢復到最終備份完成時間點以前的時段。

2)   基於序列號的不完全恢復

基於序列號的不完全恢復須指定某個Redo執行緒的序列號,那麼在這個序列號切換時間點之前的所有例項的歸檔日誌都需要的,每個節點的負載不同,其他例項的序列號可能比指定的Redo執行緒序列號要大。

以下是在RMAN中基於日誌序列號的不完全恢復的例子:

RMAN> run {

Shutdown immediate;

Startup mount;

Set until sequence 10350 thread 1;

Restore database;

Recover database;

Alter database open resetlogs;}

注意:指定執行緒序列號為10350,但是恢復是不包含該序列號的日誌的,也就是說恢復只會恢復到thread 1 sequence 10304的日誌,時間點和scn恢復同樣如此。

3)   基於SCN的不完全恢復

下面是在RMAN中基於SCN的不完全恢復的例子:

RMAN> run {

shutdown immediate;

startup mount;

set until scn 324394;

restore database;

recover database;

alter database open resetlogs;}

注意:對開啟的資料庫執行的全庫備份或者0級備份,即使不完全恢復到執行全庫備份或者0級備份的備份時間點也可能需要部分Redo日誌,原因在於對開啟的資料庫執行RMAN備份是一個不一致的備份。

7.表空間時間點恢復

表空間時間點恢復(Tablespace Point-in-time Recovery,TSPITR)特性可以恢復一個或更多的表空間早於資料庫其他部分的某個時間點。表空間時間點恢復是表空間的不完全恢復,操作起來比較複雜。

表空間時間點恢復能在不影響資料庫其它表空間和物件的情況下,恢復一個或更多的使用者表空間到之前的某個時間點。表空間時間點恢復是對某個表空間執行基於某個時間點的恢復,是特殊的不完全恢復。RMAN TSPITR可以用於以下場景:

n   一個不正確的job或者DML語句破壞了資料庫其中一個表空間的資料,RMAN TSPITR可用於被破壞表空間的恢復。

n   DDL操作改變了表的結構之後,RMAN TSPITR可用於丟失資料的恢復。這種情況不能使用Flashback Table找回表之前的結構的資料,如表結構變化後的一個TRUNCATE表操作。

n   一個表被一個drop語句加了purge選項徹底drop。RMAN TSPITR可用於這種情況的恢復。

n   恢復drop的表空間,當沒有使用恢復目錄,RMAN能對被drop的表空間執行TSPITR。

n   從一個表的邏輯損壞中恢復。

表空間時間點恢復和Flashback有點類似,在沒有介質失敗的情況下,資料也可以使用Flashback Database找回,但是Flashback Database會導致整個資料庫被閃回到之前的某個時間點。與TSPITR不同的是,Flashback Database特性必須產生Flashback日誌,使用Flashback Database閃回資料庫比使用TSPITR有更多的限制,TSPITR可以擴充套件到能找回可用於恢復的更早備份資料。

1)   TSPITR的工作原理

TSPITR工作原理的5個步驟:

步驟1 在輔助例項上用目標資料庫的備份集還原資料檔案。

步驟2 在輔助例項上用目標資料庫的歸檔檔案恢復資料檔案。

步驟3 在輔助資料庫上匯出相關資料。

步驟4 修改主庫的控制檔案。

步驟5 將輔助資料上匯出的檔案匯入目標資料庫。

2)   RMAN TSPITR模式

表空間時間點恢復使用的是RMAN的RECOVER tablespace命令,執行RMAN TSPITR有幾個選項,不同的選項協調各種不同的操作模式之間對特定環境的自動化操作。

a.        全自動化(預設方式)

在這種模式下,RMAN管理整個TSPITR過程。制定表空間的恢復集、輔助目的地、目標時間和允許RMAN管理所有TSPITR的其它方面。

b.        自動化

可以覆蓋一些預設RMAN TSPITR設定,但仍然使用RMAN管理輔助例項和輔助目的地。這是預設方式的變種,RMAN TSPITR提供一些固定管理的同事允許手動指定一些引數,主要包含以下兩個引數:

n   輔助集或恢復集檔案的位置

n   初始化引數檔案

除了在TSPITR之後的恢復集檔案位置,在TSPITR期間的輔助集檔案、通道設定和引數或輔助例項的其它方面等更多控制都推薦使用預設方式。全自動和自動化都是使用RMAN自動管理輔助例項。

c.        非自動化

使用這種模式是手動建立和管理輔助例項的所有方面和一部分TSPITR過程。當必須分配不同的通道或者使用使用者管理輔助例項改變引數時,使用這種模式是合適的。

3)   執行全自動化的TSPITR

下面以預設的全自動化模式在目標資料庫伺服器建立輔助資料庫構建TSPITR,恢復在目標資料庫對錶的一個誤操作。目標資料庫與輔助資料庫都在一臺伺服器上,下表是兩個資料庫的例項名和資料庫名稱對照表:

資料庫型別

例項名稱

資料庫名稱

目標資料庫

test

test

輔助資料庫

test2

test

a.        建立模擬環境

步驟1 在目標資料建立測試表空間xy_tbs:

SQL> create tablespace xy_tbs datafile ‘/u01/app/oracle/test/xy_tbs01.dbf’ size 5M;

步驟2 確保目標資料庫處在歸檔模式,使用RMAN查詢出xy_tbs表空間的file_id,對它進行備份:

RMAN> report schema;

……

RMAN> backup datafile 5;

步驟3 建立測試使用者xiaoyang:

SQL> create user xiaoyang identified by xiaoyang default tablespace xy_tbs tempory tablespace temp;

SQL> grant create session,create table,unlimited tablespace to xiaoyang;

SQL> connect xiaoyang/xiaoyang;

步驟4 建立兩個測試表:x1和x2,每個表插入一條測試資料:

SQL> create table x1(D date);

SQL> create table x2(D2 date);

SQL> insert into x1 values(sysdate);

SQL> insert into x2 values(sysdate);

SQL> commit;

步驟5 檢視當前時間作為表空間的恢復時間點:

SQL> alter session set nls_date_format=’YYYY-MM-DD HH24:MI:SS’;

SQL> select sysdate from dual;

步驟6 在恢復時間點之後向x2表中插入一條資料和建立一個新表x3,向x3插入一條測試資料:

SQL> insert into x2 values(sysdate);

SQL> create table x3(D3 date);

SQL> insert into x3 values(sysdate);

SQL> commit;

步驟7 手動drop掉表x1:

SQL> drop table x1 purge;

假設drop x1表是一個誤操作,現在要透過TSPITR恢復技術恢復該表。

b.        檢查表空間是否自關聯

執行以下SQL語句檢查表空間自關聯情況:

SQL> execute dbms_tts.transport_set_check(‘xy_tbs’,true,true);

SQL> select * from transport_set_violations;

如果查詢transport_set_violations檢視有值返回,說明表空間有自關聯,需要手動處理提示的問題。

c.        標識TSPITR之後將會丟失的物件

步驟1 透過時間標識TSPITR之後將會丟失的物件:

SQL> select owner,name,tablespace_name,to_char(creation_time,’YYYY-MM-DD HH24:MI:SS’) from ts_pitr_objects_to_be_dropped where tablespace_name in(‘xy_tbs’) and creation_time > to_date(‘2013-12-08 09:43:00’,’YYYY-MM-DD HH24:MI:SS’) order by tablespace_name,creation_time;

步驟2 透過SCN標識TSPITR之後將會丟失的物件:

SQL> select owner,names,tablespace_name,to_char(creation_time,’YYYY-MM-DD HH24:MI:SS’) from ts_pitr_objects_to_be_dropped where tablespace_name in(‘xy_tbs’) and creation_time > to_date(to_char(scn_to_timestamp(1638492),’YYYY-MM-DD HH24:MI:SS’),’YYYY-MM-DD HH24:MI:SS’) order by tablespace_name,creation_time;

如果以上兩個查詢有結果返回,那麼在執行TSPITR之前應該先將這些物件進行邏輯備份,TSPITR完成之後,再將這些物件以替換的方式匯入,以恢復產生資料丟失的物件。

d.        建立輔助資料庫引數檔案

轉儲目標資料庫引數檔案,將該引數檔案複製到$ORACLE_HOME目錄,重新命名為inittest2.ora,參考如下引數檔案內容調整inittest2.ora例項的初始化引數檔案:

*.audit_file_dest=’/u01/app/oracle/admin/test2/adump’

*.control_files=’/u01/app/oracle/oradata/test2/control01.ctl’

……

db_file_name_convert=(“/u01/app/oracle/oradata/test”,”/u01/app/oracle/oradata/test2”)

log_file_name_convert=(“/u01/app/oracle/oradata/test”,”/u01/app/oracle/oradata/test2”)

log_archive_start=false

lock_name_space=test2

修改test2例項初始化引數檔案中的audit_file_dest、control_file引數,確保與原有資料庫的儲存位置不同。新增db_file_name_convert、log_file_name_convert、log_archive_start和lock_name_space引數設定。

e.        建立目錄結構

根據例項test2引數的設定建立相應的目錄結構:

$ mkdir –p /u01/app/oracle/admin/test2/adump

$ mkdir –p /u01/app/oracle/oradata/test2

f.         建立test2例項密碼檔案

$ cd $ORACLE_HOME/dbs/

$ orapwd file=orapwtest2 password=oracle entries=5

g.        建立輔助資料庫例項的靜態註冊

在grid使用者下的$GRID_HOME/network/admin/listener.ora檔案中修改如下配置:

$ cat listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = test2)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = test2)

   )

)

h.        新增Oracle Net本地服務名

在Oracle使用者下的$ORACLE_HOME/network/admin/tnsnames.ora檔案中新增如下配置:

TEST2 =

  (DESCRIPTION =

(ADDRESS_LIST =

  (ADDRESS = (PROTOCOL = TCP)(HOST = rhel2)(PORT = 1521))

)

(CONNECT_DATA =

  (SERVICE_NAME = test2)

)

                       )

i.         啟動輔助資料庫到NOMOUNT狀態

$ export ORACLE_SID=test2

$ sqlplus / as sysdba

SQL> create spfile from pfile;

SQL> startup nomount

j.         執行TSPITR恢復

使用RMAN同時連線到目標資料庫和輔助資料庫,使用RECOVER TABLESPACE命令執行TSPITR操作:

$ rman target /

RMAN> connect auxiliary sys/oracle@test2

RMAN> run {

allocate auxiliary channel a1 type disk;

allocate channel c1 type disk;

recover tablespace xy_tbs until time “to_date(‘2013-12-08 09:30:00’,’YYYY-MM-DD HH24:MI:SS’)”;

release channel c1;

}

執行TSPITR需要手動分配auxiliary通道

使目標資料中xy_tbs表空間ONLINE:

SQL> alter tablespace xy_tbs online;

k.        驗證恢復結果

SQL> select * from xiaoyang.x1;

SQL> select * from xiaoyang.x2;

SQL> select * from xiaoyang.x3;

資料庫特殊情況的恢復

1. 聯機Redo日誌損壞與恢復

對於正常關閉的資料庫來說,關閉前會執行一個檢查點以保證資料庫的一致性,重啟之後,聯機日誌是是否存在都不會導致資料的丟失。然而,如果是非正常關閉的資料庫,重啟之後會執行例項恢復的過程,如果例項恢復過程需要的UNDO活Redo日誌丟失,那麼就可能造成資料的不一致和資料的丟失。

a.       連線Redo日誌損壞的4種情況

聯機Redo日誌檔案的損壞有以下4中情況:

情況1 非當前日誌損壞,正常關閉資料庫。

情況2 非當前日誌損壞,非正常關閉資料庫。

情況3 當前日誌損壞,正常關閉資料庫。

情況4 當前日誌損壞,非正常關閉資料庫。

b.       處理方法

1)  情況1和情況2的處理方法

情況1和情況2的處理方法一樣,直接把日誌檔案清除即可:

SQL> alter database clear logfile group 3;

2)  情況3的處理方法

在SQLPLUS中執行以下的SQL語句以RESETLOGS模式重新開啟資料庫:

SQL> startup mount;

SQL> recover database until cancel;

SQL> alter database open resetlogs;

3)  情況4的處理方法

這種情況會導致聯機Redo日誌中的一部分已提交的資料丟失,例項恢復中的前滾操作不能成功執行,回滾操作也無法執行,這也會導致部分資料的丟失。處理方法是強制開啟資料庫或透過備份執行介質不完全恢復。

2.       資料檔案離線與恢復

資料庫的離線包括資料檔案的離線和表空間的離線,資料檔案的離線和表空間非正常離線在下一次執行聯機命令之前都無需先執行介質恢復操作,介質恢復成功才能聯機成功。

資料檔案新增到表空間之後不能再被刪除,也沒有語法支援這麼做,如果不想使用該資料檔案,唯一的方法是將資料檔案設定為OFFLINE狀態。執行以下步驟將資料檔案設定為OFFLINE狀態:

1)  如果是歸檔模式可以執行如下SQL語句設定資料檔案的狀態為OFFLINE:

SQL> alter database datafile ‘xxx.dbf’ offline;

2)  如果是非歸檔模式執行以下SQL語句將資料檔案狀態設定為OFFLINE:

SQL> alter database datafile ‘xxx.dbf’ offile drop;

即使資料檔案離線,資料檔案相關的資料字典資訊、後設資料資訊依然存在,當表空間被刪除後,相關資料檔案的資訊才會被清除。Drop tablespace只是清空Oracle資料字典資訊,即使資料檔案不存在也可以正常的drop表空間。對於資料檔案的離線,在設定該資料檔案OFFLINE的時候都需要對該資料檔案執行介質恢復。

如果在非歸檔模式下使用OFFLINE drop使資料檔案離線,這就意味著該資料檔案可能無法再恢復到online狀態,原因在於非歸檔模式下可能沒有足夠的日誌檔案在執行online的時候完成介質恢復。如果資料檔案離線之後日誌沒有發生切換,所有需要的日誌還依然存在的話,那麼非歸檔模式下資料檔案的離線也可以再次變成online狀態。

3.       表空間離線與恢復

表空間離線實際就是表空間對應的所有資料檔案離線。

表空間離線分為正常離線、臨時離線和立即離線,如下:

1)    正常離線

這是預設的選項,如果表空間正常離線,當重新執行online的時候,Oracle會用相應的SCN來更新表空間資料檔案頭SCN即可正常地online表空間,而不需要執行介質恢復。執行以下SQL語句是表空間正常離線:

SQL> alter tablespace xxx offline;

2)    臨時離線

當執行臨時離線(OFFLINE temporary)語句之前已經有表空間對應的資料檔案離線,那麼在是表空間重新online之前需要執行特定資料檔案的介質恢復。執行以下的SQL語句是表空間臨時離線:

SQL> alter tablespace xxx offline temporary;

3)    立即離線

執行這個操作(OFFLINE immediate)表示立即使表空間離線,在下次使表空間online的時候必須執行介質恢復,介質恢復成功之後表空間才能變成online狀態。執行以下的SQL語句是表空間立即離線:

SQL> alter tablespace xxx offline immediate;

...............................................................................................................................
● 本文來自於itpub轉載文章,若有侵權,請聯絡小麥苗及時刪除,非常感謝原創作者fengpinDBA的無私奉獻
● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新
● QQ群:230161599  微信群:私聊
● 原文地址:http://blog.itpub.net/29339097/viewspace-1062090/
● 小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● QQ群: 230161599   微信群:私聊
● 聯絡我請加QQ好友(642808185),註明新增緣由
●【版權所有,文章允許轉載,但須以連結方式註明源地址,否則追究法律責任】
...............................................................................................................................
手機長按下圖識別二維碼或微信客戶端掃描下邊的二維碼來關注小麥苗的微信公眾號:xiaomaimiaolhr,免費學習最實用的資料庫技術。


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

相關文章