ORACLE資料庫資料的備份與恢復
原創作品,轉自請在文字開頭顯眼位置註明出處:https://www.cnblogs.com/sunshine5683/p/10052949.html
資料備份恢復在資料庫管理中至關重要,今天,總結一下資料庫備份與恢復需要注意的方面和實際操作!、
一、在備份之前首先應該執行commit語句,將所有未提交的資料進行提交,(提交了的資料也有可能在記憶體),執行alter system checkpoint語句,所有的髒資料(記憶體中所有修改過的資料,這些資料有可能被提交,也有可能未被提交)都會被寫入到了磁碟上,但是如果被寫入磁碟的資料塊處於未提交狀態,那麼另外一個會話登入後是不可見的!
commit:標誌了事務的提交,資料的生效,其他使用者或者會話才是可見的,不管該資料是在磁碟上還是在記憶體中。
commit後首先將redo儲存到磁碟,首先儲存redo而不儲存資料的原因是redo的儲存比修改資料的儲存快很大,保證了資料提交的速度,而且一旦redo被儲存,那麼即使資料沒有被儲存,也可以通過redo將該資料恢復,所以,redo的儲存保證了資料的安全。
redo保證了資料的安全,此時再執行checkpoint,並不是多此一舉,將記憶體資料寫入磁碟,一是保證記憶體的利用率,不至於記憶體髒資料太大,二是對於資料恢復有很大的作用
二、例項恢復發生在oracle啟動的第三個階段
第一階段:startup nomount(讀取spfile),沒有進行例項恢復
第二階段:alter database mount(讀取控制檔案),沒有進行例項恢復
第三階段:alter database open(檢查控制檔案,資料檔案頭,檢查資料完整性),進行例項恢復
下面將資料庫強制關閉,shutdown abort(強制關閉,這樣關閉快速,但是一些記憶體資料不會被儲存到資料庫磁碟,在資料庫下次啟動的時候就會進行例項恢復,在實際環境中不建議這樣關閉),然後分階段啟動資料庫:
資料庫例項恢復的大概原理:Oracle在開啟資料庫時(alter database open),會檢查每個檔案頭上的資訊(SCN),並同控制檔案中相應的資訊(SCN)比較,如果不一致,則進行例項恢復。
例項恢復的過程 :
首先:前滾 rolling forward ,讀取狀態為current和active狀態的日誌(redo log),將發生crash時,沒有來得及寫到磁碟上的資料塊,使用redo的資訊來恢復。
其次:開啟資料庫(alter database open)
最後:回滾 rolling back: 將沒有提交的事務進行回滾。
三:介質恢復
當發生以下情況時,例項恢復無效,需要進行介質恢復:
1、資料檔案丟失,損壞
2、線上日誌檔案(online redo)丟失,損壞
3、資料檔案太舊 (比如從一個備份集中恢復過來的檔案)
4、檔案太新(比如,其它所有的檔案都是從備份中恢復過來的)
如下圖:將資料檔案11號檔案offline之後,進行11號檔案恢復,顯示出錯,這種錯誤就是資料檔案太舊無法恢復
四、資料庫的備份方式
1、Rman(物理備份):針對 資料庫,表空間,資料檔案,資料塊,這種方案備份的速度很慢,不建議備份線上日誌檔案,其他檔案都可以備份
2、exp,expdp(邏輯備份):針對 使用者,資料庫物件(表,分割槽...),這種備份方案對資料的完整性保證不是很好
3、只讀表空間+傳遞表空間,這種備份方案要求將某些表空間置為只讀形式,類似與資料倉庫,不能再改變
4、Data guard,這種備份方案比較常用
五、資料庫備份操作
1、Rman備份:首先建議將資料執行在歸檔模式下
其次,以rman模式登入資料庫,如果全庫備份,直接使用下面命令備份就好
如果備份個別表空間,則首先我們看看有哪些表空間
隨便選擇一個表空間,我們就選擇users表空間進行備份,可以看到速度很快
接下來恢復該表空間,過程都是很快的
2、export
備份:export 使用者名稱/密碼 file=使用者名稱.dmp 匯出該使用者下的所有表
恢復: import 使用者名稱/密碼 file=使用者名稱.dmp full=y(表示全部匯入)
import 使用者名稱/密碼 file=使用者名稱.dmp tables=tt(表示匯入tt表)
持續更新......