http://book.51cto.com/art/200912/169166.htm ??? 三思涂抹oracle
第7章 備份與恢復基礎
7.1 備份概念
所謂備份,其實就是冗余,本質是將當前的數據復制一份(也可能是多份)到其他位置,這樣當原始數據由于各種原因導致無法訪問或錯誤時,DBA可以通過冗余將其修復到備份時的狀態。
7.2. 備份類型
Oracle中的備份從類型上可以分為兩類:物理備份和邏輯備份。
物理備份的核心是復制文件。對于Oracle數據庫來講,就是將數據文件、控制文件、歸檔文件等Oracle數據庫啟動時所必須的相關物理文件,復制到其他路徑或存儲設備中。Oracle中提供了多種方式實現物理備份,比如鼎鼎大名的RMAN(全稱是Recovery Manager,通常簡稱RMAN)
邏輯備份的核心是復制數據。這種復制方式不管數據庫中具體是哪些文件存儲數據,而是按照Oracle提供的命令,通過邏輯的方式直接將數據保存在其他位置。Oracle中實現邏輯備份的方式包括EXP和EXPDP等應用,當然用戶也可以自己寫應用實現,比如最簡單的DBLINK+CREATE TABLE AS等。
優缺點:物理備份是對物理文件的備份,恢復后并不能壓縮(優化)數據庫;邏輯備份常規的EXP和EXPDP在處理大數據量時效率不佳,并且也未對增量備份提供直接支持,除小規模數據庫外,已經極少被應用于備份,倒是更常被應用于數據遷移的解決方案。
7.3 數據庫狀態
備份時數據庫的狀態也可以分為兩類:啟動狀態和關閉狀態,即:熱備份(Online Backups)和冷備份(Offline Backups)。
數據庫啟動狀態創建的備份就是熱備份,也叫聯機備份。熱備份肯定是不一致備份,利用創建的熱備份做恢復時,有可能需要應用歸檔日志或聯機重做日志,才能將數據庫修復到一個一致性的狀態,因此要創建有效的熱備份,要求數據庫必須處于歸檔模式,否則創建的備份可能是無效備份(具體情況要視當前Online Redologs是否被覆蓋過而定)。對于7×24小時的應用而言往往必須進行熱備份。
數據庫關閉狀態創建的備份就是冷備份,也叫脫機備份。利用冷備份做恢復時,如果數據庫是正常關閉(非SHUTDOWN ABORT或主機故障停電關閉等),則不需要對數據庫進行修復操作,否則也需要應用歸檔日志和Online Redologs,才能將數據庫修復到一個一致性的狀態。
7.4 備份的狀態
備份的狀態又可以分為兩類:一致性備份(Consistent Backups)和 不一致性備份(Inconsistent Backups)。
備份的數據文件和控制文件擁有相同的SCN(System Change Number),即一致性備份。只有當數據庫以SHUTDOWN [NORMAL|IMMEDIATE|TRANSACTIONAL]方式關閉,并且數據庫未被置于打開狀態(或OPEN READ ONLY)時創建的備份才是一致性備份,這種備份在恢復后不需要再做修復操作就可以直接打開,一致性備份必須是冷備份。
通常數據庫OPEN READ WRITE或SHUTDOWN ABORT時都不會是一致性狀態,因為備份操作不可能同時完成,而數據文件時刻都在寫,SCN時刻都在變。不一致的備份在恢復后必須借助歸檔日志文件和聯機重做日志,將數據庫修復到一致性的狀態才能打開。因此,創建不一致性的備份除了要備份數據庫啟動時必須的數據文件和控制文件外,還需要備份歸檔日志文件。
數據庫狀態與備份狀態的關系:
熱備份一定是不一致性備份;
冷備份可能是一致性備份,也可能是不一致性備份;
一致性備份肯定是冷備份;
不一致性備份可能是熱備份,也可能是冷備份。
7.5 備份規模
? 從備份的規模上可以分成:完全備份(Whole Database Backups)、表空間備份(Tablespace Backups)、數據文件備份(Datafile Backups)、控制文件備份(Control File Backups)、歸檔日志文件備份(Archived Redolog Backups)。
? 完整備份 包括:數據文件、控制文件、歸檔文件(有則備份)和初始化參數文件。完全備份的數據庫既可以是歸檔模式,也可以是非歸檔模式,但備份是否有效,取決于備份的狀態。歸檔模式下:數據庫正常打開狀態下創建的備份是不一致性的有效備份,數據庫正常關閉狀態下創建的備份都是有效備份(存在一致性備份和不一致性備份兩種可能)。非歸檔模式下:數據庫正常打開狀態下創建的不一致性備份是無效備份(即:非歸檔模式下就不能進行熱備份,否則備份無效),數據庫正常關閉狀態下創建的備份都是有效備份(還是一直備份)。
表空間備份 指定的是一個或多個表空間,實質是備份指定表空間下的數據文件,只有 當數據庫處于歸檔模式時 或者 表空間為只讀或脫機狀態 時,創建的表空間級備份才是有效備份。
? 數據文件備份 指定的是一個或多個數據文件,只有當數據庫處于歸檔模式時,且數據文件被置為READ ONLY或OFFLINE,此時創建的備份也可視作有效備份(不一致備份)。
歸檔日志文件備份 定期復制歸檔文件到其他路徑或服務器下即可,不需要考慮一致性或不一致的問題。如果數據庫設置了歸檔狀態且被置于Force Logging(歸檔本身就是備份),歸檔文件是數據文件備份的重要輔助部分,不一致備份在做恢復時,通常必須通過歸檔日志才能恢復到一致性狀態。
上述方式均指物理備份。邏輯備份由于直接操作邏輯對象,非常靈活,可以滿足任意規模的備份(包含但不限于上述類型)。
7.6 恢復
廣義的恢復就是將系統置于可用狀態。數據庫的恢復指物理恢復(通過特定操作將數據文件、控制文件恢復到某一時間點時的狀態)和邏輯恢復。
錯誤類型包括:用戶誤操作導致的錯誤、系統進程導致的錯誤、實例導致的錯誤、存儲介質導致的錯誤。實例錯誤會由Oracle(下次啟動時)自動(嘗試)進行(實例)修復。介質錯誤由DBA/SA進行介質恢復(Media Recovery)。
7.7 恢復類型
恢復類型包括:實例恢復(Instance Recovery)和 介質恢復(Media Recovery)。
實例恢復,也可稱作崩潰恢復(Crash Recovery),由Oracle自動進行,通過讀取當前的數據文件和聯機重做日志文件(注意,不是歸檔文件,實例恢復與是否歸檔模式無關)來恢復數據庫,使數據文件和控制文件恢復到崩潰前的一致性狀態。
實例恢復分兩個步驟進行:緩存恢復(Cache Recovery)、事務恢復(Transaction Recovery)。
Oracle啟動實例并加載數據庫,然后通過Online Redologs中的重做日志,重現實例崩潰前對數據庫的修改操作。在恢復過程中對于已經提交的事務,但尚未寫入數據文件的那部分數據全部寫入數據文件,這個過程用一個專業名詞來表達,叫Rolling Forward(前滾)。Rolling Forward之后,雖然已經提交的修改操作更改的數據都已經被寫入數據文件,但在實例崩潰時,部分未提交的事務操作的數據也被寫入到數據文件,這些事務必須被撤銷,這個過程也可用一個專業名詞來表述--Rolling Back(回滾)。
介質恢復指 需要用到DBA創建的備份進行恢復,或重新應用日志文件的操作;就是當前數據庫狀態已非正常狀態,需要DBA介入通過各種方式將數據庫恢復到某種指定狀態的操作。
介質恢復首先將數據庫恢復到備份時的狀態,然后通過應用重做日志的方式將數據庫恢復到最近的時間點(應用所有重做日志)或者某個指定的時間點(只應用部分重做日志,不超過重做日志中記錄的最后時間點)。通常提到介質恢復都是指數據文件的修復,其實還有另外一種介質恢復的方式,即數據塊恢復,只不過這種恢復方式僅RMAN中可用,而且實際應用的機率較低,因此本書中所提到的介質恢復,均是指磁盤上數據文件的恢復操作。
7.8 恢復方式
恢復方式:完全恢復(Complete Recovery)和不完全恢復(Incomplete Recovery)。
完全恢復是將數據庫恢復到最近的時間點的恢復方式,通常是當磁盤故障導致數據文件或控制文件無法訪問時選擇的恢復方式。如果是對整個數據庫做恢復,大概需要如下以下步驟:
MOUNT數據庫。
確認所有數據文件均為ONLINE狀態。
執行恢復操作。
應用所有生成的Redologs文件(包括聯機重做日志文件和歸檔文件)。
如果是表空間或數據文件級的恢復,步驟如下:
OPEN庫。
將要恢復的表空間或數據文件置為OFFLINE。
執行恢復操作。
應用所有生成的Redologs文件(包括聯機重做日志文件和歸檔文件)。
不完全恢復是指將數據庫恢復到非當前時刻的狀態,就是只應用部分歸檔或聯機重做日志,DBA可以通過指定SCN或時間點,將數據庫恢復到指定時間時的狀態,因此這種恢復也叫時間點恢復(Point-in-time Recovery)。
不完全恢復適用于下列情況:
介質損壞導致部分在線重做日志不可用。
用戶誤刪數據,無法用邏輯方式恢復。
由于丟失部分歸檔日志,無法進行完全恢復。
控制文件丟失,只能以備份的控制文件打開數據庫。
要進行不完全恢復的操作,必須要有適當的備份,并且備份必須是在要恢復的時間點之前創建。首先通過創建的備份,恢復所有的數據文件,然后應用重做日志到指定的時間點(或者是最后一個可用的重做日志文件),最后以OPEN RESETLOGS模式打開數據庫。
由于不完全恢復只應用部分日志文件,因此必須給Oracle指定結束標志,有如下4種選項可供選擇:
基于時間:指定一個具體的時間點。
基于SCN:指定一個具體的SCN號。在Oracle中SCN可以轉換成時間,因此本選項與前一條實質相同,但是SCN更加精確。只不過多數情況下,我們可能并不能準確記錄下數據庫的SCN,因此基于時間會更常用一些。
基于CANCEL:應用所有能夠應用的日志文件,直到用戶主動取消為止。
基于日志序號:指定歸檔文件序號,恢復到指定的日志序號后即中止恢復操作。
提示:
不完全恢復同樣也支持表空間級或數據文件級的不完全恢復。表空間的時間點恢復還有一個專業名詞叫TSPITR(Tablespace Point-in-time Recovery),不過需要謹記SYSTEM表空間和UNDO表空間(或任何包含回滾段的表空間)不支持TSPITR。
7.9 恢復操作
數據庫的恢復是指將數據庫恢復到一個一致性的狀態,整個恢復操作可以分為兩個步驟,數據庫修復(RESTORE)和恢復(RECOVER)。
修復是指將要恢復的文件從備份集中讀取出來,并保存至指定路徑下(如果未指定路徑,那么就是保存到默認路徑),在RMAN備份恢復中對應RESTORE命令。
恢復是指應用所有重做日志,將數據庫恢復到崩潰前的狀態,或者應用部分REDO,將數據庫恢復到指定的時間點。這里的恢復不是廣義的恢復,而是特指恢復的操作命令,在RMAN和用戶管理的備份恢復中都是對應RECOVER命令。
7.10??RESETLOGS操作
必須在執行不完全恢復后,標示之前生命周期結束,方法就是以RESETLOGS方式打開數據庫。以RESETLOGS方式打開后,Oracle數據庫又開始了一個新的生命周期,即重置Incarnation,日志文件序號也被重新初始化到1。
指定RESETLOGS會執行下列操作:
歸檔當前的在線重做日志文件(如果能訪問到的話),然后清空內容并將日志文件序號重置為1(如果在線重做日志文件不存在,則重建)。
重置控制文件中關于在線日志文件的元數據。
更新數據文件和在線重做日志文件中的RESETLOGS SCN和重置時間信息。
建議執行OPEN RESETLOGS操作之后馬上進行一次全庫備份。
Oracle數據庫的Incarnation在有些資料中譯作對應物,在我看來可以將其理解成生命周期。Oracle數據庫從創建到遇到RESETLOGS操作為一個生命周期,這個生命周期內數據庫的邏輯屬性,如SCN、日志文件序列號等具有相同的特征。當通過OPEN RESETLOGS方式打開數據庫后,原生命周期即宣告結束,原生命周期中生成的重做日志文件也被廢棄,日志文件序號自動重置為1。
7.11 常見備份與恢復技術
7.11.1 用戶管理的備份和恢復(User-Managed Backups&Recovery)
誤刪數據文件:指操作系統上的物理刪除,如果刪除的數據文件從創建到當前狀態,所有的歸檔都還在,可以通過特定操作重建該數據文件,不會丟失任何數據。
臨時進行的備份和恢復:比如為架設一個與現有數據庫一模一樣的測試環境,如果通過RMAN進行,必然會有備份和恢復的操作,如果是通過用戶管理方式進行,你可以將備份過程視作"備份+修復"的過程,然后再復制歸檔和在線日志文件,進行恢復操作即可。
7.11.2??RMAN備份和恢復(Recover Manager Backups&Recovery)
使用RMAN,DBA完全可以不用關心數據文件在哪里存放,RMAN的備份是由Oracle自身的服務進程操作,DBA只需要指定備份方式、備份內容,以及備份存儲的路徑等信息,其他工作都由RMAN自動完成,相對于用戶管理方式一次全庫備份需要數十條甚至更多命令,RMAN甚至只需要一條命令即可。 RMAN特有的功能,如:支持增量備份,支持直接向磁帶設備讀寫數據,支持錯誤塊檢測和修復,支持備份、恢復過程中自動檢查,支持作業方式,內置備份冗余等功能,獲得了更多廠商的支持(包括NBU/TSM等第三方備份管理工具都支持調用RMAN實現備份)。
7.11.3??邏輯導入/導出(Export/Import和Data Pump)
邏輯備份主要是備份數據,導出表、過程等對象到一個二進制文件中。對于小數據量的數據庫,這種方式有一個優勢,因為操作比較靈活,而且只導出邏輯數據,相對也節省磁盤空間。導出可以通過Export(執行命令:EXP)或Data Pump Export(執行命令:EXPDP)進行,后者是10g新推出的導出工具,采用10g新增的泵方式處理數據,理論上效率更高。兩者導出的二進制文件并不互相兼容。導入是通過Import(執行命令:IMP)或Data Pump Import(執行命令:IMPDP)進行。
由于邏輯導入和導出是通過邏輯方式進行,因此效率相比物理備份差異明顯,特別是當數據庫容量達到一定規模后,邏輯導入/導出的效率較低,因此并不適于作為常規備份方式。邏輯導入/導出工具可以用來進行數據庫遷移,對于跨平臺甚至又跨版本的數據庫遷移,如果沒有選擇第三方產品,并且不愿意通過高級復制或自寫程序方式遷移數據的話,使用邏輯導入/導出工具進行數據庫遷移就幾乎成了唯一的選擇。
7.11.4 閃回(Flashback)
閃回查詢(Flashback Query):通過查詢UNDO段,能夠重現操作之前的數據。
閃回表(Flashback Table):該特性與10g中新推出的另外一項新增特性Recycle Bin(回收站)對應,默認情況下表對象及其關聯的索引等對象在DROP后并沒有物理刪除,而是標記為刪除(類似在Windows中刪除文件時,文件移向"回收站"的概念),如果你想對這類表進行恢復,只需要簡單的命令即可,而且該操作只修改數據字典,不管要恢復的對象占用多大空間,恢復效率極高。
閃回數據庫(Flashback Database):該功能更是了得,真正實現了不需要備份的恢復(嚴格地講還是有備份,只不過這個備份操作不由DBA做,而是Oracle自動進行)。
7.11.5??數據衛士(Data Guard)
嚴格來講,Data Guard并不是一個備份恢復的工具,因為默認情況下Standby與Primary保持一致狀態,因此對于一些邏輯錯誤,如誤刪除數據等均無法提供有效的恢復手段,該特性的主要目的是為了容災。比如當Primary數據庫因為某些原因無法訪問時,可以快速將應用切換至Standby數據庫,如果調配得當,停機時間非常短暫(注意僅使用Data Guard并不能實現故障切換,完全無停頓)。Data Guard支持多種數據保護模式,能夠對數據提供最大限度的保護,確保任何情況下都不丟失數據。普通的備份恢復措施則不能保證這一點,而且一旦出現故障,通過備份恢復的方式重建數據庫費時較長,相比較而言,Data Guard更適用于容災恢復。
第8章 RMAN
8.1進入RMAN
通過RMAN的方式無論是要備份還是要恢復,都必須先啟動實例并加載數據庫。
1.連接數據庫
?C:\Documents and Settings\junsansi>SET ORACLE_SID=jssbook?
?C:\Documents and Settings\junsansi>RMAN TARGET /?
?Recovery Manager: Release 10.2.0.1.0 - Production on??
?Tue Mar 17 21:12:17 2009?
?Copyright (c) 1982, 2005, Oracle.? All rights reserved.?
?connected to target database: JSSBOOK (DBID=1415261003)
?RMAN>
SET ORACLE_SID=jssbook?? 設置實例名
RMAN TARGET /??? 連接TARGET???? 或者 先RMAN 再RMAN> connect target /?
注意,Linux/UNIX環境下設置操作系統環境變量應使用export命令,另外ORACLE_SID必須為大寫。
?[oracle@yans1 ~]$ export ORACLE_SID=test08?
?[oracle@yans1 ~]$ rman target /?
?
2.連接遠程數據庫
如果要連接的目標數據庫是一個遠程數據庫,那么必須在建立連接時指定一個有效的網絡服務名(Net Service Name),本地的tnsname.ora文件中必須已經建立了該網絡服務名的正確配置。
?C:\Documents and Settings\junsansi>RMAN TARGET
sys/sa@orcl
3.退出rman
添加日志
C:\Documents and Settings\junsansi>RMAN TARGET
sys/sa@orcl
log C:\temp\rman_log.txt
C:\Documents and Settings\junsansi>RMAN TARGET sys/orcl@orcl log C:\TEMP\rman_log.txt
退出rman
? RMAN> exit
??
8.2啟動關閉數據庫
?在Oracle數據庫OPEN狀態執行備份(嚴格地講是屬于OPEN READ WRITE狀態),則數據庫必須是置于歸檔模式,否則在執行備份操作時有可能碰到ORA-19602錯誤。
1.啟動、關閉數據庫
?先連接到目標數據庫
?C:\Documents and Settings\junsansi>RMAN TARGET /?
??關閉數據庫
??RMAN> SHUTDOWN IMMEDIATE??????? 或者SHUTDOWN NORMAL、SHUTDOWN ABORT
??啟動數據庫
??RMAN> STARTUP?????????????????? 或者 STARTUP MOUNT,然后再利用ALTER DATABASE OPEN
8.2.2? 執行操作系統命令
?RMAN支持通過執行HOST命令暫時退出RMAN的命令提示符,進入到操作系統的命令環境,
?執行完系統命令后可以再通過執行EXIT命令退出到RMAN命令提示符下。
?RMAN> HOST;
?C:\Documents and Settings\junsansi>exit;
8.2.3? 執行SQL語句
?在RMAN的命令提示符后輸入SQL命令,然后在一對單引號(雙引號亦可)中輸入要執行的SQL語句,例如:
?RMAN> SQL 'ALTER SYSTEM ARCHIVE LOG ALL';??? //ora-00258 noarchivelog模式下的手動歸檔必須標識日志
?注意,RMAN中的SQL命令不能執行SELECT語句,或者說可以執行,但看不到結果。
?
?主機命令/SQLPLUS命令/RMAN命令 結合使用
?RMAN> HOST;??
? Microsoft Windows XP [版本 5.1.2600]? (C) 版權所有 1985-2001 Microsoft Corp.?
?C:\Documents and Settings\junsansi>SQLPLUS /NOLOG????? //不能加分號
? SQL*Plus: Release 10.2.0.1.0 - Production on?? Tue Mar 17 21:15:44 2009? Copyright (c) 1982, 2005, Oracle.? All rights reserved.?
?SQL> CONN / AS SYSDBA??
? Connected.?
?SQL> ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';??
? Session altered.?
?SQL> SELECT SYSDATE FROM DUAL;?
?SYSDATE?
?-------------------?
?2009-03-17 21:16:08?
?SQL> exit?
?Disconnected from Oracle Database 10g Enterprise Edition?? Release 10.2.0.1.0 - Production? With the Partitioning, OLAP and Data Mining options?
?C:\Documents and Settings\junsansi>EXIT??
? host command complete?
?RMAN>
8.2.4? RMAN備份類型
?通過RMAN有兩種不同類型的備份方式:創建鏡像復制和創建備份集。
? 鏡像復制(Image Copies)。鏡像復制實際上就是創建數據文件、控制文件或歸檔文件的備份文件,與用戶通過操作系統命令創建的備份一樣(甚至連執行的命令都相同,RMAN鏡像復制使用COPY命令,Windows下復制文件也用COPY命令,Linux/UNIX下則是用cp命令),只不過RMAN是利用目標數據庫中的服務進程來完成文件復制,而用戶則是用操作系統命令。這種方式本質仍是復制數據庫中的物理文件,包括數據文件、控制文件等,復制出的文件與原始文件一模一樣,所以鏡像復制的方式體現不出RMAN的優勢。
備份集(Backup Sets)。備份集是RMAN創建的具有特定格式的邏輯備份對象,備份集在邏輯上由一個或多個備份片段(Backup Piece)組成,每個備份片段在物理上對應一個操作系統文件,一個備份片段中可能包含多個數據文件、控制文件或歸檔文件(之一)。通過RMAN創建備份集的優勢在于,備份時只讀取數據庫中已經使用的數據塊,因此不管是從備份效率,或是節省存儲空間的角度,創建備份集的方式都更有優勢,本章所執行的演示均是基于創建備份集的方式進行的。
8.2.5? RMAN命令執行方式
?(1)單個執行。
??RMAN>BACKUP DATABASE;
?(2)批處理,
??RMAN>RUN{?
??......?
??}
??批處理方式實質是將原來單個執行的命令組合到一起,并放在RUN{}之間,這種方式最大的好處是所有在RUN中的命令被視為一個作業,
??如果作業中任何一條命令執行失敗,則整個命令停止執行,即失敗命令后的其他命令都不會再被執行。
??這種方式是最常使用的方式,特別是對于后臺腳本化執行。
??不過,并不是所有的RMAN命令都能被放到RUN塊中執行,一些控制RMAN環境變量,或操作CATALOG的操作都不能在RUN塊中執行,
??如CONFIGURE、LIST、REPORT等。但是你仍然可以將這些命令放在RUN之前、之后或多個RUN塊之間(隨你放哪,只要不放到RUN塊里就行)。
?(3)運行腳本,又能細分為以下幾種方式:
??用命令行方式調用操作系統中保存的腳本:
??F:\oracle\script>RMAN TARGET / @backup_db.rman?
??或者:?
??F:\oracle\script>RMAN TARGET / cmdfile=backup_db.rman
??在RMAN中執行操作系統中保存的腳本文件:
??RMAN> @backup_db.rman
??運行存儲在CATALOG中的腳本(需要首先為RMAN創建恢復目錄):
??RMAN> RUN { EXECUTE SCRIPT backup_whole_db };
8.3? RMAN備份初級演練
?RMAN中所有的備份操作,都是通過BACKUP命令(指創建備份集方式的備份)進行的。
8.3.1? 整庫的備份
?RMAN> BACKUP DATABASE;?
執行上述命令后,將對目標數據庫中的所有數據文件進行備份,如果你對RMAN的返回信息看得足夠認真,你應該已經發現,該備份集生成了兩個備份片段:一個存儲數據文件,另一個存儲控制文件和SPFILE(服務器端初始化參數文件),都被保存到Oracle軟件的安裝目錄下,這是因為沒有為備份集指定存儲路徑,默認情況下就會存儲到Oracle軟件的安裝目錄中。
?RMAN> BACKUP DATABASE FORMAT 'f:\oracle\backup\bak_%U';?? 指定備份文件存放路徑,這個路徑必須是操作系統中已經存在的路徑。
查看創建的全庫備份,可以通過LIST命令來查看:
?RMAN> LIST BACKUP OF DATABASE;?
8.3.2? 表空間的備份
只要實例啟動并處于加載狀態,無論數據庫是否打開,都可以在RMAN中對表空間進行備份。
RMAN>?BACKUP?TABLESPACE?USERS;??
同樣,我們在使用BACKUP TABLESPACE命令也可以通過顯式指定FORMAT參數自定義備份片段名稱。
RMAN>?LIST?BACKUP? OF ?TABLESPACE?USERS;? --查看表空間的備份
RMAN>? DELETE ?BACKUPSET?10;???????????????????? --刪除沒有用的備份
執行DELETE命令時,默認情況下會給出是否確認刪除的提示信息,以避免誤操作。如果希望跳過提示的話(比如用后臺腳本方式執行,無處確認),那么可以在執行DELETE命令時附加NOPROMPT子句。
8.3.3? 數據文件的備份
有兩種方式指定數據文件的名稱(即數據文件詳細路徑)和FILE_ID。這兩項信息都可以從數據字典DBA_DATA_FILES中查詢,
SQL>? SELECT ?FILE_ID,FILE_NAME? FROM ?DBA_DATA_FILES;??
嘗試通過BACKUP DATAFILE命令備份USERS表空間的數據文件:
BACKUP?DATAFILE? 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF' ;??
在使用BACKUP DATAFILE命令時既可以指定DATAFILE名稱,也可以指定FILE_ID,比如上述執行的命令完全等價于BACKUP DATAFILE 4。
如果要查看指定數據文件的備份,可以用如下命令:
RMAN>?LIST?BACKUP? OF ?DATAFILE?n;?
注:n=指定的數據文件序號,如果需要備份的數據文件有多個,n=多個序號,中間以逗號分隔即可,指定的序號在備份中必須存在對應的數據文件,否則會報錯。
8.3.4? 控制文件的備份
手動執行備份命令
RMAN>?BACKUP? CURRENT ?CONTROLFILE;??
執行BACKUP命令時指定INCLUDE CURRENT CONTROLFILE子句
RMAN>?BACKUP? DATABASE ?INCLUDE? CURRENT ?CONTROLFILE;?
不僅限于DATABASE,執行BACKUP命令備份任何文件時都可以指定INCLUDE CURRENT CONTROLFILE子句,甚至是BACKUP CURRENT CONTROLFILE。執行BACKUP CURRENT CONTROLFILE INCLUDE CURRENT CONTROLFILE命令時,會備份幾次控制文件呢?
備份數據庫的第一個數據文件(SYSTEM表空間)會觸發控制文件的自動備份 RMAN>?BACKUP?DATAFILE?1;?
通過CONFIGURE命令將CONTROLFILE AUTOBACKUP置為ON。 RMAN>?CONFIGURE?CONTROLFILE?AUTOBACKUP? ON ;?
當AUTOBACKUP被置為ON時,RMAN做任何備份操作,都會自動對控制文件做備份。
如果要查看備份的控制文件,可以通過以下命令進行: RMAN>?LIST?BACKUP? OF ?CONTROLFILE;?
8.3.5? 歸檔文件的備份
? 只要擁有相應的歸檔日志文件,就能確保我們將數據庫恢復到備份之后的任意時刻。在RMAN中備份歸檔日志有以下兩種方式:
? 8.3.5.1? 利用BACKUP ARCHIVELOG命令備份
BACKUP ARCHIVELOG ALL 是指備份當前所有可訪問到的歸檔文件
BACKUP ARCHIVELOG UNTIL、SCN、TIME、SEQUENCE等參數靈活指定要備份的歸檔區間。
8.3.5.2? 執行BACKUP命令時指定PLUS ARCHIVELOG子句 ?
RMAN>?BACKUP? CURRENT ?CONTROLFILE?PLUS?ARCHIVELOG;???在備份控制文件之前首先對所有歸檔文件進行備份。
PLUS ARCHIVELOG的方式與BACKUP ARCHIVELOG的區別,BACKUP...PLUS ARCHIVELOG命令在備份過程中會依次執行下列步驟:
1)運行ALTER SYSTEM ARCHIVE LOG CURRENT語句對當前Redolog進行歸檔。
2)執行BACKUP ARCHIVELOG ALL命令備份所有已歸檔日志。
3)執行BACKUP命令對指定項進行備份。
4)再次運行ALTER SYSTEM ARCHIVE LOG CURRENT對當前Redolog歸檔。
5)對新生成的尚未備份的歸檔文件進行備份。
在完成歸檔日志文件備份后,我們需要刪除已備份過的歸檔文件(歸檔文件記錄下了數據庫進行的所有操作,如果您的數據庫操作頻繁而且量大,那歸檔文件的大小也是相當恐怖,備份后刪除釋放存儲空間是相當有必要的)。RMAN提供了DELETE ALL INPUT參數,加在BACKUP命令后,則會在完成備份后自動刪除歸檔目錄中已備份的歸檔日志。
完成備份之后,可以通過下列命令查看已備份的歸檔日志片段: RMAN>?LIST?BACKUP? OF ?ARCHIVELOG? ALL ;?
8.3.6? 初始化參數文件的備份
通常在備份控制文件時,RMAN也會自動備份服務器端的初始化參數文件,并置于控制文件相同的備份片段中,因此極少需要單獨對SPFILE進行備份,如果確實想單獨備份初始化參數文件直接使用BACKUP SPFILE命令即可: RMAN>?BACKUP?SPFILE;
? 服務器端的初始化參數文件雖然也是一個二進制文件,但用文本編輯工具都可以打開并瀏覽主要內容(只是不能修改)。
8.3.7? 對備份集進行備份
備份備份集使用BACKUP BACKUPSET命令,該命令并不是通過重新讀取數據文件的方式新建一個備份集,而是直接復制當前的備份集,生成一個與原備份一樣的新備份集。使用BACKUP BACKUPSET命令時可以選擇備份所有的備份集,也可以只備份特定的備份集(注:上述兩條均特指在磁盤上的備份集,用BACKUP BACKUPSET命令只能將備份集從磁盤備份到磁盤,或者從磁盤備份到磁帶,不能從磁帶備份到磁帶或磁帶備份到磁盤),在不指定輸出路徑的情況下,默認情況都是從磁盤創建備份到磁盤。
備份所有備份集: RMAN>?BACKUP?BACKUPSET? ALL ;?
備份指定的備份集: RMAN>?BACKUP?BACKUPSET?n;???? 提示:n=備份集ID,可以同時指定多個,相互間以逗號分隔即可。
如同備份歸檔文件一樣,BACKUP BACKUPSET命令也支持DELETE INPUT參數,DBA可以視實際的需要,在適當位置添加該參數,以釋放空間。
8.3.8? 綜述
查看備份基本都是用"LIST BACKUP OF備份項名稱"命令,
如果想自定義片段的話,可以在備份命令后加上FORMAT參數。
? 8.4? RMAN命令知多少
? 8.4.1? 顯示RMAN默認配置--SHOW命令
RMAN>?SHOW? ALL ;??
SHOW命令的使用也相當靈活,其后加上不同類型的配置參數,就可以顯示不同類型的配置,
RMAN>?SHOW?CONTROLFILE?AUTOBACKUP; ?
提示:配置項后面加了# default的表示該項為初始配置,未被修改過。
8.4.2? 列出備份信息--LIST命令
LIST命令用來查看通過RMAN生成的備份集、備份鏡像、歸檔文件等,命令用LIST+相應關鍵字即可。
列出數據庫中所有的備份信息: RMAN>?LIST?BACKUP;?
列出所有備份的控制文件信息: RMAN>?LIST?BACKUP? OF ?CONTROLFILE;?列出指定數據文件的備份信息: RMAN>?LIST?BACKUP? OF ?DATAFILE? 'F:\ORACLE\ORADATA\JSSBOOK\SCOTT_TBS01.DBF' ;?? 或?? RMAN>?LIST?BACKUP? OF ?DATAFILE?5;?
注:DATAFILE序號可以通過動態性能視圖V$DATAFILE或數據字典DBA_DATA_FILES中查詢。
列出所有備份的歸檔文件信息: RMAN>?LIST?BACKUP? OF ?ARCHIVELOG? ALL ;?
列出指定表空間的備份信息: RMAN>?LIST?COPY? OF ?TABLESPACE? 'SYSTEM' ;?
列出某個設備上的所有信息: RMAN>?LIST?DEVICE?TYPE?DISK?BACKUP;?
列出數據庫當前所有歸檔: RMAN>?LIST?ARCHIVELOG? ALL ;?
列出所有無效備份: RMAN>?LIST?EXPIRED?BACKUP;?
? 8.4.3? 刪除備份--DELETE命令
DELETE命令用于刪除RMAN備份記錄及相應的物理文件。當使用RMAN執行備份操作時,會在RMAN資料庫(RMAN Repository)中生成RMAN備份記錄,默認情況下RMAN備份記錄會被存放在目標數據庫的控制文件中,如果配置了恢復目錄(Recovery Catalog),那么該備份記錄也會被存放到恢復目錄中。
RMAN中的DELETE命令就是用來刪除記錄(某些情況下并非刪除記錄,而是打上刪除標記),以及這些記錄關聯的物理備份片段。
刪除過期備份。當使用RMAN命令執行備份操作時,RMAN會根據備份冗余策略確定備份是否過期。
RMAN>? DELETE ?OBSOLETE;? 刪除無效備份。首先執行CROSSCHECK命令核對備份集,如果發現備份無效(比如備份對應的數據文件損壞或丟失),RMAN會將該備份集標記為EXPIRED狀態。
要刪除相應的備份記錄,可以執行DELETE EXPIRED BACKUP命令: RMAN>? DELETE ?EXPIRED?BACKUP;?
刪除EXPIRED副本, RMAN>? DELETE ?EXPIRED?COPY;?
刪除特定備份集, RMAN>? DELETE ?BACKUPSET?19;?
刪除特定備份片, RMAN>? DELETE ?BACKUPPIECE? 'd:\backup\DEMO_19.bak' ;?
刪除所有備份集, RMAN>? DELETE ?BACKUP;?
刪除特定映像副本, RMAN>? DELETE ?DATAFILE?COPY? 'd:\backup\DEMO_19.bak' ;?
刪除所有映像副本, RMAN>? DELETE ?COPY;?
在備份后刪除輸入對象, RMAN>?BACKUP?ARCHIVELOG? ALL ? DELETE ?INPUT;?? RMAN>? DELETE ?BACKUPSET?22?FORMAT?=? "d:\backup\%u.bak" ? DELETE ?INPUT;
8.4.4? 報表顯示--REPORT命令
REPORT命令主要是用于當前備份信息的分析,如哪些備份已經過期,哪些文件該備份,哪些備份不可用,哪些備份可以刪除之類的。
REPORT命令特別提供了一個SCHEMA關鍵字,可以用來查看數據庫的模式信息(注意此模式非用戶的模式喲),比如某個時間段的數據庫結構,不過,使用這些功能的前提就是必須首先擁有足夠的備份,不然使用REPORT命令得出的結果恐怕也滿足不了你的需求啊。
查看7天前數據庫的模式: RMAN>?REPORT? SCHEMA ? AT ? TIME ? 'SYSDATE-7' ;?
查看模式信息必須連接到catalog數據庫。
查看所有需要備份的文件: RMAN>?REPORT?NEED?BACKUP;??
查看指定表空間是否需要備份: RMAN>?REPORT?NEED?BACKUP?TABLESPACE?SYSTEM;?
查看過期備份: RMAN>?REPORT?OBSOLETE;?
8.4.5? 執行檢查--CROSSCHECK命令
CROSSCHECK命令用來檢查備份或歸檔物理文件的狀態,如果物理文件存在,并且控制文件(或恢復目錄)中有匹配記錄,則標記該對象的狀態為AVAILABLE(有效),如果文件已經不存在了,則標記該對象狀態為EXPIRED(無效)。
CROSSCHECK命令并不會主動刪除文件(也確實沒有這個功能),它只是修改控制文件中對應記錄的狀態標志,因此如果想刪除那些EXPIRED的記錄,還是得手動通過DELETE EXPIRED命令進行。
檢查所有歸檔文件: RMAN>?CROSSCHECK?ARCHIVELOG? ALL ;?
提 示:當操作系統環境變量NLS_LANG指定為中文SIMPLIFIED CHINESE_CHINA時,執行CROSSCHECK命令檢查歸檔,如果結果顯示"對歸檔日志的驗證失敗",但你又確定該文件存在,別著急,這其實是Oracle 10g版本中的一個bug,驗證歸檔文件顯示的結果是反著的,如果顯示驗證失敗說明驗證是成功的,反倒是提示驗證成功的話你就要小心了,說明驗證失敗了。這不是CROSSCHECK命令自身的問題,而是Oracle中英文翻譯的問題,設置NLS_LANG為AMERICAN_AMERICA,在英文環境下檢查顯示一切正常。
檢查所有備份集: RMAN>?CROSSCHECK?BACKUP;?
8.4.6? 修改狀態--CHANGE命令
CHANGE命令可以用來修改備份文件或歸檔文件的狀態,不是指物理文件,而是這些文件在控制文件(或恢復目錄)中對應記錄的狀態,狀態有兩種:AVAILABLE(可用)和UNAVAILABLE(不可用)。
修改指定備份集狀態為UNAVAILABLE: RMAN>?CHANGE?BACKUPSET?n?UNAVAILABLE;?
提示:n為歸檔文件序號,可以通過LIST ARCHIVELOG ALL或查詢V$ARCHIVED_LOG獲取。當然你也可以指定歸檔文件詳細路徑。
修改指定表空間的備份集為UNAVAILABLE: RMAN>?CHANGE?BACKUP? OF ?TABLESPACE?USERS?UNAVAILABLE;?
修改指定歸檔文件狀態為UNAVAILABLE: RMAN>?CHANGE?ARCHIVELOG?LOGSEQ=n?UNAVAILABLE;?
如果將指定對象狀態修改為可用,執行上述命令時將關鍵字UNAVAILABLE改為AVAILABLE即可。
與CROSSCHECK命令不同,CHANGE命令附帶了DELETE子句,配合使用能夠在修改記錄狀態的同時直接刪除物理文件,刪除某個歸檔文件: RMAN>?CHANGE?ARCHIVELOG?LOGSEQ=n? DELETE ;?
8.4.7? 綜述
命令記不住注意看RMAN的提示信息,
比如想查看已經備份的歸檔,只記得要用LIST命令查看,后面應該加什么參數全忘了,沒關系,那就先執行LIST命令好了:
RMAN>?LIST;??
RMAN>?LIST?BACKUP? OF ;
RMAN>?LIST?BACKUP? OF ?ARCHIVELOG?;??
RMAN>?LIST?BACKUP? OF ?ARCHIVELOG? ALL ;??
如果你連RMAN中有哪些命令都忘記了,沒關系,隨便輸入個字母再按回車鍵試試:
- RMAN-01009:?syntax?error:?found? "identifier" :? ?
- expecting?one? of :?"allocate,? alter ,?backup,? ?
- beginline,?blockrecover,?catalog,?change,? connect ,? ?
- copy,? convert ,? create ,?crosscheck,?configure,?duplicate,? ?
- debug,? delete ,? drop ,?exit,?endinline,?flashback,?host,? ?
- {,?library,?list,?mount,? open ,?print,?quit,?recover,? ?
- register,?release,? replace ,?report,?renormalize,?reset,? ?
- restore,?resync,?rman,?run,?rpctest,? set ,?setlimit,?sql,? ?
- switch,?spool,?startup,?shutdown,?send,?show,?test,? ?
- transport,?upgrade,?unregister,?validate"?
8.5? RMAN備份演練進階篇
8.5.1? 是否選擇增量備份
如果數據庫運行于非歸檔模式下,那么你只能在數據庫干凈關閉(以NORMAL、IMMEDIATE、TRANSACTIONAL方式關閉)的情況下才能進行一致性的增量備份,如果數據庫運行于歸檔模式下,那既可以在數據庫關閉狀態進行,也可以在數據庫打開狀態進行備份。
8.5.1.1? 增量備份選項
建立增量備份實質就是在執行BACKUP命令時指定一個參數INCREMENTAL LEVEL=n,增量備份可以創建兩個級別,用整型數字0…n表示(n最大不超過4),從0級開始,所有增量備份都必須先創建0級備份。0級備份相當于數據庫的完整備份。
需要注意,通過BACKUP DATABASE也是創建數據庫的完整備份,但這種的完全備份并不等同于增量備份中的0級備份(雖然都是數據庫的完整備份),因為常規的完全備份中不包含增量備份策略,并不支持在其基礎上創建增量備份集。
在創建增量備份時,既可以對整庫進行備份,也可以僅對表空間甚至數據文件級創建增量備份。
建立增量級別0的全庫備份: RMAN>?BACKUP?INCREMENTAL? LEVEL =0? DATABASE ;?
為數據文件user01.dbf建立增量級別1的備份: RMAN>?BACKUP?INCREMENTAL? LEVEL =1?DATAFILE?'F:\ORAHOME1 \ORADATA\JSSWEB\?USERS01.DBF';?
為表空間USERS建立增量級別1的備份: RMAN>?BACKUP?INCREMENTAL? LEVEL =1?TABLESPACE?USERS;?
8.5.1.2? 增量備份類型
RMAN提供了兩種增量備份類型:DIFFERENTIAL(差異)和CUMULATIVE(累積),這兩種增量類型在創建備份集時的算法是不一樣的。默認情況下RMAN創建的增量備份是DIFFERENTIAL方式,如果要建立CUMULATIVE方式的增量備份,需要在執行BACKUP命令時顯式指定。
以CUMULATIVE增量備份方式創建數據庫完整備份: RMAN>?BACKUP?INCREMENTAL? LEVEL =1?CUMULATIVE? DATABASE ;?
8.5.1.3? 增量備份注意事項
在9i及之前的版本中,不管是否是增量備份,RMAN在執行備份時都需要先將所有數據塊全部讀入內存,檢查每一個數據塊頭的SCN信息,并與增量備份的父備份集相比較來確定塊是否被修改過。如果發現塊被修改過,則該塊所在的數據文件都要重新備份(是的,檢查是在塊一級,但備份是數據文件級)。由此可知,除非你的系統修改非常頻繁(修改太過頻繁的系統是否還有必要創建增量備份,這也是個問題),或者I/O設備效率驚人(我是說,驚人的慢),不然增量備份只是節省了存儲空間,既不能減少備份時間,也不能達到提高備份效率的目的,甚至還有可能導致備份時間更長(因為多了數據塊檢查的操作)。
在10g中Oracle提供了一個新的特性:塊修改跟蹤(Block Change Tracking)。啟用塊修改跟蹤后,RMAN不用再去掃描數據文件中的每一個塊了,直接通過塊修改跟蹤文件就可以獲取哪些塊發生了修改的信息。
可通過下列語句啟用塊修改跟蹤: SQL>? ALTER ? DATABASE ?ENABLE?BLOCK?CHANGE?TRACKING?USING?FILE '/LOACTION/ TRK_FILENAME' ;?
如果使用了OMF特性(Oracle-Managed Files),Oracle會自動創建塊修改跟蹤文件。
通過下列語句禁用塊修改跟蹤: SQL>? ALTER ? DATABASE ?DISABLE?BLOCK?CHANGE?TRACKING;?
通過下列語句查詢是否啟用塊修改跟蹤: SQL>? SELECT ?STATUS? FROM ?V$BLOCK_CHANGE_TRACKING;?
需要提醒一句,務必要認識到,雖然備份時間可能減短,并且備份集大小可能減小,但是進行恢復操作時,所需花費的時間有可能會增加,因為數據庫恢復時不得不讀取多個備份集才能完成恢復操作。
8.5.2? 是否使用RMAN備份集的保留策略
在通過RMAN創建的備份片段中,由于備份文件也是由RMAN創建和維護,所以手工刪除并不明智,并且RMAN也提供了備份保留策略,合理制訂,由RMAN自動刪除過舊的備份文件更加安全也更加方便。
RMAN中提供了兩種備份保留策略:基于時間和基于冗余數量的備份保留策略。
8.5.2.1? 基于時間的備份保留策略
就是你希望數據庫最早能恢復到幾天前。比如將恢復時間段設置為7,那么RMAN所保留的備份就是可以保證你將數據庫恢復到一周內任何時刻下的那些文件。設置基于時間的備份保留策略可以通過CONFIGURE命令: RMAN>?CONFIGURE?RETENTION?POLICY? TO ?RECOVERY?WINDOW? OF ?n?DAYS;? 注:n=大于0的正整數。
執行該命令后,RMAN將始終保留那些將數據庫恢復到n天前的狀態時需要用到的備份,比如,恢復時間段被設置為7天,那么各個數據文件的備份必須滿足如下條件: SYSDATE?-?BACKUP? CHECKPOINT ? TIME ?>=?7? 任何不滿足上述條件的備份都將被RMAN廢棄并可通過DELETE OBSOLETE命令刪除。
控制文件中記錄保存時間有可能對備份保留策略影響!
對于在NOCATALOG下創建的備份,RMAN的備份集信息都是保存在目標端控制文件中,不過需要注意的是,Oracle數據庫的控制文件并不是無限擴展,其中能夠保存的記錄也是有限的,對于RMAN的備份信息來說,控制文件中保存的這部分信息受制于初始化參數:CONTROL_FILE_RECORD_KEEP_TIME。初始化參數CONTROL_FILE_RECORD_KEEP_TIME用來指定記錄在控制文件中的最少保存時間,以天為單位,默認值為7。也就是說默認情況下備份集信息最短會在控制文件中保存7天,超過7天以后,如果控制文件由于空間不足(控制文件中并不僅僅只存儲備份集信息)需要重用記錄,那么超出7天的記錄可能會被自動覆蓋,在重用記錄時它并不管你在RMAN中設置的備份保留時間是多久(控制文件在Oracle數據庫中的地位那是相當高的)。
因此對于基于時間的備份保留策略,一般建議CONTROL_FILE_RECORD_ KEEP_TIME初始化參數值不小于你在RMAN中設置的備份保留時間。
另外,CONTROL_FILE_RECORD_KEEP_TIME初始化參數也有可能對基于冗余數量的備份策略造成影響,只不過冗余數量無法直接與時間作對比,因此在設置值時,DBA只能視實際情況,根據備份時創建的備份集可能占用的空間來估計初始化參數CONTROL_FILE_RECORD_KEEP_TIME的參數值了。
當前控制文件中分配的空間中,可存儲記錄和已存儲記錄數,可以通過查詢視圖V$CONTROLFILE_RECORD_SECTION獲取。
8.5.2.2? 基于冗余數量的備份保留策略
基于冗余數量實質上是某個數據文件以各種形式(包括備份集和鏡像復制)存在的備份的數量。如果某個數據文件的冗余備份數量超出了指定數量,RMAN將廢棄最舊的備份。
基于數量的備份保留策略也是通過CONFIGURE命令設置: RMAN>?CONFIGURE?RETENTION?POLICY? TO ?REDUNDANCY?n;? n=大于0的正整數。
DBA通過下列命令設置成不采用任何備份保留策略: RMAN>?CONFIGURE?RETENTION?POLICY? TO ?NONE;?
如果不設置任何備份保留策略,使用REPORT OBSOLETE和DELETE OBSOLETE命令時也不會有任何匹配的記錄,不過REPORT OBSOLETE和DELETE OBSOLETE命令也支持REDUNDANCY和RECOVERY WINDOW參數,參數值的對應規則與CONFIGURE命令配置備份保留策略完全相同,因此如果你決定將顯示和刪除過期的命令寫在腳本中定期執行的話,不通過備份保留策略,而是直接通過REPORT和DELETE命令本身實現這一點也是可行的。
8.5.2.3? 根據備份策略維護備份集
?
?
?
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
