RMAN的中文文擋作者:liuxnp
我的文擋全是英文的,,看起來實在太辛苦 linux_shell --------------------------------------------------------------- Oracle數(shù)據(jù)庫恢復管理器及特殊包的應(yīng)用 郭濤 湖南省水利水電機械施工公司 摘要:多數(shù)Oracle數(shù)據(jù)庫管理員會遇到數(shù)據(jù)庫的備份恢復和將某表中數(shù)據(jù)定期備份形成歷史流水數(shù)據(jù)以便今后查詢統(tǒng)計等問題,本文通過對Oracle數(shù)據(jù)庫實用工具恢復管理器及DBMS_JOB包工作機制的分析,,提出了應(yīng)用Oracle數(shù)據(jù)庫恢復管理器和利用DBMS_JOB包實現(xiàn)存儲過程自動執(zhí)行來解決問題的方法,。 關(guān)鍵詞:DBA,、備份恢復、恢復管理器,、DBMS_JOB包 一. 引言: 隨著Oracle大型數(shù)據(jù)庫系統(tǒng)在企業(yè)的廣泛應(yīng)用,,系統(tǒng)數(shù)據(jù)量的快速增長,相信為數(shù)不少的Oracle DBA每天都在忙于做著重復的工作--對數(shù)據(jù)庫進行備份,。如果一旦哪一天疏忽了,,而這一天系統(tǒng)又恰恰發(fā)生了故障,需要進行數(shù)據(jù)恢復,,那么此時對 DBA來說可能就是一場災(zāi)難, 因為他可能無法完整地恢復數(shù)據(jù)庫中的數(shù)據(jù),。此外,在數(shù)據(jù)庫的應(yīng)用中我們會經(jīng)常碰到這樣的需求:將一些重要數(shù)據(jù)表中的數(shù)據(jù)定期備份到另一些數(shù)據(jù)表中去,。例如在企業(yè)員工工資管理系統(tǒng)中,每月工資報表打印完畢后,,應(yīng)將當月工資數(shù)據(jù)保存到工資歷史庫中去,,以便今后查詢及統(tǒng)計使用。通常我們采用存儲過程來完成對數(shù)據(jù)的處理,,這個過程由人工定期執(zhí)行完成,,操作起來很不方便。對于第一種情況,現(xiàn)在我們可利用Oracle數(shù)據(jù)庫實用工具恢復管理器來完成DBA每天必須做的備份工作,,而且可設(shè)定一個固定的時間,, 讓系統(tǒng)自動進行備份。對后一種情況,我們可以使用DBMS_JOB包結(jié)合存儲過程來實現(xiàn)數(shù)據(jù)處理的自動執(zhí)行,。下面筆者結(jié)合實踐經(jīng)驗,,分別介紹其實現(xiàn)方法。 二. Oracle數(shù)據(jù)庫備份與恢復方式及特點 ORACLE 數(shù)據(jù)庫備份分為物理備份和邏輯備份,。物理備份是數(shù)據(jù)庫文件拷貝的備份,, 冷 備份、熱備份屬于物理備份,。 導出/導入(EXPORT/IMPORT)工具用于進行邏輯備份,。 導出(EXPORT)備份可拷貝數(shù)據(jù)與數(shù)據(jù)庫定義,并以O(shè)racle的內(nèi)部格式保存為二進制文件,。相反,,利用Import則可將數(shù)據(jù)從二進制文件放回到Oracle數(shù)據(jù)庫中。但是導出(EXPORT)備份機制不能提供時間點恢復,,而且不能和歸檔重做日志文件一起使用,。 冷備份是在數(shù)據(jù)庫被正常關(guān)閉之后進行的數(shù)據(jù)文件的物理備份。當數(shù)據(jù)庫被關(guān)閉時,,被 數(shù)據(jù)庫使用的每一個文件都被備份下來,。這些文件因而保持著數(shù)據(jù)關(guān)閉時的完整的映象,。 熱備份是在數(shù)據(jù)庫運行的情況下,采用archivelog mode方式備份數(shù)據(jù)的方法,。 這涉及到將每個表空間設(shè)置為備份狀態(tài),,然后備份其數(shù)據(jù)文件,最后將表空間恢復成正常的狀態(tài),。 數(shù)據(jù)庫可以從這個備份中完全地恢復過來,,也可以通過歸檔的重做日志回滾到前面時間的任 一個點上。 上述幾種備份方法的特性比較 方法 類型 恢復特性 ----------- --------- ---------------------------------------------- Export導出 邏輯型 可以將任何數(shù)據(jù)庫對象恢復到它被導出時的狀態(tài) 冷備份 物理型 可將數(shù)據(jù)庫恢復到它被關(guān)閉時的狀態(tài) 熱備份 物理型 可將數(shù)據(jù)庫恢復到任一時間點的狀態(tài) 以上幾種備份方式都需要依賴DBA人工操作完成,,從而增加了DBA維護系統(tǒng)的負擔,。當 DBA需要維護多個Oracle數(shù)據(jù)庫系統(tǒng)時,還容易導致操作失誤,,而且備份的數(shù)據(jù)不便于集中統(tǒng)一管理,。 三. Oracle數(shù)據(jù)庫恢復管理器及DBMS_JOB包概述 恢復管理器(RMAN)是一個使DBA能很方便地對數(shù)據(jù)庫執(zhí)行備份和恢復任務(wù)的Oracle 應(yīng)用工具,與以上介紹的幾種方式不同,,它能夠提供DBA針對企業(yè)數(shù)據(jù)庫備份與恢復操作 的集中控制,。RMAN可以將備份記錄保存在恢復目錄中,Oracle服務(wù)器保持對備份的跟蹤 ,。實際的物理備份拷貝將被存儲在指定的存儲系統(tǒng)上,,可以是磁帶或磁盤。RMAN將全部備 份數(shù)據(jù)以O(shè)racle特有的格式寫入到"備份集"文件中,,通過RMAN應(yīng)用工具來讀取,。RMAN支持建立除邏輯備份以外的所有類型的備份。 下圖顯示了RMAN的功能框圖,。 利用RMAN進行備份恢復的條件是: 1.建立一個recovery_catalog,,存放RMAN使用和維護著的目標數(shù)據(jù)庫的信息,RMAN 使用這些信息去決定如何執(zhí)行備份和恢復的請求,。通常是把它建在另一個Oracle數(shù)據(jù)庫的一個模式里,,即需要建立一個用戶,該用戶需要有recovery_catalog_owner權(quán)限,。 2.目標數(shù)據(jù)庫必須是在archivelog模式下運行,,因為這樣,日志才能歸檔,,而RMAN 正是利用歸檔日志進行數(shù)據(jù)恢復,,所以這是一個必備條件。同時archivelog模式也是數(shù)據(jù)庫在線備份的必備條件,。 3.RMAN備份中,,如果采用磁帶機備份,需要安裝第三方介質(zhì)管理庫(MML),。 恢復管理器保存在RMAN中注冊的全部數(shù)據(jù)庫的記錄,。當RMAN被用來啟動備份或恢復數(shù)據(jù)庫時,,它將目標數(shù)據(jù)庫與恢復目錄中可用的數(shù)據(jù)庫ID進行驗證。如果條件一致,,RMAN對目標數(shù)據(jù)庫至少建立兩個通道,,其中一個通道只是對目標數(shù)據(jù)庫的一個遠程調(diào)用,使用PL/SQL接口來執(zhí)行備份與恢復操作,。RMAN使用它自己的PL/SQL引擎編譯這些用戶命令,,并在目標數(shù)據(jù)庫上執(zhí)行這些命令。執(zhí)行過程不需要用戶干預,,RMAN記錄追蹤在數(shù)據(jù)庫上執(zhí)行的全部備份與恢復操作,,因而在很大程度上避免了DBA錯誤導致的危險。 同時RMAN提供了多種命令用于檢查和測試數(shù)據(jù)庫備份集與拷貝,,并確保備份文件完整無缺且能夠用于實現(xiàn)恢復,。由上述可見,采用恢復管理器做備份與恢復的管理與其他方式相比較具有明顯的優(yōu)勢,, 可大大減少DBA做備份工作的工作量和操作失誤。 DBMS_JOB包是Oracle提供的內(nèi)部函數(shù)包,,提供了管理和調(diào)度作業(yè)隊列中的作業(yè)定時執(zhí)行的控制機制,。所有作業(yè)由SNP后臺進程執(zhí)行。 當SNP進程運行一個作業(yè)時,,進程將首先創(chuàng)建會話,,并恢復作業(yè)運行時的環(huán)境參數(shù),再調(diào)度作業(yè)運行,。DBMS_JOB包的主要功能有:提交Submit(),,執(zhí)行Run(),刪除Remove()等,。這樣,,我們就可以用這個包將創(chuàng)建的存儲過程放入Oracle數(shù)據(jù)庫系統(tǒng)的作業(yè)隊列中去,由系統(tǒng)按時調(diào)度運行,。 四. 應(yīng)用實例 4.1 RMAN做數(shù)據(jù)庫在線備份應(yīng)用實例 這里以某公司業(yè)務(wù)處理計算機中心數(shù)據(jù)庫為例,。用戶系統(tǒng)配置為:兩臺HP9000小型機(host1、host2),,操作系統(tǒng)為HP-UX11.0,,Oracle數(shù)據(jù)庫版本為8.0.5。兩臺機上各有一個Oracle數(shù)據(jù)庫實例,,分別運行不同的業(yè)務(wù)處理系統(tǒng),。用戶要求設(shè)備7X24小時在線工作,原則上運行時不允許數(shù)據(jù)庫關(guān)閉,。這就使得我們只能采用在線備份方式解決問題,。為安全起見,,我們在另一臺IBM服務(wù)器(host3)上安裝Windows2000及一個獨立的Oracle數(shù)據(jù)庫,恢復目錄就建在這個數(shù)據(jù)庫中,,這臺服務(wù)器還配置了一臺磁帶加載機,,備份數(shù)據(jù)存放在磁帶上,這樣即便哪臺機器出現(xiàn)故障我們也能夠?qū)崿F(xiàn)數(shù)據(jù)庫的完全恢復,,不過DBA應(yīng)注意定期做恢復目錄數(shù)據(jù)庫的備份,。在備份策略上,我們采用了全備份與歸檔日志備份相結(jié)合的方式,,既不占用過多的系統(tǒng)時間,,也相應(yīng)減少了備份的數(shù)據(jù)量。備份策略如下: (1) 每周日晚11:00做數(shù)據(jù)庫在線全備份,。 (2) 每天12:00,,18:00 做數(shù)據(jù)庫歸檔日志文件的在線備份。 建立備份機制的操作如下(以host1機為例): (1) 建立恢復目錄并注冊目標數(shù)據(jù)庫,。 SVRMGR> create tablespace rmanspace datafile ‘rmandata‘ size 500m; SVRMGR> create user rman identified by rman default tablespace Rmanspace temporary tablespace temp; SVRMGR> grant connect,resource,recovery_catalog_owner to rman; 以上為建立RMAN表空間和用戶,。 $ sqlplus rman/rman sql> start "/ora_01/app/oracle/product/8.0.5/rdbms/admin/catrman"; --執(zhí)行創(chuàng)建恢復目錄操作 $ rman target system/manager@host1 rcvcat rman/rman@host3; --連接目標數(shù)據(jù)庫和恢復目錄 rman> register database; --將目標數(shù)據(jù)庫注冊到恢復目錄中 rman> resync catalog; --進行同步目錄操作 (2) 將目標數(shù)據(jù)庫改為歸檔模式運行。 SVRMGR> connect internal SVRMGR> startup mount [dbname] SVRMGR> alter database [dbname] archivelog; --起用歸檔模式 SVRMGR> archive log start --啟動自動歸檔模式 SVRMGR> alter database [dbname] open; --打開數(shù)據(jù)庫 修改數(shù)據(jù)庫初始化參數(shù)文件init.ora,,定義歸檔模式(自動),、歸檔日志文件保存 路徑、歸檔日志文件命名方法,重新啟動數(shù)據(jù)庫,。 --------------------------------------------------------------- (3)建立全備份腳本文件hotbackup.rcv,。 connect target internal/oracle@host1 connect rcvcat rman/rman@host3 run { allocate channel t1 type ‘SBT_TAPE‘; backup incremental level 0 skip inaccessible tag hot_db_bk_level0 filesperset 5 format ‘bk_%s_%p_%t‘ (database); --備份全部數(shù)據(jù)庫控制文件和數(shù)據(jù)文件 sql ‘a(chǎn)lter system archive log current‘; backup filesperset 20 format ‘a(chǎn)l_%s_%p_%t‘ (archivelog all delete input); --備份歸檔日志,備份成功后刪除歸檔日志,。若不成功,,則不做刪除。 } 歸檔日志備份腳本hotarcbackup.rcv文件如下: connect target internal/oracle@host1 connect rcvcat rman/rman@host3 run { allocate channel t1 type ‘SBT_TAPE‘; sql ‘a(chǎn)lter system archive log current‘; backup filesperset 20 format ‘a(chǎn)l_%s_%p_%t‘ (archivelog all delete input); } (4) 利用UNIX的crontab命令定期自動執(zhí)行備份腳本 crontab命令用于指定一個文件,,其行計劃命令以固定時間間隔執(zhí)行,。Cron是一個 永久進程,它由/etc/rc.local啟動執(zhí)行,。Cron程序讀取,、解釋并執(zhí)行crontab文件。 我們將需自動定期執(zhí)行備份的腳本文件寫成shell命令行方式存入crontab文件中,,由 系統(tǒng)定期調(diào)度執(zhí)行,。 Crontab文件的每一行由六個域(minutes、hours,、day of month,、month、day of week、command)組成,,域之間用空格或Tab分開,。 現(xiàn)在,我們在目標機上編寫一個文件,,用以啟動自動備份進程,。文件名定為Oracle, 文件將放在/var/spool/cron/crontabs 目錄下,。 Oracle文件內(nèi)容: 0 23 * * 0 /oracle/rman/rman cmdfile ‘hotbackup.rcv’ ?。? 星期天23點對數(shù)據(jù)庫執(zhí)行在線全備份 0 12,18 * * * /oracle/rman/rman cmdfile ‘hotarcbackup.rcv’ # 每天12點,18點執(zhí)行歸檔文件備份 經(jīng)過以上的操作后,,系統(tǒng)每天自動產(chǎn)生兩個歸檔日志備份,,每個星期天產(chǎn)生一個數(shù) 據(jù)庫完全備份。DBA需要做的是,,隔幾天換一盤磁帶(更換磁帶的周期取決于備 份文件的大小和磁帶的容量)和用RMAN定期檢查備份執(zhí)行情況,。 執(zhí)行恢復操作的RMAN腳本文件restore.rcv如下(在host1上運行): connect target connect rcvcat rman/rman@host3 run { allocate channel t1 type ‘SBT_TAPE‘; allocate channel t2 type ‘SBT_TAPE‘; restore controlfile; sql ‘a(chǎn)lter database mount‘; restore database; recover database; sql ‘a(chǎn)lter database open resetlogs‘; } 4.2 存儲過程定期自動執(zhí)行的實例 以下為將Salary表數(shù)據(jù)定時轉(zhuǎn)入Salary_history表的應(yīng)用實例: 創(chuàng)建存儲過程 SQL> create or replace procedure ProcEmp IS begin insert into Salary_history (EmpId,EmpName,DptName,Salary,Month) select EmpId,EmpName,DptName,Salary,to_char(sysdate,‘yyyy-mm‘) from Salary; commit; end ProcEmp; / 提交作業(yè) SQL> variable jobno number; SQL> begin DBMS_JOB.SUBMIT(:jobno, ‘ProcEmp;‘, SYSDATE, ‘SYSDATE + 30‘); --每30天運行一次 commit; end; / 運行作業(yè) SQL>begin dbms_job.run(:jobno); end; / 五. 結(jié)語 Oracle實用工具RMAN的應(yīng)用為DBA管理多個Oracle數(shù)據(jù)庫提供了集中備份管理與恢復控制的機制,大大地減輕了DBA的工作壓力,,而DBMS_JOB包的使用增強了存儲過程的應(yīng)用功能,,這樣,他們就可以從備份數(shù)據(jù)及重復處理數(shù)據(jù)的繁瑣中解脫出來,,去做其它更有意義的工作,。而數(shù)據(jù)庫既實現(xiàn)了在線磁帶備份,又實現(xiàn)了異機備份集中管理,,相應(yīng)提高了系統(tǒng)運行的安全性。 參考文獻 Oracle8數(shù)據(jù)庫高級應(yīng)用開發(fā)技術(shù) 人民郵電出版社,,2000 Oracle8系統(tǒng)管理員手冊 機械工業(yè)出版社,,1998 |
|