web-dev-qa-db-ja.com

CRONおよびRMANバックアップ

RMANバックアップはCRONジョブを介して実行しますが、CRONですぐに使えるメールを見つけてほぼを実行します。 RMAN出力を/ dev/nullに送信できるため、電子メールは送信されません。RMANが正常に実行された場合に望ましい結果になりますが、RMANジョブでエラーが発生した場合は、標準出力全体が必要です。レビューのためにDBAチームにメールで送信されます。障害が発生した場合にのみ標準出力をcronにパイプ処理するbashシェルスクリプトでRMANスクリプトをラップできると思いますが、これを行うより良い方法はありますか?

要約する:

  1. エラーの発生時に標準出力をメールにパイプして(エラーが存在しない場合は標準出力を無視して)、cron内のデフォルトのメール機能を使用できますか?
  2. そうでない場合は、RMANバックアップスクリプトをロジックでラップして、エラーが発生した場合にのみシェルスクリプトからの出力が返されるようにする必要がありますか?
  3. これを達成するために私が見ない、またはオンラインで見つけることができない別のアプローチはありますか?

これがすでに尋ねられた場合、私の謝罪。私は多くの1回限りの質問とシナリオを見つけましたが、希望する結果と正確に一致していると感じたものはありません。

ありがとう!

2
John Eisbrener

バックアップを実行するbashスクリプト(RMAN、datapump、およびxtrabackupとMySQLのダンプを同様の方法で作成)を作成し、それを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

次に、ローカルファイルから必要なメールのリスト(1行に1つ)をインポートします

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を変更する必要はありません。

このようにして、動作し、動作しないが件名にエラーがある場合にメールを受け取るので、簡単なメールルールで、興味のない成功したバックアップを非表示にして失敗をハイライト表示し、何かがうまくいかなかった場合は毎朝シンプルなカウントで表示できます。メールと一見が必要です。ログはサーバー上に保持されているので、そこで見つけることができます(ジョブに何かを追加して、数週間後に古いログを削除します)。

明らかに、このようなものを実装する方法はたくさんあり、それに合わせて変更する必要があります(そして、明確にするために、スクリプトから*たくさん*を切り取っています)。

3
user3629