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%
タスクスケジューラへの登録手順
- タスクスケジューラを開く(
taskschd.mscを実行)
- 右ペイン「タスクの作成」をクリック
- 「全般」タブ → ユーザーアカウントをOracleサービス実行ユーザーに設定、「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
- 「トリガー」タブ → 「新規」→ スケジュール設定(例:毎日01:00)
- 「操作」タブ → 「新規」→ プログラム/スクリプトに
C:\oracle\scripts\rman_backup.bat を指定
- 「条件」タブ → AC電源接続時のみ実行のチェックを外す(サーバーの場合)
- 「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_HOME・ORACLE_SID・PATH をシェルスクリプト内で明示的に export する必要があります。手動実行では動くのにcronでは動かない場合は、ほぼ環境変数の問題です。
RMACATALOGとRCVCATはどちらを使うべきですか?▼
小規模〜中規模の環境では rman target /(コントロールファイル管理)で十分です。複数DBを管理する場合や、長期の履歴管理が必要な場合はリカバリカタログ(RMAN CATALOG)の使用を検討してください。カタログを使うと、コントロールファイルが失われてもバックアップ情報が残ります。
バックアップが正しく取れているか確認する方法は?▼
3段階で確認することをおすすめします。
- ログ確認:
grep -i error /home/oracle/logs/rman_backup_*.log
- RMAN確認:
LIST BACKUP SUMMARY; で最新バックアップを確認
- 整合性検証:
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回は実際にリストアを試して、手順と時間を把握しておくことをおすすめします。