最佳化Oracle停機時間及資料庫恢復(轉)

gugu99發表於2007-08-13
最佳化Oracle停機時間及資料庫恢復(轉)[@more@]

  這裡會討論令Oracle停機時間最小化的步驟。各種形式的停機--計劃的或者是非計劃的--總是不斷地發生,一個DBA應該有正確的備份策略,這樣在資料庫出現問題時就可以更快地恢復。

  以下是假定的備份策略和資料庫的運作條件

  控制檔案是映象的

  資料庫執行在archivelog模式

  每個星期都進行冷備份

  每日都進行熱備份

  每日都進行一次全資料庫匯出

  事件1:完整的資料庫重構

  在這種情形下,你可以使用全資料庫匯出或者冷熱備份結合的方式來重構資料庫。要注意的是無論你選擇哪種方式,線上redo log中的事務都會丟失。

  事件2:恢復部分的表空間

  可以使用以下的步驟來恢復:

  1、以restrict模式啟動資料庫

  2、重新建立表空間

  3、使用最新的全資料庫匯出來匯入,並且使用ignore=y的選項;

  4.關閉並且重新以normal的模式啟動資料庫例項

  事件3:丟失一般的資料檔案

  丟失一般資料檔案的恢復步驟根據所丟失的資料檔案包含的表空間型別而定;例如:回滾段,使用者表空間,索引表空間或者是隻讀的表空間、你可能會遇到以下的錯誤:

  . 嘗試啟動資料庫並且碰到錯誤的資訊ORA-1157, ORA-1110,可能還有一個作業系統的錯誤

  . 嘗試以normal或者immediate的模式關閉資料庫,可能會碰到ORA-1116, ORA-1110的錯誤資訊,還有一個系統錯誤

  以下的步驟可以用作恢復:

  1、關閉資料庫

  2、由熱備份中恢復丟失的資料檔案

  3、Startup mount資料庫

  4、執行以下的查詢來得到所有你的線上redo log檔案和它們相應的次序和首次修改號:

  SELECT X.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#FROM V$LOG X, V$LOGILE YWHERE X.GROUP# = Y.GROUP#;

  5、如果得到的CHANGE#比線上redo log最小的FIRST_CHANGE# 還小,那麼該檔案不能被完全恢復,你可以有兩個選擇:

  . 如果可以接受丟失最近一次冷備份以來的資料庫修改,裝入備份並且繼續恢復

  . 如果不能接受丟失資料庫的修改,那麼必須重新建立表空間

  6、透過使用存檔和線上的redo log來恢復資料檔案

  7、開啟資料庫

  事件4:恢復一個特別的表

  可以採用以下的步驟恢復:

  1、使用最近的一次全資料庫匯出來匯入表,並且使用owner=和tables=的選項

  2、考慮到效能的原因,可能需要重建表索引

  事件5:丟失控制檔案

  在資料庫起來並且執行時,通常都不能檢測到控制檔案的問題、如果控制檔案丟失或者損壞了,Oracle將不會了解,下次資料庫的啟動時將會導致ORA-205錯誤(標識控制檔案"%s的錯誤),還有一個系統級的錯誤、

  如果只是丟失了其中的一個控制檔案,可以採用下面的步驟來恢復:

  1、如果它正在執行的話,先關閉它

  2、查詢丟失控制檔案的原因、是由於硬體的問題嗎(磁碟還是控制器)?

  3、如果不是硬體的問題,將控制檔案的一個好的複製複製到丟失的位置,並且跳到步驟5、

  4、如果是硬體的問題,複製一個好的控制檔案複製到一個可靠的位置

  5、編輯initsid.ora 或者 configsid.ora,更新CONTROL_FILES以反映最新的控制檔案位置

  6、啟動資料庫

  事件6:丟失全部的控制檔案

  可以採用以下的步驟恢復:

  1、關閉資料庫

  2、進行一次全資料庫備份,包括全部的資料檔案和redo log檔案

  3、以NOMOUNT的狀態啟動資料庫

  4、使用CREATE CONTROLFILE重新建立控制檔案、你也可以備份控制檔案到一個trace檔案,然後執行該檔案

  5、在資料庫上進行媒體恢復

  6、開啟資料庫

  7、使用shutdown normal關閉資料庫

  8、對資料庫進行一次冷備份

  事件7:丟失一個索引

  最簡單的方法就是重新建立丟失的索引

  事件8:丟失一個非活動的redo log

  如果丟失redo資料,恢復將是不完全的,必須重新建立涉及的表空間。要重新建立表空間,可以使用全的資料庫匯出,這樣就可以很容易的匯入資料並且重新建立該表空間的物件。可以使用以下的步驟來恢復:

  1、透過Alter system來切換redo log檔案

  2、關閉資料庫

  3、startup mount資料庫

  4、離線刪除涉及的資料檔案

  5、開啟資料庫

  6、刪除使用者的表空間,包括其中的內容、

  7、透過全資料庫備份重新建立表空間和其中的物件

  事件9:丟失活動的Redo log

  如事件8討論的一樣,如果丟失了redo資料,恢復將是不完全的,必須重新建立涉及的表空間、可以採用以下的步驟恢復:

  1、關閉資料庫

  2、startup mount資料庫

  3、離線刪除涉及的資料檔案

  4、開啟資料庫

  5、刪除使用者的表空間,包括其中的內容、

  6、透過全資料庫備份重新建立表空間和其中的物件

  要注意的是活動的事務將會丟失

  事件10:丟失存檔的Redo log檔案

  如果存檔的redo log檔案丟失,應該馬上進行一次冷備份、最好也進行一次全資料庫匯出、沒有丟失的存檔redo log檔案的任何恢復都將是不完全的、

  事件11:丟失活動的回滾段

  這裡指的是丟失一個回滾段的一個資料檔案、這是一個危急的恢復過程,它主要是在於儲存活動的事務。這裡假定資料庫已經起來,而你想儲存當前執行的事務。要使用以下的恢復過程,資料庫必須執行在archivelog模式下。

  可以使用以下步驟恢復:

  1、不要關閉資料庫、對於這種事件,資料庫啟動比關閉更容易解決問題、

  2、令屬於該資料檔案中的全部回滾段離線

  3、刪除全部離線的回滾段

  4、在上面的第2步中,如果回滾段中有活動的事務,你將不能令它離線、可執行以下的查詢來檢視哪些事物是活動的:

  SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUSFROM V$ROLLSTAT V, DBA_ROLLBACK_SEGSWHERE TABLESPACE_NAME = 'tablespace_name' ANDSEGMENT_ID = USN;

  如果上面的查詢沒有結果,那麼所有的回滾段都是離線的,但是,如果上面的查詢返回一行或者多行,並且其狀態為PENDING OFFLINE,那麼可檢查這些回滾段的ACTIVE_TX列、帶有0值的回滾段將很快會離線;但是,非0的值表示上面有活動的事務,它們需要被提交或者回滾、

  5、處理活動的事務、執行以下的查詢來檢視哪些使用者的事務被指派到該回滾段:

  SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME RWHERE R.NAME IN ('pending_rollback1','pending_rollback2', .... 'pending_rollbackN') ANDS.TADDR = T.ADDR ANDT.XIDUSN = R.USN;

  在知道哪些使用者在"pending offline"的回滾段上有活動的事務後,可以要求他們提交或者回滾他們的事務,或者可以使用以下的命令殺掉它們的程式:

  ALTER SYSTEM KILL SESSION 'sid, serial#';

  6、在你處理完所有活動的事務後,執行以下的步驟:

  丟棄表空間及其中的全部內容

  重新建立回滾表空間

  重新建立回滾段,並且令它們線上

  事件12:丟失全部的回滾段

  在這種事件下,將丟失全部活動的事務,並且需要重新建立回滾段。這樣大的問題可能是由於一個硬體問題造成的,可以採用以下的步驟恢復:

  1、關閉資料庫

  2、使用DBVERIFY驗證全部的資料檔案

  3、解決其它的硬體問題或者資料檔案損壞

  4、以startup mount的方式啟動資料庫例項

  5、在資料庫上執行媒體恢復

  6、開啟資料庫

  7、按需要建立新的回滾段

  事件13:匯出檔案損壞

  如果匯出檔案不能用了,那麼應該冷備份資料庫並且進行一個全的資料庫匯出、這是假定資料庫自身沒有問題、如果資料庫也損壞了,那麼應該執行以下的步驟:

  1、ORA-1157錯誤資訊通常都表示一個或者多個的資料檔案損壞了。查明哪些表受到影響,它們應該是錯誤資訊中指明的資料檔案中的表格

  2、跳過壞的資料塊,將資料由表格中選擇到臨時表格中、

  3、丟棄損壞的表

  4、將臨時表重新命名為丟棄的表

  5、重新建立受影響表上的全部索引

  6、使用VALIDATE STRUCTURE CASCADE的選項來分析全部損壞的表

  要注意的是損壞塊中資料將會丟失並且不能恢復

  事件14:在熱備份時關機

  如果在熱備份正在進行的時候突然關機,其中的一些表空間將可能處在備份模式、當你嘗試開啟資料庫時,它將只能mount,並且指示某些表空間處於熱備份模式、由於資料庫不能開啟,你將不能讓表空間脫離熱備份模式、你可以使用以下的步驟恢復:

  1、startup mount資料庫

  2、查詢v$backup以檢視哪些資料檔案處於ACTIVE狀態、

  3、透過使用命令ALTER DATABASE DATAFILE END BACKUP.來將這些資料檔案脫離備份模式

  4、開啟資料庫

  事件15:恢復到某個特別的時間點

  以下的步驟可用來執行point-in-time恢復

  1、關閉資料庫例項

  2、以NOMOUNT的狀態啟動資料庫例項

  3、使用UNTIL的選項來恢復資料庫

  4、開啟資料庫

  5、Shutdown NORMAL

  6、啟動資料庫例項

  事件16:恢復到一個特別的事件或者活動

  可以使用以下的步驟來恢復:

  1、關閉資料庫例項

  2、以NOMOUNT狀態啟動資料庫例項;

  3、使用UNTIL CANCEL來恢復資料庫,提供存檔的redo log檔案請求直到該活動/事件為止

  4、輸入CANCEL來取消恢復

  5、開啟資料庫;

  6、使用NORMAL的模式來關閉資料庫

  7、啟動資料庫例項

  結論

  高可用性對於任何的商業都是很重要的,ORACLE DBA可以透過一些計劃以確保停機時間最小化、這篇文章討論了不同的策略可以達到這個目的。


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

相關文章