CRON 和 RMAN 備份
我們通過 CRON 作業執行 RMAN 備份,但使用 CRON 找到開箱即用的電子郵件幾乎可以滿足我們的需求。我知道我們可以將 RMAN 輸出引導到 /dev/null,因此不會發送任何電子郵件,這對於任何成功執行 RMAN 來說都是期望的結果,但是如果 RMAN 作業遇到錯誤,我想要整個標準輸出通過電子郵件發送給 DBA 團隊進行審核。我懷疑我可以使用 bash shell 腳本包裝我的 RMAN 腳本,該腳本僅在發生故障時將標準輸出通過管道傳輸到 cron,但有更好的方法嗎?
總結一下:
- 如果發生錯誤,我可以通過管道將標準輸出發送到電子郵件(如果不存在錯誤則忽略標準輸出),以便我們可以在 cron 中使用預設郵件功能?
- 如果不是,我是否應該只用邏輯包裝我的 RMAN 備份腳本,以便在遇到錯誤時它只會返回 shell 腳本的輸出?
- 是否有另一種我看不到或無法在網上找到的方法來實現這一目標?
如果這已經被問到,我很抱歉。我發現了許多一次性的問題和場景,但我覺得沒有一個與我想要的結果完全匹配。
謝謝!
我編寫了一個 bash 腳本來執行備份(RMAN、datapump 以及以類似方式用於 MySQL 的 xtrabackup 和轉儲),然後從 cron 中呼叫它。這樣您就可以根據需要處理電子郵件。
所以一個簡單的 crontab 行是這樣的
00 18 * * 0-6 /dba/bin/rman.sh > /tmp/dba_rman_SID.log 2>&1
然後一切都在腳本中完成。
所以定義一些常見的變數,包括 RMAN,例如
export RMAN="${ORACLE_HOME}/bin/rman target /" ... etc etc
然後從本地文件中導入您想要的電子郵件列表(每行一個)
declare -a EMAILS readarray -t EMAILS < .emails.dat
然後定義幾個方便的過程,您可以稍後使用它們進行錯誤處理和電子郵件
abort_with_error() { echo echo "Error :" $1 echo echo "Error Code :" ${ERR} echo export SUBJECT="Error - ${SUBJECT}" send_email exit 1 } send_email() { echo echo "Sending logfile via email to the following :" echo for EMAIL in ${EMAILS[@]} do echo ${EMAIL} echo done for EMAIL in ${EMAILS[@]} do case $EMAIL in \#*) ;; *) ${MAILX} -s "${SUBJECT}" ${EMAIL} < ${LOG_FILE} ;; esac done }
現在主程序被打包以將其全部輸出到日誌文件。這是一個簡單的範例,但顯示了基本方法。
{ //add what you want your script to do here - can be many things for example: ${RMAN}<<EOF delete noprompt force obsolete; exit; EOF ERR=$? if [ ${ERR} -ne 0 ]; then abort_with_error "The RMAN delete obsolete backup step failed" fi echo "${JOB_NAME} ended at : $(date)" send_email } > ${LOG_FILE} 2>&1
調整 abort_with_error 和 send_email 過程以適合您的環境和需要。
這將調度程序與流程分開,因此如果您更新備份流程或獲得需要電子郵件的新團隊成員,則無需更改 cron。
這樣,您會收到一封電子郵件,如果它有效,如果它沒有,但主題中有錯誤,因此一個簡單的電子郵件規則可以隱藏無意義的成功備份並突出顯示失敗,並且每天早上簡單計數顯示是否有問題電子郵件,需要看看。由於日誌保存在伺服器上,您可以在那裡找到它(在工作中添加一些內容以在幾週後清理舊日誌)。
顯然有很多方法可以實現這樣的東西,你需要改變它以適應它(為了清楚起見,我已經從腳本中刪掉了很多的東西)。