【Oracle】RMANバックアップを自動化する方法|cron・タスクスケジューラ完全解説

【Oracle】RMANで自動バックアップをスケジューリングする方法|cronとの連携 Oracle

OracleのRMANバックアップを毎日手動で実行しているなら、今すぐ自動化を検討してください。手動運用はヒューマンエラーのリスクがあり、深夜や休日のバックアップが抜け落ちる原因になります。

この記事では、RMANスクリプトの作成からcron(Linux/Unix)・タスクスケジューラ(Windows)による定期実行まで、実務で使える設定を体系的に解説します。バックアップの検証・ログ管理・エラー対処まで含めた実践的な内容です。

この記事で学べること

  • RMANバックアップスクリプト(.rcv)の作成と主要オプション
  • 実行用シェルスクリプト(.sh)の作成とORACLE_HOME等の環境変数設定
  • crontabへの登録方法と曜日・時刻指定パターン
  • Windowsタスクスケジューラでの自動化手順
  • バックアップログの確認・管理・ローテーション
  • メール通知の設定(cronのMAILTO)
  • バックアップ検証(CROSSCHECK / VALIDATE)の組み込み
  • よくあるエラーと対処法
スポンサーリンク

事前確認:RMANバックアップの前提条件

自動化の前に、以下の点を確認しておきましょう。

確認項目 確認方法 備考
ARCHIVELOGモード SELECT log_mode FROM v$database; ARCHIVELOGであること
バックアップ先の空き容量 df -h /backup(Linux) DBサイズの2〜3倍を確保
ORACLE_HOME / ORACLE_SID echo $ORACLE_HOME シェルスクリプトに正しく設定する
ログ出力先ディレクトリ mkdir -p /home/oracle/logs 事前にディレクトリを作成しておく

注意:NOARCHIVELOGモードのDBでオンラインバックアップを実行するとエラーになります。ALTER DATABASE ARCHIVELOG; でモードを変更してから実施してください(再起動が必要)。

RMANスクリプトの作成(.rcv)

RMANに渡す命令をテキストファイル(.rcv拡張子が慣例)として作成します。

基本構成:データベース全体バックアップ

/home/oracle/scripts/rman_backup.rcv
RUN {  -- チャンネル割り当て(並列数を設定)  ALLOCATE CHANNEL c1 DEVICE TYPE DISK;  -- データベース全体バックアップ(圧縮あり)  BACKUP AS COMPRESSED BACKUPSET DATABASE    FORMAT '/backup/db_%d_%T_%U.bkp'    TAG 'FULL_BACKUP';  -- アーカイブログのバックアップ(バックアップ後に削除)  BACKUP ARCHIVELOG ALL DELETE INPUT    FORMAT '/backup/arch_%d_%T_%U.bkp';  -- コントロールファイルとSPFILEのバックアップ  BACKUP CURRENT CONTROLFILE    FORMAT '/backup/ctrl_%d_%T_%U.bkp';  BACKUP SPFILE    FORMAT '/backup/spf_%d_%T_%U.bkp';  -- 古いバックアップを削除(保持ポリシー: 7日間)  DELETE NOPROMPT OBSOLETE;  RELEASE CHANNEL c1;}

フォーマット文字列の意味

フォーマット 展開される値
%d データベース名 ORCL
%T 日付(YYYYMMDD) 20260312
%U 一意識別子(8文字) 0a1b2c3d
%s バックアップセット番号 42
%p ピース番号 1

保持ポリシー(RETENTION POLICY)の設定

RMAN設定で保持ポリシーを事前に設定しておくと、DELETE OBSOLETEが自動的に適切な世代を判断してくれます。

RMAN – 保持ポリシー設定
-- 7日間保持する場合CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;-- または最新3世代を保持する場合CONFIGURE RETENTION POLICY TO REDUNDANCY 3;-- 設定確認SHOW ALL;

実行用シェルスクリプトの作成(Linux/Unix)

cronから実行するシェルスクリプトを作成します。環境変数を必ず明示的に設定するのがポイントです。cronの実行環境は通常のシェルと異なり、.bash_profileが読み込まれないためです。

/home/oracle/scripts/rman_backup.sh
#!/bin/bash# ============================================# Oracle RMANバックアップ実行スクリプト# ============================================# Oracle環境変数(自身の環境に合わせて変更)export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1export ORACLE_SID=ORCLexport PATH=$ORACLE_HOME/bin:$PATHexport NLS_LANG=American_America.AL32UTF8# ログファイル設定LOG_DIR=/home/oracle/logsLOG_FILE=${LOG_DIR}/rman_backup_$(date +%Y%m%d_%H%M%S).logSCRIPT=/home/oracle/scripts/rman_backup.rcv# ログディレクトリがなければ作成mkdir -p ${LOG_DIR}# 開始ログecho "[$(date)] RMANバックアップ開始" >> ${LOG_FILE}# RMAN実行rman target / cmdfile=${SCRIPT} log=${LOG_FILE}EXIT_CODE=$?# 終了ログif [ ${EXIT_CODE} -eq 0 ]; then  echo "[$(date)] RMANバックアップ 正常終了" >> ${LOG_FILE}else  echo "[$(date)] RMANバックアップ 異常終了 (exit code: ${EXIT_CODE})" >> ${LOG_FILE}fiexit ${EXIT_CODE}

スクリプトに実行権限を付与します。

bash
chmod +x /home/oracle/scripts/rman_backup.sh# 手動実行でエラーがないか確認/home/oracle/scripts/rman_backup.shecho $?  # 0なら正常終了

ポイント:cronへの登録前に必ず手動実行でテストしてください。cronと手動実行では環境が異なるため、手動で成功してもcronで失敗するケースがあります(主に環境変数の問題)。

cronによるスケジューリング設定(Linux/Unix)

crontabの編集

oracleユーザーでcrontabを編集します。

bash
# oracleユーザーのcrontabを編集crontab -e# rootでoracleユーザーのcronを設定する場合crontab -u oracle -e

cron設定パターン一覧

cron設定 実行タイミング 用途
0 1 * * * 毎日 01:00 日次フルバックアップ
0 2 * * 0 毎週日曜 02:00 週次フルバックアップ
0 */6 * * * 6時間ごと アーカイブログバックアップ
0 1 * * 1-5 平日 01:00 平日のみバックアップ
0 0 1 * * 毎月1日 00:00 月次バックアップ

crontab設定例(推奨構成)

crontab(oracleユーザー)
# エラー発生時にメール通知(メールサーバーが使える場合)MAILTO="dba@example.com"SHELL=/bin/bash# 毎日深夜1時にフルバックアップ0 1 * * * /home/oracle/scripts/rman_backup.sh# 6時間ごとにアーカイブログをバックアップ(別スクリプトで管理する場合)0 */6 * * * /home/oracle/scripts/rman_archlog.sh

MAILTO の設定:cronのMAILTO変数にメールアドレスを設定すると、スクリプトが標準出力に出力した場合やエラー終了した場合にメールが送信されます。メールサーバーが使えない環境では空にして(MAILTO="")、代わりにスクリプト内でsendmailやcurl(Slackなど)を使った通知を実装します。

Windowsタスクスケジューラでの自動化

Windowsサーバーで動作するOracleの場合は、タスクスケジューラを使います。

バッチファイルの作成

C:\oracle\scripts\rman_backup.bat
@echo offREM ============================================REM Oracle RMANバックアップ実行バッチREM ============================================REM 環境変数設定SET ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1SET ORACLE_SID=ORCLSET PATH=%ORACLE_HOME%\bin;%PATH%REM ログファイル(日付付き)SET LOG_DIR=C:\oracle\logsSET DATESTAMP=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%SET LOG_FILE=%LOG_DIR%\rman_backup_%DATESTAMP%.logIF NOT EXIST %LOG_DIR% MKDIR %LOG_DIR%REM RMAN実行rman target / cmdfile=C:\oracle\scripts\rman_backup.rcv log=%LOG_FILE%IF %ERRORLEVEL% NEQ 0 (  ECHO [ERROR] RMANバックアップ失敗 >> %LOG_FILE%  EXIT /B 1)ECHO [SUCCESS] RMANバックアップ完了 >> %LOG_FILE%

タスクスケジューラへの登録手順

  1. タスクスケジューラを開く(taskschd.mscを実行)
  2. 右ペイン「タスクの作成」をクリック
  3. 「全般」タブ → ユーザーアカウントをOracleサービス実行ユーザーに設定、「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
  4. 「トリガー」タブ → 「新規」→ スケジュール設定(例:毎日01:00)
  5. 「操作」タブ → 「新規」→ プログラム/スクリプトに C:\oracle\scripts\rman_backup.bat を指定
  6. 「条件」タブ → AC電源接続時のみ実行のチェックを外す(サーバーの場合)
  7. 「OK」→ パスワードを入力して保存

バックアップ検証の組み込み

バックアップを取るだけでなく、定期的に復旧可能かどうかの検証も自動化しましょう。

CROSSCHECK と VALIDATE

RMAN – バックアップ検証スクリプト
RUN {  ALLOCATE CHANNEL c1 DEVICE TYPE DISK;  -- バックアップファイルの存在確認(物理チェック)  CROSSCHECK BACKUP;  -- バックアップの整合性検証(論理チェック)  VALIDATE BACKUPSET ALL;  -- 期限切れバックアップを削除  DELETE NOPROMPT EXPIRED BACKUP;  RELEASE CHANNEL c1;}
コマンド 内容 結果
CROSSCHECK BACKUP RMANカタログとバックアップファイルの整合性確認 存在しないものをEXPIREDに更新
VALIDATE BACKUPSET バックアップブロックの整合性チェック 破損があればエラー
RESTORE DATABASE VALIDATE 実際のリストア手順をシミュレーション リストア可能かをDRYRUNで確認

ログの管理とローテーション

古いログの自動削除(cron + find)

ログが際限なく増えないよう、定期的に古いログを削除する設定も追加しましょう。

crontab(30日以上前のログを削除)
# 毎日04:00に30日以上前のRMANログを削除0 4 * * * find /home/oracle/logs -name "rman_backup_*.log" -mtime +30 -delete# 30日以上前のバックアップファイル自体も削除(保持ポリシーと合わせて設定)0 5 * * * find /backup -name "*.bkp" -mtime +30 -delete

RMANのアラートログ確認

RMAN – バックアップ一覧確認
-- 最近のバックアップ一覧LIST BACKUP SUMMARY;-- 直近7日分のバックアップLIST BACKUP COMPLETED AFTER 'SYSDATE-7';-- バックアップの詳細(ファイルパスも表示)LIST BACKUP OF DATABASE;

よくあるエラーと対処法

エラー 原因 対処法
RMAN-04004
rman: not found
cronでPATHが通っていない シェルスクリプトでORACLE_HOMEとPATHを明示的にexportする
RMAN-06059
archivelog not found
アーカイブログが存在しない・すでに削除済み CROSSCHECK ARCHIVELOG ALL; を実行してEXPIREDを更新
ORA-19502
write error
バックアップ先のディスク空き容量不足 df -h で空き確認、古いバックアップを削除
RMAN-03009
channel failure
DB接続失敗(DBが起動していない等) ORACLE_SIDを確認、DBが起動しているか sqlplus / as sysdba で確認
ログファイルが生成されない ログディレクトリが存在しない mkdir -p /home/oracle/logs でディレクトリを作成

よくある質問(FAQ)

cronで実行するとRMANが動かないのですが?

最も多い原因は環境変数が設定されていないことです。cronは .bash_profile.bashrc を読み込まないため、ORACLE_HOMEORACLE_SIDPATH をシェルスクリプト内で明示的に export する必要があります。手動実行では動くのにcronでは動かない場合は、ほぼ環境変数の問題です。

RMACATALOGとRCVCATはどちらを使うべきですか?

小規模〜中規模の環境では rman target /(コントロールファイル管理)で十分です。複数DBを管理する場合や、長期の履歴管理が必要な場合はリカバリカタログ(RMAN CATALOG)の使用を検討してください。カタログを使うと、コントロールファイルが失われてもバックアップ情報が残ります。

バックアップが正しく取れているか確認する方法は?

3段階で確認することをおすすめします。

  1. ログ確認grep -i error /home/oracle/logs/rman_backup_*.log
  2. RMAN確認LIST BACKUP SUMMARY; で最新バックアップを確認
  3. 整合性検証VALIDATE BACKUPSET ALL; で定期的に論理検証
バックアップ中に本番DBのパフォーマンスに影響しますか?

影響します。特にフルバックアップはI/Oが増加します。軽減策として、①深夜など業務負荷が低い時間帯に実行する、②BACKUP ... DURATION 4:00 PARTIAL MINIMIZE LOAD; でバックアップ時間を延ばしてI/Oを分散する、③CONFIGURE CHANNEL DEVICE TYPE DISK RATE 100M; で帯域を制限する、などが有効です。

まとめ

RMANバックアップの自動化に必要な手順を振り返りましょう。

ステップ 作業内容 ポイント
①事前確認 ARCHIVELOGモード・容量・環境変数 ARCHIVELOG必須
②RMANスクリプト .rcvファイルを作成(DB全体・アーカイブ・制御ファイル) DELETE OBSOLETEで古いバックアップを自動削除
③シェルスクリプト .shファイルにORACLE_HOME・PATH等を明示export cron環境変数問題の解決がカギ
④cron登録 crontabでスケジュール設定・MAILTO設定 手動実行で動作確認してから登録
⑤定期検証 CROSSCHECK / VALIDATE で定期的にバックアップ確認 取れているだけでなく復旧可能かを確認

バックアップの自動化は「仕組みを作ったら終わり」ではなく、定期的なログ確認とリストアテストが重要です。特に年に1回は実際にリストアを試して、手順と時間を把握しておくことをおすすめします。