1. 程式人生 > >Oracle備份和恢復(RMAN篇)

Oracle備份和恢復(RMAN篇)

RMAN ORACLE 張晨

前言:歡迎加QQ交流1445696451微博地址http://blog.51cto.com/13434336
~~~~~~~分割~~~~~~
數據庫備份與恢復是數據庫管理員必須掌握的。沒有任何系統能免遭硬盤物理損壞、粗心用戶的錯誤操作、或一些可能會威脅到存儲數據的潛在災難的侵襲。為了能夠最大限度地恢復數據庫數據,保證數據庫的安全運行,應該選擇最合理的備份方法來防止各種故障所導致的用戶數據丟失
一、Oracle常見的數據丟失的情況:
1、語句故障
語句故障時在執行sql語句過程中發生的邏輯故障。例如:向表中插入違反約束的無效數據,或者表空間沒有空間了導致無法插入數據等。這時,應用人員或者DBA根據情況進行相應處理及可。
2、用戶進程故障
當用戶程序出錯而無法訪問oracle數據庫時,就會發生用戶進程故障,原因是異常斷開連接或終止進程,如果網絡不通,客戶端計算機以外重新啟動,這些故障會導致用戶進程與服務器的連接意外終止。
用戶進程故障只會導致當前用戶無法正常操作數據庫,但不會影響其他用戶進程。當用戶進程出現故障時,進程監控程序(PMON)會自動執行進程恢復。PMON是oracle的後臺進程,用於檢測與用戶進程失去連接的服務器進程。PMON會通過回滾事務來處理故障,還將釋放進程當前占用的資源。
3、實例故障
當oracle的數據庫實例由於硬件故障或軟件問題而無法繼續運行時,就會發生實例故障。硬件問題包括意外斷電,而軟件問題可能是服務器操作系統崩潰。
當重新啟動數據庫時,如果發現實例故障,oracle會自動完成實例恢復。實例恢復將數據庫恢復到與故障之前的事務一致的狀態,oracle會自動回滾未提交的數據。
4、介質故障
介質故障是當一個數據庫文件、文件的部分或磁盤不能讀或不能寫時出現的故障。例如:硬盤磁頭損壞會導致而數據庫文件完全損壞。要修復由於介質故障引起的數據庫文件損壞,需要使用介質恢復。
二、備份的分類

1、從物理和邏輯角度分:
1)物理備份:對數據庫操作系統的物理文件(如數據文件、控制文件和日誌文件)的備份。物理備份又可以分為脫機備份(冷備份)和聯機備份(熱備份),前者是在關閉數據庫的時候進行的,後者對正以歸檔日誌方式運行的數據庫進行備份。可以使用oracle的恢復管理器(RMAN)或操作系統命令進行數據庫的物理備份。

2)邏輯備份:對數據庫邏輯組件(如表和存儲過程等數據庫對象)的備份。邏輯備份的手段很多,如傳統的EXP、數據泵EXPDP、數據庫閃回技術及第三方工具,都可以進行數據庫的邏輯備份。
2、從備份策略角度上
1)完全備份:每次對數據進行完整的備份。當發生數據丟失的災難情況時,完全備份無須依賴其他信息,即可實現100%數據恢復,其恢復時間最短且操作最方便。
2)增量備份:只有那些在上次完全備份或者增量備份後被修改的文件才會備份。優點是備份數據量小,需要的時間短,缺點是恢復的時候需要依賴之前的備份記錄,出問題的風險較大。
3)差異備份:備份相對於上次完全備份之後被修改過的文件。從差異備份中恢復數據庫時間較短,因此只需要兩份數據(最後一次完全備份和最後一次差異備份),缺點是每次備份需要的時間較長。
3、有效的備份策略建議
1)每隔3天的晚上2點進行一次完全備份。
2)每天的3點進行一次差異備份。
3)各根據以上備份策略指定計劃任務
三、恢復
恢復就是發生故障後,利用已備份的數據或控制文件,重新建立一個完整的數據庫。恢復分為以下兩種類型。
1、實例恢復:當oracle實例出現失敗後,oracle自動進行的恢復。
2、介質恢復:當存放數據庫的介質出現故障時所做的恢復。介質恢復又分為完全恢復和不完全恢復。
完全恢復:將數據庫恢復到數據庫失敗時的狀態。這種恢復是通過裝載數據庫備份,並用全部的重做日誌做到的。
不完全恢復:將數據庫恢復到數據庫失敗前的某一時刻的狀態。這種恢復是通過裝載數據庫備份並應用部分的重做日誌做到的。進行不完全恢復後,必須在啟動數據庫時用resetlogs選型重設聯機重做日誌。

RMAN操作
1、準備工作
首先RMAN工作在歸檔日誌模式下,所以我們要開啟該模式
[root@oracle uniread-1.01]# uniread sqlplus sys/123456 as sysdba
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
用root建立/usr/local/rman目錄,並給oracle授權
[root@oracle local]# mkdir -p /usr/local/rman
[root@oracle local]# chown -R oracle /usr/local/rman/
[root@oracle local]# chmod -R 775 /usr/local/rman/
2、RMAN正式操作
用oracle用戶登陸操作;創建RMAN的恢復目錄以及註冊目標數據庫到恢復目錄
[oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
SQL> create tablespace rman_ts datafile ‘/usr/local/rman/rman.ora‘ size
20M autoextend on next 5M maxsize unlimited;
SQL> create user zhangsan identified by pwd123 default tablespace rman_ts temporary tablespace temp;
SQL> grant connect,resource to zhangsan;
SQL> grant recovery_catalog_owner to zhangsan;
SQL> quit
[oracle@oracle local]$ rman catalog zhangsan/pwd123
RMAN> create catalog tablespace rman_ts;
RMAN> quit
切換登陸RMAN
[oracle@oracle local]$ rman catalog zhangsan/pwd123 target /
RMAN> register database;
自動備份分配通道
RMAN> configure device type disk parallelism 5;
RMAN> configure default device type to disk;
手動備份分配通道(手動和自動二者選一即可)
RMAN> RUN
2> {
3> ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
4> ALLOCATE CHANNEL ch2 DEVICE TYPE disk;
5> ALLOCATE CHANNEL ch3 DEVICE TYPE disk;
6> }
開始備份(下面的命令表示備份整個數據庫和歸檔日誌,不指定備份路徑會備份到默認路徑)
RMAN> backup database plus archivelog;
3、恢復數據
查看備份的文件

1)模擬故障users01.dbf丟失

數據庫已經無法關閉了,報錯:找不到file4也就是users01.dbf這個文件

執行如下命令恢復丟失的users01.dbf
[oracle@oracle local]$ rman target sys/123456
RMAN> run
2> {
3> sql ‘alter tablespace users offline immediate‘;
4> restore tablespace users;
5> recover tablespace users;
6> sql ‘alter tablespace users online‘;
7> }
這是可以發現,數據庫可以正常關閉了,然後也能開啟了

2)模擬system01.dbf丟失(不是很確定能不能弄好。。)

登陸rman報了一堆錯,估計是廢了。嗯,關鍵是勇於嘗試

sys登陸不了了

system也登陸不了了

註釋:事實上system01.dbf丟失,如果Oracle在mount狀態是可以通過rman恢復的;但是這次我的Oracle是在open狀態,這樣我就登陸不了rman進行恢復操作了(*  ̄ー ̄) ( ̄ー ̄〃)
4、其他操作
1)備份時指定備份目錄、備份文件的命名格式(以/usr/local/rman)為例
RMAN> backup databse FORMAT ‘/usr/local/rman/%U’;
2)備份單個表空間
RMAN> backup tablespace users;
3)Oracle在mount下恢復system01.dbf
[oracle@oracle local]$ rman target sys/123456
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
[oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
SQL> alter database open;

最後的話:
有些博主可能會註意到我的截圖中在登陸Oracle的語句sqlplus前加了一個uniread;實際上它是Oracle的清屏翻頁工具。裝上之後在Oracle中輸入SQL語句就可以使用ctrl+L和“上鍵”翻出之前輸入的SQL語句了。
前言:歡迎加QQ交流1445696451微博地址http://blog.51cto.com/13434336
~~~~~~~分割~~~~~~
數據庫備份與恢復是數據庫管理員必須掌握的。沒有任何系統能免遭硬盤物理損壞、粗心用戶的錯誤操作、或一些可能會威脅到存儲數據的潛在災難的侵襲。為了能夠最大限度地恢復數據庫數據,保證數據庫的安全運行,應該選擇最合理的備份方法來防止各種故障所導致的用戶數據丟失
一、Oracle常見的數據丟失的情況:
1、語句故障
語句故障時在執行sql語句過程中發生的邏輯故障。例如:向表中插入違反約束的無效數據,或者表空間沒有空間了導致無法插入數據等。這時,應用人員或者DBA根據情況進行相應處理及可。
2、用戶進程故障
當用戶程序出錯而無法訪問oracle數據庫時,就會發生用戶進程故障,原因是異常斷開連接或終止進程,如果網絡不通,客戶端計算機以外重新啟動,這些故障會導致用戶進程與服務器的連接意外終止。
用戶進程故障只會導致當前用戶無法正常操作數據庫,但不會影響其他用戶進程。當用戶進程出現故障時,進程監控程序(PMON)會自動執行進程恢復。PMON是oracle的後臺進程,用於檢測與用戶進程失去連接的服務器進程。PMON會通過回滾事務來處理故障,還將釋放進程當前占用的資源。
3、實例故障
當oracle的數據庫實例由於硬件故障或軟件問題而無法繼續運行時,就會發生實例故障。硬件問題包括意外斷電,而軟件問題可能是服務器操作系統崩潰。
當重新啟動數據庫時,如果發現實例故障,oracle會自動完成實例恢復。實例恢復將數據庫恢復到與故障之前的事務一致的狀態,oracle會自動回滾未提交的數據。
4、介質故障
介質故障是當一個數據庫文件、文件的部分或磁盤不能讀或不能寫時出現的故障。例如:硬盤磁頭損壞會導致而數據庫文件完全損壞。要修復由於介質故障引起的數據庫文件損壞,需要使用介質恢復。
二、備份的分類
技術分享圖片
1、從物理和邏輯角度分:
1)物理備份:對數據庫操作系統的物理文件(如數據文件、控制文件和日誌文件)的備份。物理備份又可以分為脫機備份(冷備份)和聯機備份(熱備份),前者是在關閉數據庫的時候進行的,後者對正以歸檔日誌方式運行的數據庫進行備份。可以使用oracle的恢復管理器(RMAN)或操作系統命令進行數據庫的物理備份。
2)邏輯備份:對數據庫邏輯組件(如表和存儲過程等數據庫對象)的備份。邏輯備份的手段很多,如傳統的EXP、數據泵EXPDP、數據庫閃回技術及第三方工具,都可以進行數據庫的邏輯備份。
2、從備份策略角度上
1)完全備份:每次對數據進行完整的備份。當發生數據丟失的災難情況時,完全備份無須依賴其他信息,即可實現100%數據恢復,其恢復時間最短且操作最方便。
2)增量備份:只有那些在上次完全備份或者增量備份後被修改的文件才會備份。優點是備份數據量小,需要的時間短,缺點是恢復的時候需要依賴之前的備份記錄,出問題的風險較大。
3)差異備份:備份相對於上次完全備份之後被修改過的文件。從差異備份中恢復數據庫時間較短,因此只需要兩份數據(最後一次完全備份和最後一次差異備份),缺點是每次備份需要的時間較長。
3、有效的備份策略建議
1)每隔3天的晚上2點進行一次完全備份。
2)每天的3點進行一次差異備份。
3)各根據以上備份策略指定計劃任務
三、恢復
恢復就是發生故障後,利用已備份的數據或控制文件,重新建立一個完整的數據庫。恢復分為以下兩種類型。
1、實例恢復:當oracle實例出現失敗後,oracle自動進行的恢復。
2、介質恢復:當存放數據庫的介質出現故障時所做的恢復。介質恢復又分為完全恢復和不完全恢復。
完全恢復:將數據庫恢復到數據庫失敗時的狀態。這種恢復是通過裝載數據庫備份,並用全部的重做日誌做到的。
不完全恢復:將數據庫恢復到數據庫失敗前的某一時刻的狀態。這種恢復是通過裝載數據庫備份並應用部分的重做日誌做到的。進行不完全恢復後,必須在啟動數據庫時用resetlogs選型重設聯機重做日誌。

RMAN操作
1、準備工作
首先RMAN工作在歸檔日誌模式下,所以我們要開啟該模式
[root@oracle uniread-1.01]# uniread sqlplus sys/123456 as sysdba
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
用root建立/usr/local/rman目錄,並給oracle授權
[root@oracle local]# mkdir -p /usr/local/rman
[root@oracle local]# chown -R oracle /usr/local/rman/
[root@oracle local]# chmod -R 775 /usr/local/rman/
2、RMAN正式操作
用oracle用戶登陸操作;創建RMAN的恢復目錄以及註冊目標數據庫到恢復目錄
[oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
SQL> create tablespace rman_ts datafile ‘/usr/local/rman/rman.ora‘ size
20M autoextend on next 5M maxsize unlimited;
SQL> create user zhangsan identified by pwd123 default tablespace rman_ts temporary tablespace temp;
SQL> grant connect,resource to zhangsan;
SQL> grant recovery_catalog_owner to zhangsan;
SQL> quit
[oracle@oracle local]$ rman catalog zhangsan/pwd123
RMAN> create catalog tablespace rman_ts;
RMAN> quit
切換登陸RMAN
[oracle@oracle local]$ rman catalog zhangsan/pwd123 target /
RMAN> register database;
自動備份分配通道
RMAN> configure device type disk parallelism 5;
RMAN> configure default device type to disk;
手動備份分配通道(手動和自動二者選一即可)
RMAN> RUN
2> {
3> ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
4> ALLOCATE CHANNEL ch2 DEVICE TYPE disk;
5> ALLOCATE CHANNEL ch3 DEVICE TYPE disk;
6> }
開始備份(下面的命令表示備份整個數據庫和歸檔日誌,不指定備份路徑會備份到默認路徑)
RMAN> backup database plus archivelog;
3、恢復數據
查看備份的文件
技術分享圖片
1)模擬故障users01.dbf丟失
技術分享圖片
數據庫已經無法關閉了,報錯:找不到file4也就是users01.dbf這個文件
技術分享圖片
執行如下命令恢復丟失的users01.dbf
[oracle@oracle local]$ rman target sys/123456
RMAN> run
2> {
3> sql ‘alter tablespace users offline immediate‘;
4> restore tablespace users;
5> recover tablespace users;
6> sql ‘alter tablespace users online‘;
7> }
這時可以發現,數據庫可以正常關閉了,然後也能開啟了
技術分享圖片
2)模擬system01.dbf丟失(不是很確定能不能弄好。。)
技術分享圖片
登陸rman報了一堆錯,估計是廢了。~嗯,關鍵是勇於嘗試~~
技術分享圖片
sys登陸不了了
技術分享圖片
system也登陸不了了
技術分享圖片
註釋:事實上system01.dbf丟失,如果Oracle在mount狀態是可以通過rman恢復的;但是這次我的Oracle是在open狀態,這樣我就登陸不了rman進行恢復操作了(*  ̄ー ̄) ( ̄ー ̄〃)
4、其他操作
1)備份時指定備份目錄、備份文件的命名格式(以/usr/local/rman)為例
RMAN> backup databse FORMAT ‘/usr/local/rman/%U’;
2)備份單個表空間
RMAN> backup tablespace users;
3)Oracle在mount下恢復system01.dbf
[oracle@oracle local]$ rman target sys/123456
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
[oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
SQL> alter database open;

最後的話:
有些博主可能會註意到我的截圖中在登陸Oracle的語句sqlplus前加了一個uniread;實際上它是Oracle的清屏翻頁工具。裝上之後在Oracle中輸入SQL語句就可以使用ctrl+L和“上鍵”翻出之前輸入的SQL語句了。
技術分享圖片

Oracle備份和恢復(RMAN篇)