Windows平臺下Oracle數據庫備份腳本

如下腳本是我在項目工做中使用的備份腳本,腳本都是本身寫的。但在使用過程當中,感受還有提供空間,我這我的有點懶,因此想用將腳本「開源」出來的方式督促本身完善這一套腳本。你們若是對此腳本有什麼建議,隨時能夠提出來你們一塊兒提升。sql

簡介

此套腳本能夠實現對oracle數據庫實現全備份和增量備份。主要由rman_level0.cmd和rman_level1.cmd組成。
其中,rman_level0.cmd引用rman_level0.rcv做爲rman命令輸入,rman_level1.cmd引用rman_level1.rcv做爲rman命令輸入。數據庫

此套腳本使用的目錄結構以下:
備份目錄結構
其中,segmentfault

  • archlog 存放歸檔日誌備份
  • cntrfile 控制文件備份
  • data 數據庫文件備份
  • log 備份日誌
  • scripts 備份腳本相關

腳本內容

全備腳本

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;

存在的問題及解決

rman log中日期字符串的問題

目前日期字符串是使用從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中刪除無效備份和archivelog的考慮

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丟失,在管理員已知曉的狀況下,能夠規避對恢復窗口的影響。

相關文章
相關標籤/搜索