1. 程式人生 > >ORACLE資料庫資料的備份與恢復

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表)

 

 

 

 持續更新......