RMAN(Recovery Manager)は Oracle が標準で提供するバックアップ・リカバリツールです。OS のファイルコピーと違い、RMAN はデータベースの内部情報を把握したうえでバックアップを取得するため、増分バックアップ・破損ブロックの検出・自動リカバリなど高度な機能が使えます。
また RMAN はバックアップの管理情報を制御ファイル(または別途設けたリカバリカタログ)に記録するため、どのバックアップがいつ取られたかを SQL で確認でき、保存期間の管理も自動化できます。
- RMAN の起動・接続・基本コマンドの使い方
- フルバックアップ(BACKUP DATABASE)の取り方
- 増分バックアップ(INCREMENTAL LEVEL 0/1)の仕組みと運用方法
- アーカイブログのバックアップと DELETE INPUT
- RESTORE DATABASE + RECOVER DATABASE でリカバリする手順
- VALIDATE でブロック破損を検出する方法
- RETENTION POLICY と CROSSCHECK / DELETE OBSOLETE でバックアップを管理する方法
前提:ARCHIVELOG モードの確認
RMAN でポイント・イン・タイム・リカバリ(特定時点へのリカバリ)をするには、データベースが ARCHIVELOG モードで動作している必要があります。NOARCHIVELOG モードでもフルバックアップは取れますが、障害時にバックアップ取得時点にしか戻せません。
-- 現在のモードを確認する SELECT log_mode FROM V$DATABASE; -- → NOARCHIVELOG または ARCHIVELOG -- ARCHIVELOG モードに変更する手順 -- 1. データベースを停止する(MOUNT モードで起動する) SHUTDOWN IMMEDIATE; STARTUP MOUNT; -- 2. ARCHIVELOG モードに変更する ALTER DATABASE ARCHIVELOG; -- 3. データベースを OPEN する ALTER DATABASE OPEN; -- 4. アーカイブ先を確認する SHOW PARAMETER log_archive_dest; -- log_archive_dest_1 に宛先ディレクトリが設定されていることを確認する -- 例: LOCATION=/u01/app/oracle/archive
RMAN の起動・接続・基本コマンド
# ローカル接続(OS 認証) rman target / # 接続文字列で接続する rman target sys/password@orcl # リカバリカタログを使う場合 rman target / catalog rman_catalog/rman_pw@catdb # RMAN プロンプトで基本確認コマンド RMAN> show all; -- 設定を表示する RMAN> list backup summary; -- バックアップの一覧を表示する RMAN> list backup of database; -- データベースバックアップを一覧表示する RMAN> list archivelog all; -- アーカイブログの一覧を表示する RMAN> report need backup; -- バックアップが必要なファイルを確認する RMAN> report obsolete; -- 不要になったバックアップを確認する
フルバックアップ(BACKUP DATABASE)
BACKUP DATABASE はデータベース全体をバックアップするコマンドです。FORMAT でバックアップピースのファイルパスを、TAG でラベルを指定できます。アーカイブログも合わせてバックアップするには PLUS ARCHIVELOG を付けます。
# 基本のフルバックアップ(高速バックアップ形式: バックアップセット)
BACKUP DATABASE
FORMAT '/backup/rman/%d_%T_%s_%p.bkp' -- %d=DB名, %T=日付, %s=セット番号, %p=ピース番号
TAG 'full_20260409';
# アーカイブログも一緒にバックアップして削除する
BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT
FORMAT '/backup/rman/%d_%T_%s_%p.bkp'
TAG 'full_with_arc';
# 圧縮バックアップ(ストレージ節約)
BACKUP AS COMPRESSED BACKUPSET DATABASE
FORMAT '/backup/rman/%d_%T_%s_%p.bkp';
# イメージコピー形式(OSファイルと同じ形式)
BACKUP AS COPY DATABASE
FORMAT '/backup/image/%d_%f';
-- イメージコピーは SWITCH TO COPY で即座に切り替えリカバリができる
# バックアップ完了後に検証する
BACKUP VALIDATE DATABASE; -- バックアップ可否を検証する(実際にはバックアップしない)
VALIDATE DATABASE; -- 既存のバックアップを検証する(破損チェック)
増分バックアップ(INCREMENTAL LEVEL 0/1)
増分バックアップは変更されたブロックのみをバックアップするため、フルバックアップに比べて取得時間とサイズを大幅に削減できます。LEVEL 0 が基準(フルバックアップに相当)で、LEVEL 1 が LEVEL 0 以降の変更分だけをバックアップします。
- 日曜: INCREMENTAL LEVEL 0(週次の基準バックアップ)
- 月〜土: INCREMENTAL LEVEL 1 CUMULATIVE(日曜以降の変更分を毎日バックアップ)
- 毎日: BACKUP ARCHIVELOG ALL DELETE INPUT(アーカイブログを毎日バックアップ)
# LEVEL 0 バックアップ(全ブロックをバックアップ・基準となる)
BACKUP INCREMENTAL LEVEL 0 DATABASE
FORMAT '/backup/rman/inc0_%d_%T_%s_%p.bkp'
TAG 'weekly_level0';
# LEVEL 1 差分バックアップ(前回の LEVEL 1 または LEVEL 0 以降の変更分)
BACKUP INCREMENTAL LEVEL 1 DATABASE
FORMAT '/backup/rman/inc1_%d_%T_%s_%p.bkp'
TAG 'daily_level1_diff';
# LEVEL 1 累積バックアップ(直前の LEVEL 0 以降の変更分すべて)
# 差分よりリストアが速い(適用するバックアップが LEVEL 0 + CUMULATIVE の2つで済む)
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE
FORMAT '/backup/rman/inc1c_%d_%T_%s_%p.bkp'
TAG 'daily_level1_cumul';
# Block Change Tracking(BCT)を有効にすると増分バックアップが高速化する
# 変更ブロックの位置をトラッキングするため全ブロックをスキャンしなくて済む
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING
USING FILE '/u01/app/oracle/bct/bct.dbf';
SELECT status, filename FROM V$BLOCK_CHANGE_TRACKING;
アーカイブログのバックアップと管理
# アーカイブログのみをバックアップする
BACKUP ARCHIVELOG ALL
FORMAT '/backup/rman/arc_%d_%T_%s_%p.bkp'
DELETE INPUT; -- バックアップ後にアーカイブログを削除する
# 特定の時間範囲のアーカイブログをバックアップする
BACKUP ARCHIVELOG FROM TIME 'SYSDATE-1' UNTIL TIME 'SYSDATE'
FORMAT '/backup/rman/arc_%d_%T_%s_%p.bkp'
DELETE INPUT;
# アーカイブログの残量確認(ディスクフルを防ぐ)
# V$RECOVERY_FILE_DEST: FRA(高速リカバリ領域)の使用状況
SELECT name, space_limit, space_used, space_reclaimable,
ROUND(space_used / space_limit * 100, 2) AS pct_used
FROM V$RECOVERY_FILE_DEST;
# FRA(高速リカバリ領域)を設定する
# すべてのバックアップとアーカイブログを一元管理できる
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/app/oracle/fast_recovery_area';
RESTORE DATABASE + RECOVER DATABASE によるリカバリ手順
データファイルが失われた場合やデータが破損した場合の復旧手順です。RESTORE でバックアップファイルを元の場所に戻し、RECOVER でアーカイブログを適用して最新の状態に戻します。
# 手順: データベース全体の完全リカバリ
# ① データベースを MOUNT モードで起動する(OPEN できない場合)
STARTUP MOUNT;
# ② バックアップからリストアする(データファイルを戻す)
RESTORE DATABASE;
# ③ アーカイブログを適用してリカバリする(最新状態に追いつける)
RECOVER DATABASE;
# ④ データベースを OPEN する
ALTER DATABASE OPEN;
# ポイント・イン・タイム・リカバリ(特定時点に戻す)
# 例: 誤ったDELETE が 2026-04-09 10:00 に実行された場合
RESTORE DATABASE UNTIL TIME "TO_DATE('2026-04-09 09:55', 'YYYY-MM-DD HH24:MI')";
RECOVER DATABASE UNTIL TIME "TO_DATE('2026-04-09 09:55', 'YYYY-MM-DD HH24:MI')";
ALTER DATABASE OPEN RESETLOGS; -- ポイント・イン・タイム後は必ず RESETLOGS
# SCN 指定リカバリ(Flashback Query で SCN を確認してから使う)
RESTORE DATABASE UNTIL SCN 12345678;
RECOVER DATABASE UNTIL SCN 12345678;
ALTER DATABASE OPEN RESETLOGS;
# 特定のデータファイルのみリカバリする(他のファイルは正常な場合)
RESTORE DATAFILE 5; -- データファイル番号 5 を復元
RECOVER DATAFILE 5; -- リカバリ
ALTER DATABASE DATAFILE 5 ONLINE; -- オンラインに戻す
VALIDATE でブロック破損を検出する
# データベース全体の論理・物理ブロック破損を確認する VALIDATE DATABASE; VALIDATE DATABASE CHECK LOGICAL; -- 論理チェックも含める(時間がかかる) # 特定のデータファイルを検証する VALIDATE DATAFILE 3; VALIDATE TABLESPACE users; # バックアップ自体が読めるか検証する(リストアはしない) RESTORE DATABASE VALIDATE; RESTORE ARCHIVELOG ALL VALIDATE; # 破損ブロックの結果を確認する(V$DATABASE_BLOCK_CORRUPTION) SELECT * FROM V$DATABASE_BLOCK_CORRUPTION; -- file#: データファイル番号 -- block#: 破損ブロック番号 -- blocks: 連続する破損ブロック数 -- corruption_type: FRACTURED(部分破損), CHECKSUM(チェックサム不一致)など # RMAN BLOCKRECOVER で破損ブロックのみをリカバリする BLOCKRECOVER CORRUPTION LIST; -- V$DATABASE_BLOCK_CORRUPTION の内容を復元する
RETENTION POLICY でバックアップ保存期間を管理する
# RETENTION POLICY: バックアップの保持方針を設定する # 方針①: 日数で管理する(7日以上経過したバックアップは不要とみなす) CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; # 方針②: 世代数で管理する(2世代分のバックアップを保持する) CONFIGURE RETENTION POLICY TO REDUNDANCY 2; # 保持方針を無効にする(すべてのバックアップを保持する) CONFIGURE RETENTION POLICY TO NONE; # 現在の設定を確認する SHOW RETENTION POLICY; # CROSSCHECK: RMAN の管理情報と実際のファイルを同期する # バックアップファイルが手動削除された場合などに実行する CROSSCHECK BACKUP; -- バックアップセットを確認する CROSSCHECK ARCHIVELOG ALL; -- アーカイブログを確認する # EXPIRED(ファイルが見つからない)になったバックアップをカタログから削除する DELETE EXPIRED BACKUP; DELETE EXPIRED ARCHIVELOG ALL; # OBSOLETE(保持方針に基づいて不要)なバックアップを削除する DELETE OBSOLETE; -- 確認なしで削除する REPORT OBSOLETE; -- 削除前に確認する DELETE NOPROMPT OBSOLETE; -- プロンプトなしで削除する(自動化スクリプト用) # バックアップ一覧と状態を確認する LIST BACKUP SUMMARY; LIST BACKUP OF DATABASE COMPLETED AFTER 'SYSDATE-7'; -- Status: A(Available)・X(Expired)・U(Unavailable)・D(Deleted)
バックアップスクリプトの自動化
#!/bin/bash
# rman_backup_daily.sh: 毎日の増分バックアップスクリプト
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
DATE=$(date +%Y%m%d)
LOG=/backup/log/rman_backup_${DATE}.log
rman target / <<EOF >> $LOG 2>&1
RUN {
# 増分バックアップ(LEVEL 1 累積)
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE
FORMAT '/backup/rman/inc1c_%d_%T_%s_%p.bkp'
TAG 'daily_inc1c_${DATE}';
# アーカイブログのバックアップと削除
BACKUP ARCHIVELOG ALL DELETE INPUT
FORMAT '/backup/rman/arc_%d_%T_%s_%p.bkp';
# 不要なバックアップを削除する
DELETE NOPROMPT OBSOLETE;
}
EXIT;
EOF
# 終了コードをチェックする
if [ $? -ne 0 ]; then
echo "RMAN backup FAILED on ${DATE}" | mail -s "RMAN BACKUP ERROR" dba@example.com
fi
まとめ
- RMAN の基本:フルバックアップは BACKUP DATABASE・アーカイブログは BACKUP ARCHIVELOG ALL DELETE INPUT。ARCHIVELOG モードでないとポイント・イン・タイム・リカバリができない
- 増分バックアップ:LEVEL 0(基準)+ LEVEL 1 CUMULATIVE(累積差分)の組み合わせが一般的。Block Change Tracking(BCT)を有効にすると増分バックアップが高速化する
- リカバリ手順:STARTUP MOUNT → RESTORE DATABASE → RECOVER DATABASE → ALTER DATABASE OPEN。ポイント・イン・タイム後は RESETLOGS が必要
- VALIDATE:VALIDATE DATABASE で物理・論理ブロック破損を検出できる。V$DATABASE_BLOCK_CORRUPTION の結果は BLOCKRECOVER で修復する
- バックアップ管理:RETENTION POLICY で保持期間を設定する。CROSSCHECK で RMAN カタログとファイルを同期し、DELETE EXPIRED / DELETE OBSOLETE で不要バックアップを削除する
バックアップファイルが壊れていないか定期的に VALIDATE で確認することが重要です。論理的なデータ破損への対応(誤更新・誤削除)には RMAN だけでなくOracle Flashback 完全ガイドやFlashback Data Archiveも合わせて検討してください。