Oracle 備份 與 恢復 概述

Davis_itpub發表於2018-06-27
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <span style="background-color:inherit;line-height:1.5;">&nbsp;Oracle 備份 與 恢復 概述&nbsp;</span> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 一. 準備知識 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <b style="background-color:inherit;">1. 資料檔案和資料塊</b> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 資料庫的儲存空間是用表空間來表示的,表空間只是一個邏輯概念,而物理上每個表空間是由磁碟檔案組成,這些檔案叫做資料檔案(Data file),每個表空間可以由一個到多個資料檔案組成,每個資料檔案被劃分為若干個最小的儲存單位: 資料塊(data block)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 的使用者資料是寫到資料塊上的,Oracle 是在SGA上運算元據的,修改資料或者新增資料都是在記憶體中進行,這些被修改的記憶體不會立即寫入磁碟,而是以特定的時間間隔被寫入磁碟。 如果哦資料庫正常關閉,則在關閉之前將記憶體中的資料同步到磁碟,這時資料狀態是一致的。如果資料庫不正常關閉(如當機,shutdown abort),記憶體中的內容沒有完全寫回磁碟,這時資料檔案是不一致的。 如果資料檔案是從備份中恢復出來的,資料檔案也是不一致的,不一致性的資料檔案必須恢復到一致的狀態。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <b style="background-color:inherit;">2. 日誌檔案</b> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 資料庫日誌檔案包括 聯機日誌 和 歸檔日誌, 這些檔案都是用來記錄資料庫修改歷史的。Oracle 資料庫至少要有兩組聯機日誌,聯機日誌迴圈使用,當一組聯機日誌寫滿後,就要切換到另一組聯機日誌,後者的內容就會被覆蓋,這個過程叫作日誌切換(Log Switch),在日誌切換時會觸發檢查點(CheckPoint)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 資料庫的修改操作要記錄到日誌檔案中,並且這個記錄動作是在修改資料之前進行的,正因為日誌檔案中記錄了所有的修改歷史,因此如果有過去某個時點的備份檔案,並且有從那是到當前的所有日誌檔案,就可以透過在備份檔案上“重演”這些日誌的方式,把資料檔案恢復到當前狀態或者之間的任何時點的狀態。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 日誌執行緒(Redo Thread): </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 每個例項用到的聯機日誌就是一個Redo Thread,單例項有且僅有一個Redo Thread。在RAC 環境下,每個例項都需要自己的聯機日誌,也就是每個例項都有自己的Redo Thread。 這種每例項一個Redo Thread的設計就是為了避免例項間共享Redo 檔案引發的競爭,提高系統效能。 但是這也帶了一個問題,就是用RMAN 備份RAC 的時候,需要所有的日誌檔案。 故需要在兩個節點上互相把日誌傳送到另一個節點。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Thread 這個引數用來指定例項使用的Redo Thread 執行緒號。一般和該例項的INSTANCE_NUMBER 引數相同。 透過檢視V$LOG的Thread#列可以確定日誌組所屬的執行緒。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 注意: 因為RAC 環境下有多個日誌執行緒,所以在新增日誌時必須指定執行緒號。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> SQL&gt;alter database add logfile thread 1 group 5 ('/oracle/oradata/redo5') size 50m; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 在RAC 環境下,使用者操作是分佈在多個例項之間的,各例項都有自己的聯機日誌,恢復時必須把所有例項的聯機日誌都合併,把Redo Log Record 按照SCN 排序,才能整理出準確的使用者操作記錄,所以RAC的聯機日誌必須放在共享儲存上,以保證例項都能訪問其他例項的聯機日誌。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 在看一個sql 的查詢結果: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> SQL&gt; select * from v$log; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> GROUP# &nbsp;THREAD# &nbsp;SEQUENCE# &nbsp;BYTES &nbsp; MEMBERS ARC STATUS &nbsp; &nbsp; &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> ---------- &nbsp; ---------- &nbsp; ---------- &nbsp; &nbsp;---------- &nbsp; &nbsp; ---------- --- ---------------- ---- </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp;24585 &nbsp; &nbsp; 104857600 &nbsp; &nbsp; &nbsp;1 &nbsp;YES &nbsp;ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp;2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp;24583 &nbsp; &nbsp; 104857600 &nbsp; &nbsp; &nbsp;1 &nbsp;YES &nbsp;INACTIVE &nbsp; &nbsp; &nbsp; &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp;3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp;24584 &nbsp; &nbsp; 104857600 &nbsp; &nbsp; &nbsp;1 &nbsp;YES &nbsp;INACTIVE &nbsp; &nbsp; &nbsp; &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp;8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp;24586 &nbsp; &nbsp; 104857600 &nbsp; &nbsp; &nbsp;1 &nbsp;NO &nbsp; CURRENT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 從查詢結果上,我們可以看到聯機日誌有3個狀態。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> INACTIVE: 表示DBWR 已經做完,該日誌包含的資料修改已經寫到資料檔案 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> ACTIVE: DBWR 沒有做完,資料還沒有寫到資料檔案。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> CURRENT:當前正在使用的日誌。 沒有DBWR 操作。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> RedoLog Checkpoint 和 SCN關係 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Redo Log 和Checkpoint not complete </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4908066.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 歸檔與非歸檔的切換 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4693470.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> log file sync(日誌檔案同步) 與 Log file parallel write 等待事件 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/12/02/4916671.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3. 控制檔案</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 控制檔案記錄了資料庫的物理結構和狀態(比如資料檔名,每個資料檔案的檢查點號,聯機狀態),包括備份和恢復的資訊也記錄在控制檔案中。 恢復過程要根據控制檔案中的資訊,比如資料庫的檢查點,當前聯機日誌,資料檔案檢查點等來進行恢復操作,如果控制檔案丟失,則恢復的過程會很艱難。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 控制檔案裡包含的具體資訊,參考我的Blog: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 控制檔案 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4974440.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>4. Undo Segment</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; &nbsp; &nbsp; &nbsp; 修改記錄過程中,記錄修改之前的狀態會被記錄到Undo Segment中, 這條記錄叫作前映象(before images)。 當需要撤銷修改比如執行Rollback時,就用這條前映象覆蓋現有記錄,對於Insert 操作,前映象就是一個空記錄,對於Undate,Delete 操作,前映象就是修改之前的記錄。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 在資料庫恢復過程中,日誌和Undo Segment 共同起作用,二者保證了最終恢復的一致狀態。二者也對應了恢復的兩個階段: 前滾(Roforware)和 回滾(Rollback)。在前滾階段,在檔案上重演日誌內容,以把檔案恢復到資料庫關閉時的狀態,但是資料庫關閉時可能有很多修改操作沒有提交,這些操作必須進行回滾,這就要利用Undo Segment的內容。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>二.備份</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 備份是指資料的複製,這個複製可以用來重建資料庫。 備份可以分為物理備份和邏輯備份。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>物理備份</strong>: 指對資料檔案,控制檔案,聯機日誌檔案等檔案進行物理複製的方法,這種方法是在檔案層進行的,透過冗餘的檔案備份來體統資料保護。物理備份又可分為聯機備份(也叫作聯機熱備)和離線備份(也稱冷備)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>邏輯備份</strong>: 利用Oracle 提供的匯出工具把重要資料匯出到檔案,以後恢復時在利用工具把資料重新匯入到資料庫中,這種保護是在資料層進行的。 該類工具有: exp/imp, expdp/impdp(10g 以後版本)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 物理備份是最強健的資料保護方法,也是備份策略中首選的方法,邏輯備份只能作為物理備份的補充手段,不足以保護資料丟失。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>物理備份又可分為使用者管理備份(User-Managed Backup)和RMAN備份(Recovery Manager)</strong>。<br /> 前者是聯合使用SQL 命令和OS的cp 命來進行檔案備份。 Rman 備份指利用RMAN 工具來進行備份。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Rman 備份有幾點好處: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1. 增量備份 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2. 資料塊恢復:可以在新進行資料塊恢復,不必進行資料檔案恢復,提高系統的可用性。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3. 壓縮備份 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 4. 加密備份 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 具體用法參考blog: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> RMAN 備份與恢復 例項 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4699320.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle Rman 命令詳解(List report backup configure) </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4976998.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle Rman跨resetlogs版本恢復 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682463.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> ORACLE 資料庫邏輯備份 簡單 EXP/IMP </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/24/4718366.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 10g EXPDP和IMPDP使用說明 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4674224.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>三.恢復</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3.1 理論知識:</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 在執行過程中,所有對於資料的修改都是在記憶體中進行,Oracle 每要修改一個記錄必須先把記錄所在的資料塊載入到記憶體中,然後在記憶體中進行修改。但是提交(commit)時,修改的資料塊不會立即寫回磁碟。基於效能考慮,Oracle是採用“延時寫”的演算法定期批次的把資料塊寫回磁碟。因此在資料庫執行過程中,記憶體的內容總是比磁碟資料新。 當資料庫正常關閉時(Shutdown Immediate,shutdown normal,shutdown tracsactional),Oracle 會把SGA內容全部寫回磁碟後才關閉資料庫,這時記憶體和磁碟就完全同步了。 所以正常關閉資料庫後資料不會丟失,但是如果資料庫是異常關閉(突然短線,shutdown abort),記憶體中的資料來不及同步到磁碟,這是就會產生了資料不一致,Oracle 在次開啟資料庫時,就需要進行例項恢復。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 的Redo 機制保證了資料庫恢復的可行性,在修改資料之前,代表本次修改操作的Redo記錄必須先被儲存下來(Write Ahead Logging),然後才真正修改資料記錄。在處理commit語句時,Oracle 會在Log buffer產生一條commit 記錄,為了保證事務的持久化,所有Redo 記錄和這一條commit記錄都要被寫到磁碟的聯機日誌檔案(Log Force At commit),但是資料塊(Data Block)不必寫回磁碟。 如果聯機日誌空間不夠,還會觸發日誌切換(Log Switch),舊日誌的檢查點必須完成才能被覆蓋,如果採用歸檔模式,這個日誌還必須完成歸檔才能覆蓋。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 這些日誌中都會帶有SCN,SCN類似於時間戳,Oracle 按照SCN對日誌內容進行排序,就可以得到操作歷史,Oracle 也是根據SCN來判斷資料檔案是否需要恢復的。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 資料庫在正常執行時,每個資料檔案的終止SCN(STOP SCN)會被設定為無窮大(NULL),而其他的那些SCN應該完全一樣。如果資料庫正常關閉,關閉之前會執行一個檢查點動作,每個資料檔案的終止SCN 會被設定成啟動SCN(Start SCN)。 如果資料庫異常關閉,終止SCN 來不及設定為啟動SCN,仍然保持NULL。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 當clean shutdown 時,checkpoint會進行,並且此時datafile的stop scn和start scn會相同。 等到我們開啟資料庫時,Oracle檢查datafile header中的start scn和存於control file中的datafile的scn是否相同, 如果相同,接著檢查start scn和stop scn是否相同,如果仍然相同,資料庫就會正常開啟,否則就需要recovery... 等到資料庫開啟後,儲存在control file中的stop scn就會恢復為NULL值,此時表示datafile是open在正常模式下了。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 如果不正常SHUTDOWN (shutdown abort),則mount資料庫後,你會發現stop scn並不是等於其它位置的scn, 而是等於NULL,這表示Oracle在shutdown時沒有進行checkpoint,下次開機必須進行crash recovery。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 注意:當發生checkpoint時,會把SCN寫到四個地方去。三個地方於control file內,一個在datafile header。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Control file三個地方為 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1.System checkpoint SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2.2.Datafile checkpoint SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3.Stop SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 另外一個地方在datafile header內 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 4.Start SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 更多內容參看blog: RedoLog Checkpoint 和 SCN關係 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle恢復可以分成例項恢復(Instance Recovery),介質恢復(Media Recovey),其中介質恢復又可分為完全恢復(Complete Recovery)和不完全恢復(Incomplete Recovery)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3.2 恢復種類</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3.2.1 Instance Recovery -- 由Oracle 自動完成,無需DBA 干預 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 如果例項異常關閉(當機,shutdown abort),並且資料檔案,控制檔案,聯機日誌都沒有丟失。在下次啟動時,要利用聯機日誌的內容進行恢復,這種恢復就是例項恢復(Instance Recovery)。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Instance Recovery 主要包括3個階段: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1) 根據聯機日誌內容進行Rollover。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2) 開啟資料庫,提供服務 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3) SMON 或者使用者程式進行Rollback。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3.2.2 &nbsp;Media Recovery</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; &nbsp; 如果發生資料檔案丟失或者破壞,就需要使用備份和歸檔日誌來進行恢復, 這種恢復就是 介質恢復,它需要有備份,歸檔日誌,聯機日誌一起才能完成。又分為 安全恢復和不完全恢復兩種。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>&nbsp;</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3.2.3 Crash Recovery -- 由Oracle 自動完成</strong>。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; &nbsp; Instance Recovery是例項發生Crash 後進行的Recovery,這種恢復是在故障節點進行,而RAC 中的Crash Recovery 是某個例項發生Crash 後在其他例項上進行的Recovery。 這種Recovery 有一個特殊要求:在健康節點執行Crash Recovery時,必須要保證故障節點不能在對共享資料進行操作,也就是要對故障節點進行IO 隔離(IO Fencing),這是由CSS服務來保證的。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 在Crash Recovery過程中PCM Lock起到了重要作用,恢復例項(執行Recovery動作的例項)根據資料塊的PCM-Lock 狀態來決定資料塊是否需要進行恢復。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Crash Recovery 可分為3個階段: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1)First-Pass Log Read </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2)Recovery Claim Locking </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3)Second-Pass Log Read </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3.2.4 Online Block Recovery </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Online Block Recovery 是RAC所特有的, 如果某個使用者程式在修改資料時異常死掉,導致SGA的Data buffer資料不一致,或者說Data Buffer被破壞,這時就會觸發Online Block Recovery,這個動作可有PMON程式或者前臺程式完成。這個恢復過程需要一個恢復起點, 這個起點就是最近的Past Image。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>&nbsp;</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>&nbsp; 3.3 介質恢復</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 介質恢復指磁碟介質發生損壞,導致資料檔案無法訪問,這時必須利用備份檔案在新的磁碟上恢復出資料檔案。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 3.3.1 &nbsp;完全恢復 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 它是把資料庫恢復到發生故障時的狀態,名字中的完全指沒有任何資料損失,要實現這個目標,必須滿足一定的條件: 備份,從備份之後的所有歸檔日誌,聯機日誌都可用。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 完全恢復是最簡單的一種恢復, 只需要兩個命令: restore database 和 recover database。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 這2個命令的具體用法參考我的Blog: RMAN 備份與恢復 例項, 裡面有詳細的例子 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4699320.aspx </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 在次補充一點知識: RECOVER DATABASE UNTIL CANCEL 和 RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE區別 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1) RECOVER DATABASE UNTIL CANCEL </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> ==&gt; DATAFILE HEADER SCN一定會小於CONTROLFILE的DATAFILE SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 如果你有進行RESTORE DATAFILE,則該RESTORE的DATAFILE HEADER SCN一定會小於目前CONTROLFILE的DATAFILE SCN,此時會無法開啟資料庫,必須進行media recovery。 重做archive log直到該datafile header的SCN=current scn </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2) RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> ==&gt; DATAFILE HEADER SCN一定會大於CONTROLFILE的DATAFILE SCN </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 如果只是某TABLE被DROP掉,沒有破壞資料庫整體資料結構,還可以用NCOMPLETE RECOVERY解決 如果是某個TABLESPACE OR DATAFILE被DROP掉,因為檔案結構已經破壞,目前的CONTROL FILE內已經沒有 該DATAFILE的資訊,就算你只RESTORE DATAFILE然後進行INCOMPLETE RECOVERY也無法救回被DROP的DATA FILE。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 只好RESOTRE 之前備份的CONTROL FILE(裡頭被DROP DATAFILE Metadata此時還存在),不過RESTOREC CONTROL FILE後 此時Oracle會發現CONTROL FILE內的SYSTEM SCN會小於目前的DATAFILE HEADER SCN,也不等於目前儲存於LOG FILE內的SCN, 此時就必須使用RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE到DROP DATAFILE OR DROP TABLESPACE之前的SCN。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> <strong>3.3.2 不完全恢復</strong> </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 不完全恢復是指資料庫無法恢復到發生故障那一點的狀態,而只能恢復到之前一段時間的狀態,這就以為著承受一定量的資料損失。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> Oracle 執行時包括引數檔案,控制檔案,資料檔案,聯機日誌,那麼哪些檔案會導致不完全恢復呢? </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 引數檔案只是一個文字檔案,丟失沒有關係。控制檔案通常有多個檔案相互冗餘。 而且在做全庫備份時,控制檔案會被自動備份,故所有檔案都損壞,也可以透過備份進行恢復,即使沒有備份,也可以透過重建控制檔案來恢復,也不會造成資料丟失。如果是資料檔案損壞,只要有備份和備份後的完整的日誌檔案,也可以完成恢復,不會造成資料丟失。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 聯機日誌比較特殊,透過前面的介紹,我們知道在資料庫異常關機的情況下,它可能造成資料丟失。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 我們來看一下聯機日誌損壞的恢復方法: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 先用SQL 檢視一下出問題的聯機日誌是什麼狀態: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> SQL&gt; Select thread#,group#,status from v$log; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 1)如果是Inactive 狀態的聯機日誌,因為它裡面的記錄已經同步到資料檔案,所以只需要把該日誌刪掉即可。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 2)如果是Active/ current 狀態的連線日誌, 因為他們裡面有記錄沒有同步到資料檔案,可以透過如下方式來恢復: </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (1)關閉所有例項 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (2)在受損例項上,啟動到mount狀態 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (3)執行alter database open resetlogs </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (4)如果在第三步出現錯誤,並其實需要不完全恢復,就執行一下: recover database until cancel </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (5)例項啟動成功後,啟動其他例項 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> (6)立即對資料庫進行一次全備。 </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> &nbsp; </div> <div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;"> 說明: 在做了alter database open resetlogs;會把online redelog file清空,資料檔案丟失.所以這個時候要做一個全備份。resetlogs命令表示一個資料庫邏輯生存期的結束和另一個資料庫邏輯生存期的開始,每次使用resetlogs命令的時候,SCN不會被重置,不過oracle會重置日誌序列號,而且會重置聯機重做日誌內容.這樣做是為了防止不完全恢復後日志序列會發生衝突(因為現有日誌和資料檔案間有了時間差)。 </div> <div> <br /> </div>

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

相關文章