1. 問題:
資料庫之備份工作大都是自動執行,但是執行結果是否成功,需要安排人員去檢查,有時疏忽忘記確認作業,致備份工作失敗仍不知道,等到有一天需要回復舊有資料的場合時,才發現找不到過去某段期間的備份資料,造成無法彌補之後果。
2. 改善:
2.1 設計一執行檔,功能為打開備份程式執行後產生之紀錄檔(log file),檢查該log file 內是否有備份程式成功完成;若備份工作失敗,隨即自動寄出備份失敗之email,若有發現其他錯誤,亦於email上註明錯誤訊息,通知相關負責人員,以便可以盡快及時對應。
2.2 上述檢查log file之結果,不論成功或失敗均寫入一個檢查結果紀錄檔案內,該記錄檔案出力,可以當作日後稽查時,提供說明對備份工作之檢查證明。
2.3 上述檢查結果每日寫入紀錄檔案內,翌月時自動更改為以該月份命名之記錄檔檔名
2.4排程自動寄出email,含每日自動確認結果,及每月初一寄出上月份之月份確認表
3.方法:
3.1設計bat 執行檔,讀取log file,若讀取之log檔內 沒有找到 " successfully completed " ,表示備份失敗,隨後自動寄出JOB備份失敗之警告信email給負責人員
3.2 確認log file檔名之日期是否正確?
3.3 今日系統月份是否大於log file 檔名之月份,
若是: 記錄檔名DMP_C.txt 改檔名為 xxx_YYYYMM.txt, 如”DMP_C_202403.txt”當作上月份之記錄檔案,並email 寄出上月份記錄之確認表。而原有DMP_C.txt因rename 後,已不存在,故當新的月份來時,會新增一txt檔,當作本月每日紀錄用 。
3.4 自動寄信所需之參數檔,於Bat內依據當日執行狀況作成
3.5 於Windows自動排程,設定為每日自動執行該bat檔
3.6 bat檔, email自動寄信程式,自動寄信之參數檔,置放於同一目錄內
4. 範例:
4.1 bat 設計內容如下
set /a Today = %date:~0,4%%date:~5,2%%date:~8,2%
if not exist G: (
net use G: \\10.XX.80.XX\e$\Datapump\XXX\Export\Dump /user:XXU\XXuser XX1234 /yes /persistent:NO
)
G:
rem ----STEP1 skip 6 log files, for getting the lastest F_Date log file
set r= NG
set logF=notfound log file
rem ----先跳開6筆較舊log,第七筆應最新,但若有重複Export場合,會取出第七筆以後最新log file
for /f "skip=6 delims=" %%A in ('dir /b /OD "G:\xxpack_XXX_XLIVE*.log" ') do (
set logF=%%A
CALL :FINDSucce %%A )
rem ----STEP 3 Today月份 GTR > LogFile 月份 ,then 寄出月份記錄確認表,及 rename to DMP_C_%logF:~17,6%.txt
D:
cd d:\XXX-IT\find_DMP_log
if %logF:~17,6% LSS 202008 (
pause ### ERROR lof file name : %logF:~17,6% is not normal
exit )
if %logF:~17,6% GTR a (
pause ### ERROR lof file name : %logF:~17,6% is not normal
exit )
if exist d:\XXX-IT\find_DMP_log\DMP_C_history\DMP_C_%logF:~17,6%.txt (
pause ### ERROR histoty month file DMP_C_%logF:~17,6%.txt is already exist
exit )
rem for 月份MAIL need apend 2, par records . for月份附檔 , echo. >> XXX.txt for換行
if %Today:~0,6% GTR %logF:~17,6% (
move DMP_C.txt d:\XXX-IT\find_DMP_log\DMP_C_history\
rename d:\XXX-IT\find_DMP_log\DMP_C_history\DMP_C.txt DMP_C_%logF:~17,6%.txt
type mail_par.txt > mail_par_WK.txt
echo. >> mail_par.txt
echo 2,D:\XXX-IT\find_DMP_log\DMP_C_history\DMP_C_%logF:~17,6%.txt >> mail_par.txt
CAll XXX_mail_ReadF.exe
type mail_par_WK.txt > mail_par.txt
)
rem ----STEP 4 出力DMP_C.txt。判斷log 是否成功? 失敗場合寄出 警告MAIL
rem for 警告MAIL need apend 0,,4 records , echo. >> X XX.txt for add new line to txt file
if %r% == OK (
echo %date% %time% DMP JOB OK, logFile= %logF% >> DMP_C.txt
) else (
echo %date% %time% DMP JOB NG, logFile= %logF% , need to check ! >> DMP_C.txt
type mail_par.txt > mail_par_WK.txt
echo. >> mail_par.txt
echo 0,[ Warning ] XXXPACK DB DMP job was unsuccessful-- sent >> mail_par.txt
echo 4,### ERROR--> logFile=%logF% is unsuccessful, 需調查! ### >> mail_par.txt
CAll XXX_mail_ReadF.exe
type mail_par_WK.txt > mail_par.txt
)
rem pause --4 final ---
exit
rem ----STEP2 findSTR of " successfully completed " in the lastest F_date log file
:FINDSucce
set r= NG
FOR /F " delims= tokens=1-13 " %%i in ('findstr /C:" successfully completed " "%logF%" ') do (
set r= OK )
exit /b %r% %logF% %errorlevel%
4.2 本例每日檢查紀錄檔出力之內容如下:
2024/2/24 週六 12:14:52.95 DMP JOB OK, logFile=LIVE_20240224.log
2024/2/25 週日 12:22:23.60 DMP JOB NG, logFile= LIVE_20240225.log, need to confirm !
2024/2/26 週一 12:14:52.95 DMP JOB OK, logFile=LIVE_20240226.log
2024/2/27 週二 12:14:50.75 DMP JOB OK, logFile=LIVE_20240227.log
2024/2/28 週三 12:17:26.31 DMP JOB OK, logFile=LIVE_20240228.log
----------------recorded by linct-----------------