如下腳本是我在項目工做中使用的備份腳本,腳本都是本身寫的。但在使用過程當中,感受還有提供空間,我這我的有點懶,因此想用將腳本「開源」出來的方式督促本身完善這一套腳本。你們若是對此腳本有什麼建議,隨時能夠提出來你們一塊兒提升。sql
此套腳本能夠實現對oracle數據庫實現全備份和增量備份。主要由rman_level0.cmd和rman_level1.cmd組成。
其中,rman_level0.cmd引用rman_level0.rcv做爲rman命令輸入,rman_level1.cmd引用rman_level1.rcv做爲rman命令輸入。數據庫
此套腳本使用的目錄結構以下:
其中,segmentfault
rman_level0.batwindows
rman target / CMDFILE 'D:\backup\rman_backup\scripts\rman_level0.rcv' LOG D:\backup\rman_backup\log\level0_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
rman_level0.rcvoracle
run { sql 'alter system archive log current'; allocate channel c1 type disk; backup as compressed backupset incremental level 0 format 'D:\backup\rman_backup\data\level0_%T_%t_s%s_p%p' database plus archivelog format 'D:\backup\rman_backup\archlog\archlog_%T_t%t_s%s_p%p' delete input; backup format 'D:\backup\rman_backup\cntrfile\controlfile_%T_s%s_p%p' current controlfile; release channel c1; crosscheck backup; delete noprompt obsolete; crosscheck archivelog all; } exit;
rman_level1.cmdspa
rman target / CMDFILE 'D:\backup\rman_backup\scripts\rman_level1.rcv' LOG D:\backup\rman_backup\log\level1_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
rman_level1.rcv日誌
run { sql 'alter system archive log current'; allocate channel c1 type disk; backup as compressed backupset incremental level 1 format 'D:\backup\rman_backup\data\level1_%T_%t_s%s_p%p' database plus archivelog format 'D:\backup\rman_backup\archlog\archlog_%T_t%t_s%s_p%p' delete input; backup format 'D:\backup\rman_backup\cntrfile\controlfile_%T_s%s_p%p' current controlfile; release channel c1; crosscheck backup; delete noprompt obsolete; crosscheck archivelog all; } exit;
目前日期字符串是使用從date和time命令的輸出中截取須要的字符,組成須要的字符串。code
第1種狀況,當time在0-9時之間時,字符串輸出以下:orm
C:\Users\YangJia>echo %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%t ime:~6,2% 20140119_ 10802
第2中狀況,當time在10-23之間時,字符串輸出以下:ip
C:\Users\YangJia>echo %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%t ime:~6,2% 20140119_230953
這個時候問題就出現了,當運行腳本時屬於第一種狀況,腳本會認爲LOG參數在"_"以後就結束了,致使最終生成的日誌文件名出現不完整的狀況。
解決此問題有兩個思路,一是將多出來的空格去掉,二是讓cmd認爲腳本並非從空格處就結束 了。
如下針對兩種思路給出方法:
第一種思路:
將log文件名使用%filename%變量替換,設置%filename%變量以前,對日期格式進行判斷,而後設置%filename%內容:
set logfile=level0_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log if "%time:~0,1%" == " " ^ set logfile=level0_%date:~0,4%%date:~5,2%%date:~8,2%_0%time:~1,1%%time:~3,2%%time:~6,2%.log
這部分解決有參考http://stackoverflow.com/questions/1192476/windows-batch-script-format-date-and-time
rman中刪除無效(expired)備份和archivelog的方式通常步驟是:
1. crosscheck backup &crosscheck archivelog all
2. delete expired backup;
3. delete expired archivelog;
若是將以上操做加入到腳本中,無效(expired)備份和archivelog會被自動清理掉,這樣可能就會在不知情的狀況下致使丟失recovery window中的片斷,致使recovery window不完整。
若是不加入備份腳本,在有無效(expired)備份和歸檔日誌的狀況下,就會出現備份archivelog失敗致使整個備份腳本運行失敗,可能會致使歸檔日誌不能自動清除將磁盤空間佔滿。
綜合以上兩種利弊,比較好的方式是:在出現丟失備份或archivelog的狀況下,通知管理員處置,手工處理以後備份腳本運行恢復正常。即便真的有archivelog丟失,在管理員已知曉的狀況下,能夠規避對恢復窗口的影響。