14.Oracle10g服務器管理恢復--RMAN備份(練習21.22.23)
練習21:創建恢復管理器的整體拷貝
在本練習中,將生成一個關于整個PRACTICE數據庫的全部數據塊的備份,其中包括控制文件,將會在數據庫打開和關閉時分別進行整理數據庫的備份。如果沒有將目標數據庫設置為ARCHIVELOG模式,則必須在數據庫加載但沒有打開時進行備份操作。在練習的過程中,將講解執行整體數據庫備份的基本命令,當運行該腳本時,屏幕上輸出將與list命令所得的結果相對應。
步驟一:生成RMAN打開的數據庫備份腳本
在本任務中將要在數據庫打開時進行備份操作,下面實現的腳本與上一個練習的腳本基本相同,只有一個例外,數據庫是打開的而不是關閉的:
2 allocate channel dl type disk;
3 backup incremental level=0 database
4 format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
5 tag = 'WHOLE_INC0';
6 }
-
第1行:backup命令必須包含在run命令中,Run命令必須在同一行中緊跟一個左花括號。Run命令標明了作為一個單元運行的代碼段,所有在花括號中包含的命令組成了命令單元;
- 第2行:備份使用通道從數據文件向備份介質拷貝數據塊,給在運行單元中需要的備份通道分配一個名稱;
-
第3行:backup命令確定了計劃保護的數據庫文件內容,在這一行中,將要為整個PRACTICE數據庫備份數據塊,當備份SYSTEM表空間時,RMAN包括了一個當前控制文件的備份,Backup database命令以第5行的分號作為結束;
-
第4行:format關鍵字告訴backup命令將備份片文件放置在何處以及備份片的名稱是什么。本行語句通知RMAN在D:\oracle\CODE\chap12目錄生成一個文件,如果沒有制定format,RMAN將以%U命名備份片并將其保存在$ORACLE_HOME/database目錄下;
-
第5行:Tag可以提供容易辨認的名稱,以便在RMAN部署中識別備份。雖然可以通過備份集的數據自編號查找一個制定的備份集,但是tag有助于更簡單地管理備份,Tag可以重用,如果再次運行該備份腳本,則有兩個備份集都有WHOLE_INC0標記;
-
第6行:這個右花括號與第1行的左花括號相匹配,這個括號標志著run命令的結束,所有在run命令中的命令編譯并作為一個單元來執行。
這個腳本最有魅力的地方是:它如此簡潔!只需要指定RMAN去備份數據庫,RMAN會自動查詢目標數據庫的控制文件為備份的數據文件生成一個列表,并在備份集中生成存儲數據塊的文件。RMAN知道需要拷貝那些塊并忽略那些不需要的塊。
步驟二:運行RMAN打開的數據庫備份腳本
連接到目標數據庫PRACTICE和目錄數據庫RCAT后,執行前面任務中的備份數據庫腳本:
當腳本運行的時候,將會有很多RMAN的消息,下面的一些消息是備份時出現的輸出結果,一些重要的輸出消息用紅色邊框標示出來:
這個輸出顯示了下面幾個重要的問題:
- Sid=140 當在PRACTICE數據庫上分配了通道來執行備份時,連接的會話id是140;
-
Startging incremental level 0 datafile backupset 該備份是一個增量級別為0的備份,所有數據文件中全部使用的數據塊將拷貝到其中一個備份片中;
-
Piece handle= D:\oracle\CODE\chap12\db_PRACTICE_9_1_713135460這個文件是實際包含了整個PRACTICE數據庫數據塊級備份的文件。在format語句中應用的替代變量用于這個文件名(%d數據庫名=PRACTICE, %s備份集數=9, %p備份片編號=1,%t備份時間=713135460);
- Elapsed time:00:00:55 備份使用為55秒;
- Including current controlfile in backupset;Including current SPFILE in backupset 當前的控制文件與參數文件一起被拷貝另外一個備份集中,文件名稱為D:\oracle\CODE\chap12\db_PRACTICE_10_1_713135515;
步驟三:驗證RMAN打開的數據庫備份腳本
前面運行了備份操作,下面使用LIST命令來檢查已經運行的備份結果:
這個輸出提供了剛才生成備份的大量信息:
- List of backup sets 備份集鍵值是57, 該鍵值是這個RMAN備份運行的唯一表示。注意這個數字與實際運行備份所得到的輸出是一致的,備份在3月8日運行并完成,LV是備份的級別,0級備份包含了每個數據文件中所有使用過的數據塊;
- List of backup pieces 該備份集有兩個個備份片,包含了數據塊的實際操作系統文件是D:\oracle\CODE\chap12目錄下的db_PRACTICE_9_1_713135460和db_PRACTICE_10_1_713135515,RMAN腳本中format語句產生這個文件名;
- List of datafile included 列出了這個備份中包括的每個數據文件,LV列顯示了數據塊拷貝的級別,type則顯示該備份是一個增量文件備份,可以瀏覽每個數據文件備份的檢查點SCN值;
驗證備份工作的最后一個步驟就是在操作系統下,定位到D:\oracle\CODE\chap12目錄下,在這里將會有db_PRACTICE_9_1_713135460和db_PRACTICE_10_1_713135515的備份片文件,所有使用過的數據文件塊和整個控制文件分別包含在這兩個個文件中。
數據塊文件的大小為457M。請思考:所有數據文件的總和大約是810M,那么如何將810M大小的文件壓縮到只有457M的文件中呢?依據是只有使用過的數據塊才拷貝到備份片中。假定有20M的索引表空間,因為只需要存儲少量的索引,所以只可能用20-50個數據塊,而表空間其他的數據塊沒有使用。因此,當RMAN只拷貝該數據文件中使用過的數據塊,這就是RMAN如何在備份文件中節約空間的原因。
步驟四:運行RMAN關閉的數據庫備份腳本
當控制文件加載但數據庫沒有打開時,可以用RMAN來備份關閉的數據庫。如果數據庫完整地關閉了,則所有數據文件都在頭部包含了一個一致的SCN值,在數據文件備份期間,這個數據文件一致的SCN將保存在RMAN備份的控制文件中,如下所示:
2 startup mount;
3 run {
4 allocate channel dl type disk;
5 allocate channel d2 type disk;
6 backup database incremental 0
7 format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
8 tag = 'WHOLE_INC0_CLOSED';
9 }
10 alter database backup controlfile to 'D:\oracle\CODE\tmp\backup.ctl' reuse;
11 alter database open;
- 第1行 在備份一個關閉的數據庫之前,該數據庫必須要關閉,在RMAN提示符下,可以執行shutdown和startup等數據庫控制命令;
- 第2行 在運行任何RMAN備份命令時,必須將數據庫的控制文件加載,因為所有的數據庫模式信息都保存在目標控制文件中,同時,RMAN備份操作在該控制文件中進行存儲,所以目標控制文件必須能被目標實例打開;
- 第4-5行 在這個備份過程中,RMAN將為備份打開兩個通道,每個通道在目標數據庫上創建一個會話,并在磁盤上打開一個備份片。多個通道允許RMAN以并行方式執行數據塊拷貝操作,使用多個通道使RMAN提高向磁盤或磁帶的輸出速度;
- 第7-8行:注意,FORMAT和TAG關鍵字的順序不同,在backup命令中,可以交換這兩個關鍵字的順序;
- 第10行 在RMAN提示符下,可以運行其他數據庫控制命令,在這一行中,將一個控制文件的備份拷貝保存在備份目錄下,這個alter database命令與RMAN的backup命令不同,因為這個控制文件的拷貝沒有記錄到目標數據庫控制文件或目錄表中;
- 第11行 當完成備份后,打開數據庫。
為了運行剛才生成的備份腳本,啟動RMAN并連接到目標數據庫PRACTICE和目錄數據庫RCAT上,使用@標識符運行剛才創建的腳本。
當運行完成這個關閉數據庫的備份腳本后,可以使用list命令來查看備份集編號、備份片和備份的文件,尤其注意的是,一個備份命令生成兩個備份集和兩個備份片,原因是該備份分配了兩個通道。
注意這個輸出與步驟二的輸出基本相同,不同的是這里生成了兩個備份集并寫入到各自的備份中。
簡而言之,已經為備份PRACTICE數據庫中的所有數據文件以及當前的控制文件生成了RMAN備份腳本可以運行該腳本并觀察其輸出結果,然后用RMAN LIST命令、用SQL查詢目錄數據庫并檢查操作系統上的文件來驗證備份的結果。
練習22:創建恢復管理器的增量式備份
前面講述的數據文件備份功能都需要拷貝整個數據文件或數據文件中所有使用過的數據塊,對于向PRACTICE這樣小型的數據庫,拷貝整個文件或者所有數據塊都不會占用很多空間、花費很長時間,然而,很少有類似于PRACTICE這樣小的數據庫。有大量數據文件的大型數據庫的備份需要很長時間并占用大量空間,通常情況下,數據庫的大量數據在兩次備份之間保持不變。Oracle已經提供只拷貝最近修改過的數據塊,即數據塊級的增量備份,只要需要,就可以用基本的增量級別為0的備份和需要的后續級別的增量備份一起還原與恢復數據庫,因為不需要重復備份那些沒有更改的數據塊,所以在增量級別備份中生成備份片將節省大量的空間。
在上一個練習中,數據庫在打開狀態下為整個PRACTICE數據庫以及控制文件生成了一個增量級別為0的基本備份,在本練習中,將生成一個累積增量備份級為1的備份,接著將要建立一個增量級別為2的備份。級別為1的備份將拷貝自級別0備份以來所有更改過的數據塊,而級別2的備份將拷貝所有自級別1備份以來所有更改過的數據塊。
步驟一:生成RMAN增量備份腳本
下面代碼包括的命令將對整個PRACTICE數據庫執行差異增量備份:
2 allocate channel dl type disk;
3 backup
4 incremental level = 1 cumulative
5 database
6 format 'D:\oracle\CODE\chap12\db_%d_%s_%p_%t'
7 tag = 'WHOLE_INC1';
8 }
上面的命令與本章前面給出的腳本非常相似,除了tag名稱和備份片文件名的format不同外,還有一個不同點,就是這個腳本包括了一個通知RMAN數據文件的備份是一個累積增量級別1的備份。
步驟二:生成RMAN增量備份腳本
與前面的過程類似,連接到目標數據庫PRACTICE和目錄數據庫上執行備份操作:
當執行b_whole_inc1.rcv時,這個備份需要占用相同的時間,但其備份片文件卻要小得多,這是因為包含了更改過的數據字典的數據塊很少,也沒有SCOTT表,TINA.DATE_LOG中只插入幾行記錄。
步驟三:生成RMAN增量備份腳本
再次使用list命令來檢查備份的結果并檢查操作系統以確認備份片文件是否存在,是否看到哪里有一個樣例模板?這個命令的輸出除了一下部分外,其他都與它們的備份命令的輸出命令相同:
- 鍵值和備份片名稱不同
- Incremental列的數值不同
步驟四:運行另一個RMAN增量備份腳本
在討論RMAN歸檔日志備份之前,需要運行另一個類似被練習的備份,運行增量級別為2的備份。為了完成這個任務,生成一個名為b_whole_inc1.rcv文件的拷貝文件b_whole_inc2.rcv,打開這個文件并將所有的1修改成2。
例如:在b_whole_inc2.rcv中:
- Incremental=1修改為incremental=2
- Tag=’WHOLE_INC1’修改為tab=’WHOLE_INC2’
練習23:創建恢復管理器的歸檔日志備份
當PRACTICE數據庫運行時,會在歸檔路徑下產生歸檔日志文件,這些文件絕對需要保護,否則就不能將數據庫恢復到過去某個時間點或當前時間狀態。前面練習介紹了如何以用戶管理的方法管理這些歸檔文件的備份,那如何使用RMAN來管理這些至關重要的文件呢?可以使用BACKUP ARCHIVELOG命令可以將這些歸檔日志文件拷貝到備份集的一個備份片中。當使用RMAN備份這些文件時,可以告訴RMAN通知日志序列范圍或日志生成的時間范圍等限制條件來選擇需要備份的文件或者將他們全部拷貝到一個備份集中。
RMAN也允許對這些文件執行強制管理,作為數據庫的操作,重做生成并存儲在歸檔日志文件中。有些情況,這些文件會占滿磁盤,RMAN的一個DELETE INPUT選項可以從磁盤上刪除已經拷貝過的歸檔日志文件。
步驟一:創建RMAN歸檔日志備份腳本
只要簡單地創建一個RMAN命令來備份歸檔日志,RMAN可以完成備份歸檔文件工作。
2 allocate channel d1 type disk;
3 sql "ALTER SYSTEM ARCHIVE LOG CURRENT";
4 backup archivelog all
5 format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t';
6 }
在命令中定義了需要備份歸檔日志的路徑、磁帶或磁盤,然后可以有選擇地確定當前聯機的重做日志文件是否已經歸檔,最后通知RMAN拷貝所有的歸檔日志到一個備份集的備份片中。
步驟二:運行RMAN歸檔日志備份腳本
連接到目標數據庫PRACTICE和目錄數據庫上運行該腳本:
在這個腳本執行過程中,會得到由RMAN產生的輸出消息,這些消息顯示了備份片的名稱以及正在備份歸檔序列。
步驟三:驗證RMAN備份腳腳本
運行LIST沒命令檢查v$表,檢查該文件輸出路徑:
這個命令列出所有剛才為歸檔日志文件所創建的備份。如果生成大量的備份,則輸出結果會滾屏輸出,顯示拷貝了的歸檔日志序列的序列號以及每個日志文件的SCN域。列出這些歸檔備份后,需要檢查操作系統的文件,在目錄D:\oracle\CODE\chap12中保存備份輸出所產生的備份片文件。
RMAN的部署
前面了解了如何方便進行增量和歸檔日志備份,現在討論如何這些增量置于一個示例規劃中,這個示例規劃包括每日數據文件、控制文件以及歸檔日志的備份策略。當部署增量備份策略時,需要平衡一旦數據庫失效后備用資源進行恢復所需的時間。一個稱為標準的備份情況需要在周末進行增量級別為0的備份,然后在整個星期內,需要進行不同的級別1或級別2的備份,這個每周循環可以使每一周都有一個基準增量備份以及沒周內少量的增量備份。例如:可以在數據庫的活動處于低谷是進行備份工作:
- 星期天 清晨 0基備份(運行b_whole_inc0.rcv腳本)
- 星期一 清晨 2基備份(運行b_whole_inc2.rcv腳本)
- 星期二 清晨 2基備份(運行b_whole_inc2.rcv腳本)
- 星期三 清晨 2基備份(運行b_whole_inc2.rcv腳本)
- 星期四 清晨 1基備份(運行b_whole_inc1.rcv腳本)
- 星期五 清晨 2基備份(運行b_whole_inc2.rcv腳本)
- 星期六 清晨 2基備份(運行b_whole_inc2.rcv腳本)
有這個累積增量備份部署,既可以至少三個備份集來還原與恢復工作。例如,如果在星期六中午發生了數據庫失效,則RMAN restore命令需要星期天、星期四和星期六的備份集。為了運行累積增量備份,需要在本練習描述的腳本的incremental后增加CUMULATIVE關鍵字。
當為歸檔日志文件部署備份策略是,必須絕對確保已經獲得了每個備份的歸檔日志文件至少一個(最好多個)拷貝。如果必須清理歸檔日志的目的地防止寫滿文件系統以及中斷數據庫操作。RMAN有一個比較謹慎的部署選項DELETE INPUT由此可以完成兩個任務。歸檔日志備份策略在刪除輸入之前已經為每個歸檔日志做了三份拷貝,該腳本如何為PRACTICE數據庫實現每個歸檔日志文件的三份拷貝:
- 在新的備份策略的前一兩天內對PRACTICE數據庫應用ARCHIVELOG ALL選項以實現為所有已經存在的歸檔日志文件做基準備份(運行b_archive);
- 每天為包括最近兩天的重做所有已經存在的歸檔日志文件做備份(運行b_archive_2days.rcv);
- 每天為包括從五天以前到前兩天的重做日志文件進行備份(運行b_archvie_delete3.rcv);
這個策略需要確保由數據庫創建的每個歸檔日志文件都至少三份拷貝,在執行這個歸檔日志備份策略時需要下面兩個腳本:b_archive_2days.rcv和b_archvie_delete3.rcv。
2 allocate channel d1 type disk;
3 sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
4 backup archivelog
5 form time 'SYSDATE-2'
6 format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t';
7 }
當為磁盤分配了一個通道并歸檔了當前聯機重做日志后,備份自兩天以前生成的所有歸檔日志。運行該腳本,則每天將備份前兩天的歸檔日志文件,這個腳本中沒有刪除備份過的歸檔日志。
2 allocate channel d1 type disk;
3 sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
4 backup archivelog
5 form time 'SYSDATE-3' until time 'SYSDATE-2'
6 format 'D:\oracle\CODE\chap12\ar_%d_%s_%p_%t'
7 delete input;
8 }
當運行archive_delete3.rcv時,DELETE INPU將通知RMAN在成功備份之后刪除歸檔日志文件,當這個腳本運行后,查看操作系統的歸檔存放路徑,被刪除的文件將不再出現在磁盤上。數據庫每天生成3個重做日志,每天的下午一點運行兩個備份腳本:b_archive_2days.rcv和b_archvie_delete3.rcv。
- 星期二的備份 備份集1包括歸檔日志1、2、3。沒有歸檔日志被刪除;
- 星期三的備份 備份集2包括歸檔日志1-6。沒有歸檔日志被刪除;
- 星期四的備份 備份集3包括歸檔日志4-9。備份集4拷貝了歸檔日志1-3并從磁盤上將其刪除;
- 星期五的備份 備份集5包括歸檔日志7-12。備份集拷6貝了歸檔日志4-6并從磁盤上將其刪除;
- 星期六的備份 備份集7包括歸檔日志10-15。備份集8拷貝了歸檔日志7-9并從磁盤上將其刪除;
如果需要查看一個特定的歸檔日志文件備份多少次,可以用如下方式的RMAN list命令獲得:
- At 1:00 /every:Sunday cmd /c <path>\b_whole_inc0.bat
- At 1:00 /every:Monday cmd /c <path>\b_whole_inc2.bat
- At 1:00 /every:Tuesday cmd /c <path>\b_whole_inc2.bat
- At 1:00 /every:Wednesday cmd /c <path>\b_whole_inc2.bat
- At 1:00 /every:Thursday cmd /c <path>\b_whole_inc1.bat
- At 1:00 /every:Friday cmd /c <path>\b_whole_inc2.bat
- At 1:00 /every:Saturday cmd /c <path>\b_whole_inc2.bat
- At 2:00 cmd /c <path>\b_archive_2days.bat
- At 2:30 cmd /c <path>\b_arhive_delete3.bat

浙公網安備 33010602011771號