版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://sds07s7.blogbus.com/logs/62548066.html
玩Oracle也有2年的時間了, 零零散散的也整理一些資料。 東西一多了,就理不清楚。 所以結合張曉明的《大話Oracle RAC》的一些內容,和自己整理的一些筆記,對Oracle 的備份和恢復做了一個系統(tǒng)的整理。 也是自己對知識的一個鞏固吧。
一. 準備知識
先來看一些準備知識,了解Oracle的物理結構,有如下4種。
1. 數(shù)據(jù)文件和數(shù)據(jù)塊
Oracle 數(shù)據(jù)庫的存儲空間是用表空間來表示的,表空間只是一個邏輯概念,而物理上每個表空間是由磁盤文件組成,這些文件叫做數(shù)據(jù)文件(Data file),每個表空間可以由一個到多個數(shù)據(jù)文件組成,每個數(shù)據(jù)文件被劃分為若干個最小的存儲單位: 數(shù)據(jù)塊(data block)。
具體參考我的blog: 表空間(tableSpace) 段(segment) 盤區(qū)(extent) 塊(block) 關系
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4962476.aspx
Oracle 的用戶數(shù)據(jù)是寫到數(shù)據(jù)塊上的,Oracle 是在SGA上操作數(shù)據(jù)的,修改數(shù)據(jù)或者添加數(shù)據(jù)都是在內存中進行,這些被修改的內存不會立即寫入磁盤,而是以特定的時間間隔被寫入磁盤。 如果哦數(shù)據(jù)庫正常關閉,則在關閉之前將內存中的數(shù)據(jù)同步到磁盤,這時數(shù)據(jù)狀態(tài)是一致的。如果數(shù)據(jù)庫不正常關閉(如宕機,shutdown abort),內存中的內容沒有完全寫回磁盤,這時數(shù)據(jù)文件是不一致的。 如果數(shù)據(jù)文件是從備份中恢復出來的,數(shù)據(jù)文件也是不一致的,不一致性的數(shù)據(jù)文件必須恢復到一致的狀態(tài)。
2. 日志文件
Oracle 數(shù)據(jù)庫日志文件包括 聯(lián)機日志 和 歸檔日志, 這些文件都是用來記錄數(shù)據(jù)庫修改歷史的。Oracle 數(shù)據(jù)庫至少要有兩組聯(lián)機日志,聯(lián)機日志循環(huán)使用,當一組聯(lián)機日志寫滿后,就要切換到另一組聯(lián)機日志,后者的內容就會被覆蓋,這個過程叫作日志切換(Log Switch),在日志切換時會觸發(fā)檢查點(CheckPoint)。
數(shù)據(jù)庫的修改操作要記錄到日志文件中,并且這個記錄動作是在修改數(shù)據(jù)之前進行的,正因為日志文件中記錄了所有的修改歷史,因此如果有過去某個時點的備份文件,并且有從那是到當前的所有日志文件,就可以通過在備份文件上"重演"這些日志的方式,把數(shù)據(jù)文件恢復到當前狀態(tài)或者之間的任何時點的狀態(tài)。
日志線程(Redo Thread):
每個實例用到的聯(lián)機日志就是一個Redo Thread,單實例有且僅有一個Redo Thread。在RAC 環(huán)境下,每個實例都需要自己的聯(lián)機日志,也就是每個實例都有自己的Redo Thread。 這種每實例一個Redo Thread的設計就是為了避免實例間共享Redo 文件引發(fā)的競爭,提高系統(tǒng)性能。 但是這也帶了一個問題,就是用RMAN 備份RAC 的時候,需要所有的日志文件。 故需要在兩個節(jié)點上互相把日志傳送到另一個節(jié)點。
Thread 這個參數(shù)用來指定實例使用的Redo Thread 線程號。一般和該實例的INSTANCE_NUMBER 參數(shù)相同。 通過視圖V$LOG的Thread#列可以確定日志組所屬的線程。
注意: 因為RAC 環(huán)境下有多個日志線程,所以在添加日志時必須指定線程號。
SQL>alter database add logfile thread 1 group 5 ('/oracle/oradata/redo5') size 50m;
在RAC 環(huán)境下,用戶操作是分布在多個實例之間的,各實例都有自己的聯(lián)機日志,恢復時必須把所有實例的聯(lián)機日志都合并,把Redo Log Record 按照SCN 排序,才能整理出準確的用戶操作記錄,所以RAC的聯(lián)機日志必須放在共享存儲上,以保證實例都能訪問其他實例的聯(lián)機日志。
在看一個sql 的查詢結果:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------------- ----
1 1 24585 104857600 1 YES ACTIVE
2 1 24583 104857600 1 YES INACTIVE
3 1 24584 104857600 1 YES INACTIVE
8 1 24586 104857600 1 NO CURRENT
從查詢結果上,我們可以看到聯(lián)機日志有3個狀態(tài)。
INACTIVE: 表示DBWR 已經做完,該日志包含的數(shù)據(jù)修改已經寫到數(shù)據(jù)文件
ACTIVE: DBWR 沒有做完,數(shù)據(jù)還沒有寫到數(shù)據(jù)文件。
CURRENT:當前正在使用的日志。 沒有DBWR 操作。
RedoLog Checkpoint 和 SCN關系
http://blog.csdn.net/tianlesoftware/archive/2010/0 1/25/5251916.aspx
Redo Log 和Checkpoint not complete
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/01/4908066.aspx
Oracle 歸檔與非歸檔的切換
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/19/4693470.aspx
log file sync(日志文件同步) 與 Log file parallel write 等待事件
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/02/4916671.aspx
3. 控制文件
控制文件記錄了數(shù)據(jù)庫的物理結構和狀態(tài)(比如數(shù)據(jù)文件名,每個數(shù)據(jù)文件的檢查點號,聯(lián)機狀態(tài)),包括備份和恢復的信息也記錄在控制文件中。 恢復過程要根據(jù)控制文件中的信息,比如數(shù)據(jù)庫的檢查點,當前聯(lián)機日志,數(shù)據(jù)文件檢查點等來進行恢復操作,如果控制文件丟失,則恢復的過程會很艱難。
控制文件里包含的具體信息,參考我的Blog:
Oracle 控制文件
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4974440.aspx 4. Undo Segment修改記錄過程中,記錄修改之前的狀態(tài)會被記錄到Undo Segment中, 這條記錄叫作前鏡像(before images)。 當需要撤銷修改比如執(zhí)行Rollback時,就用這條前鏡像覆蓋現(xiàn)有記錄,對于Insert 操作,前鏡像就是一個空記錄,對于Undate,Delete 操作,前鏡像就是修改之前的記錄。
在數(shù)據(jù)庫恢復過程中,日志和Undo Segment 共同起作用,二者保證了最終恢復的一致狀態(tài)。二者也對應了恢復的兩個階段: 前滾(Roforware)和 回滾(Rollback)。在前滾階段,在文件上重演日志內容,以把文件恢復到數(shù)據(jù)庫關閉時的狀態(tài),但是數(shù)據(jù)庫關閉時可能有很多修改操作沒有提交,這些操作必須進行回滾,這就要利用Undo Segment的內容。
Oracle undo 回滾段管理
http://blog.csdn.net/tianlesoftware/archive/2009/1 1/30/4901666.aspx
二.備份
備份是指數(shù)據(jù)的拷貝,這個拷貝可以用來重建數(shù)據(jù)庫。 備份可以分為物理備份和邏輯備份。
物理備份: 指對數(shù)據(jù)文件,控制文件,聯(lián)機日志文件等文件進行物理拷貝的方法,這種方法是在文件層進行的,通過冗余的文件備份來體統(tǒng)數(shù)據(jù)保護。物理備份又可分為聯(lián)機備份(也叫作聯(lián)機熱備)和脫機備份(也稱冷備)。
邏輯備份: 利用Oracle 提供的導出工具把重要數(shù)據(jù)導出到文件,以后恢復時在利用工具把數(shù)據(jù)重新導入到數(shù)據(jù)庫中,這種保護是在數(shù)據(jù)層進行的。 該類工具有: exp/imp, expdp/impdp(10g 以后版本)。
物理備份是最強健的數(shù)據(jù)保護方也,也是備份策略中首選的方法,邏輯備份只能作為物理備份的補充手段,不足以保護數(shù)據(jù)丟失。
物理備份又可分為用戶管理備份(User-Managed Backup)和RMAN備份(Recovery Manager)。 前者是聯(lián)合使用SQL 命令和OS的cp 命來進行文件備份。 Rman 備份指利用RMAN 工具來進行備份。
Rman 備份有幾點好處:
1. 增量備份
2. 數(shù)據(jù)塊恢復:可以在新進行數(shù)據(jù)塊恢復,不必進行數(shù)據(jù)文件恢復,提高系統(tǒng)的可用性。
3. 壓縮備份
4. 加密備份
具體用法參考blog:
RMAN 備份與恢復 實例
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/20/4699320.aspx
Oracle Rman 命令詳解(List report backup configure)
http://blog.csdn.net/tianlesoftware/archive/2009/1 2/13/4976998.aspx
Oracle Rman跨resetlogs版本恢復
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/17/4682463.aspx
ORACLE 數(shù)據(jù)庫邏輯備份 簡單 EXP/IMP
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/24/4718366.aspx
Oracle 10g EXPDP和IMPDP使用說明
http://blog.csdn.net/tianlesoftware/archive/2009/1 0/16/4674224.aspx
三.恢復
3.1 理論知識:
Oracle 在運行過程中,所有對于數(shù)據(jù)的修改都是在內存中進行,Oracle 每要修改一個記錄必須先把記錄所在的數(shù)據(jù)塊加載到內存中,然后在內存中進行修改。但是提交(commit)時,修改的數(shù)據(jù)塊不會立即寫回磁盤;谛阅芸紤],Oracle是采用"延時寫"的算法定期批量的把數(shù)據(jù)塊寫回磁盤。因此在數(shù)據(jù)庫運行過程中,內存的內容總是比磁盤數(shù)據(jù)新。 當數(shù)據(jù)庫正常關閉時(Shutdown Immediate,shutdown normal,shutdown tracsactional),Oracle 會把SGA內容全部寫回磁盤后才關閉數(shù)據(jù)庫,這時內存和磁盤就完全同步了。 所以正常關閉數(shù)據(jù)庫后數(shù)據(jù)不會丟失,但是如果數(shù)據(jù)庫是異常關閉(突然短線,shutdown abort),內存中的數(shù)據(jù)來不及同步到磁盤,這是就會產生了數(shù)據(jù)不一致,Oracle 在次打開數(shù)據(jù)庫時,就需要進行實例恢復。
Oracle 的Redo 機制保證了數(shù)據(jù)庫恢復的可行性,在修改數(shù)據(jù)之前,代表本次修改操作的Redo記錄必須先被保存下來(Write Ahead Logging),然后才真正修改數(shù)據(jù)記錄。在處理commit語句時,Oracle 會在Log buffer產生一條commit 記錄,為了保證事務的持久化,所有Redo 記錄和這一條commit記錄都要被寫到磁盤的聯(lián)機日志文件(Log Force At commit),但是數(shù)據(jù)塊(Data Block)不必寫回磁盤。 如果聯(lián)機日志空間不夠,還會觸發(fā)日志切換(Log Switch),舊日志的檢查點必須完成才能被覆蓋,如果采用歸檔模式,這個日志還必須完成歸檔才能覆蓋。
這些日志中都會帶有SCN,SCN類似于時間戳,Oracle 按照SCN對日志內容進行排序,就可以得到操作歷史,Oracle 也是根據(jù)SCN來判斷數(shù)據(jù)文件是否需要恢復的。
數(shù)據(jù)庫在正常運行時,每個數(shù)據(jù)文件的終止SCN(STOP SCN)會被設置為無窮大(NULL),而其他的那些SCN應該完全一樣。如果數(shù)據(jù)庫正常關閉,關閉之前會執(zhí)行一個檢查點動作,每個數(shù)據(jù)文件的終止SCN 會被設置成啟動SCN(Start SCN)。 如果數(shù)據(jù)庫異常關閉,終止SCN 來不及設置為啟動SCN,仍然保持NULL。
當clean shutdown 時,checkpoint會進行,并且此時datafile的stop scn和start scn會相同。 等到我們開啟數(shù)據(jù)庫時,Oracle檢查datafile header中的start scn和存于control file中的datafile的scn是否相同, 如果相同,接著檢查start scn和stop scn是否相同,如果仍然相同,數(shù)據(jù)庫就會正常開啟,否則就需要recovery... 等到數(shù)據(jù)庫開啟后,儲存在control file中的stop scn就會恢復為NULL值,此時表示datafile是open在正常模式下了。
如果不正常SHUTDOWN (shutdown abort),則mount數(shù)據(jù)庫后,你會發(fā)現(xiàn)stop scn并不是等于其它位置的scn, 而是等于NULL,這表示Oracle在shutdown時沒有進行checkpoint,下次開機必須進行crash recovery。
注意:當發(fā)生checkpoint時,會把SCN寫到四個地方去。三個地方于control file內,一個在datafile header。
Control file三個地方為
1.System checkpoint SCN
2.2.Datafile checkpoint SCN
3.Stop SCN 另外一個地方在datafile header內
4.Start SCN
更多內容參看blog: RedoLog Checkpoint 和 SCN關系 http://blog.csdn.net/tianlesoftware/archive/2010/0 1/25/5251916.aspx Oracle恢復可以分成實例恢復(Instance Recovery),介質恢復(Media Recovey),其中介質恢復又可分為完全恢復(Complete Recovery)和不完全恢復(Incomplete Recovery)。 |