【Oracle】RMAN 増分バックアップ完全ガイド|LEVEL 0/1・差分/累積・Block Change Tracking・週次戦略・リストアまで解説

【Oracle】RMAN 増分バックアップ完全ガイド|LEVEL 0/1・差分/累積・Block Change Tracking・週次戦略・リストアまで解説 Oracle

大規模な Oracle データベースで毎回フルバックアップを取得すると、処理時間もディスク容量も膨大になります。RMAN の増分バックアップを活用すれば、前回のバックアップ以降に変更されたデータブロックだけをバックアップでき、時間もストレージも大幅に節約できます。

本記事では、LEVEL 0(ベース)と LEVEL 1(増分)の違い差分増分(DIFFERENTIAL)と累積増分(CUMULATIVE)の使い分けBlock Change Tracking(BCT)による高速化週次バックアップ戦略の設計、そして増分バックアップからのリストア手順まで解説します。

この記事でわかること
・LEVEL 0(ベース)と LEVEL 1(増分)の違い
・差分増分(DIFFERENTIAL)と累積増分(CUMULATIVE)の違いと使い分け
・Block Change Tracking(BCT)で増分バックアップを高速化する方法
・増分更新バックアップ(RECOVER COPY + 増分マージ)
・週次/月次のバックアップローテーション戦略
・増分バックアップからのリストア・リカバリ手順
スポンサーリンク

増分バックアップの仕組み

種類 内容 バックアップ対象
フルバックアップ 全データブロックをバックアップ データベース全体(変更有無に関わらず)
LEVEL 0(増分ベース) 全データブロックをバックアップ(増分の起点) データベース全体(フルと同じだが増分チェーンの起点になる)
LEVEL 1(増分) LEVEL 0 以降に変更されたブロックのみバックアップ 変更されたデータブロックだけ
LEVEL 0 とフルバックアップの違い
バックアップの内容(全ブロック)は同じですが、LEVEL 0 は増分チェーンの起点として記録されます。LEVEL 1 は LEVEL 0 を起点として「何が変わったか」を計算するため、増分バックアップを使うなら最初に LEVEL 0 を取得する必要があります。フルバックアップ(INCREMENTAL なし)は増分の起点にはなりません。

LEVEL 0 / LEVEL 1 の基本コマンド

Shell(RMAN 増分バックアップ)
# RMAN に接続
rman target /

# LEVEL 0: 増分ベース(全データブロック)
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;

# LEVEL 1 差分増分(DIFFERENTIAL = デフォルト)
# 直前の LEVEL 0 または LEVEL 1 以降の変更分
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;

# LEVEL 1 累積増分(CUMULATIVE)
# 直前の LEVEL 0 以降の全変更分
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;
Shell(アーカイブログと制御ファイルも含める)
# 増分バックアップ + アーカイブログ + 制御ファイル
RMAN> BACKUP INCREMENTAL LEVEL 1
      DATABASE
      PLUS ARCHIVELOG DELETE INPUT;

# PLUS ARCHIVELOG: アーカイブログも一緒にバックアップ
# DELETE INPUT: バックアップ済みのアーカイブログを削除

差分増分(DIFFERENTIAL)vs 累積増分(CUMULATIVE)

項目 差分増分(DIFFERENTIAL) 累積増分(CUMULATIVE)
コマンド BACKUP INCREMENTAL LEVEL 1 DATABASE BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE
デフォルト デフォルト 明示指定が必要
バックアップ対象 直前の LEVEL 0 または LEVEL 1 以降の変更 直前の LEVEL 0 以降の全変更
バックアップサイズ 小さい(直前からの差分のみ) 日が経つほど大きくなる
リストア速度 遅い(全増分を順番に適用) 速い(LEVEL 0 + 最新 LEVEL 1 の 2 つだけ)
リストアに必要なファイル LEVEL 0 + 全 LEVEL 1(月〜金全部) LEVEL 0 + 最新の LEVEL 1 のみ
例(月曜〜金曜のバックアップ想定)
# 日曜: LEVEL 0(100GB)
# 月曜: LEVEL 1(日曜→月曜の変更 = 2GB)
# 火曜: LEVEL 1(月曜→火曜の変更 = 2GB)
# 水曜: LEVEL 1(火曜→水曜の変更 = 2GB)
# 木曜: LEVEL 1(水曜→木曜の変更 = 2GB)
# 金曜: LEVEL 1(木曜→金曜の変更 = 2GB)

# 【差分】金曜にリストアする場合:
# LEVEL 0 + 月 + 火 + 水 + 木 + 金 の 6 ファイルを適用

# 【累積】金曜のバックアップ:
# 日曜→金曜の全変更 = 10GB(日が経つほど大きい)
# 金曜にリストアする場合:
# LEVEL 0 + 金曜の LEVEL 1 の 2 ファイルだけで OK
使い分けの判断基準
バックアップ時間・サイズを最小化したい → 差分(DIFFERENTIAL)
リストア時間を最小化したい → 累積(CUMULATIVE)
実務では差分(デフォルト)が最も一般的です。ストレージに余裕があり、リストア速度を最優先する場合は累積を検討してください。

Block Change Tracking(BCT)で高速化する

増分バックアップでは「どのブロックが変更されたか」を特定する必要があります。デフォルトでは RMAN が全ブロックをスキャンして変更を検出しますが、Block Change Tracking(BCT)を有効にすると、変更されたブロックの位置を追跡ファイルに記録するため、スキャンが不要になり増分バックアップが大幅に高速化されます。

SQL(BCT の有効化)
-- BCT を有効化(追跡ファイルの場所を指定)
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING
    USING FILE '/oracle/bct/block_change_tracking.ctf';

-- BCT の状態を確認
SELECT filename, status, bytes/1024/1024 AS size_mb
FROM v$block_change_tracking;

-- BCT を無効化(必要な場合)
ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
項目 BCT なし BCT あり
変更ブロックの検出方法 全ブロックをスキャン 追跡ファイルを参照(スキャン不要)
増分バックアップ速度 遅い(全ブロック読み取り) 高速(変更ブロックだけ読み取り)
追加ディスク使用量 なし DB サイズの約 1%〜2%
前提条件 なし Enterprise Edition が必要
BCT は Enterprise Edition 専用
Block Change Tracking は Enterprise Edition でのみ利用可能です。Standard Edition では BCT なしで増分バックアップを使用しますが、全ブロックスキャンが発生するためフルバックアップとの速度差が小さくなります。

増分更新バックアップ(RECOVER COPY + 増分マージ)

Oracle 10g 以降の増分更新バックアップは、LEVEL 0 のイメージコピーに LEVEL 1 の増分をマージして、常に最新の「仮想フルバックアップ」を維持する方式です。リストア時に増分を順番に適用する必要がなく、最速のリカバリが可能です。

Shell(増分更新バックアップ)
# (1) 初回: LEVEL 0 のイメージコピーを作成
RMAN> BACKUP INCREMENTAL LEVEL 0
      AS COPY DATABASE
      TAG 'incr_update';

# (2) 日次: LEVEL 1 差分を取得し、イメージコピーにマージ
RMAN> RECOVER COPY OF DATABASE
      WITH TAG 'incr_update';
RMAN> BACKUP INCREMENTAL LEVEL 1
      FOR RECOVER OF COPY WITH TAG 'incr_update'
      DATABASE;

# 上記 2 コマンドを毎日実行すると:
# - 前日の LEVEL 1 がイメージコピーにマージされる
# - 新しい LEVEL 1 が取得される
# - イメージコピーは常に「前日の状態」に保たれる
増分更新バックアップの最大メリット
リストア時にイメージコピーを SWITCH DATABASE TO COPY するだけで「前日時点のデータベース」が即座に使用可能になります。増分を順番に適用する必要がないため、リカバリ時間が最も短い方式です。本番環境の RTO(目標復旧時間)が厳しい場合に最適です。

バックアップ戦略の設計例

戦略(1): 週次 LEVEL 0 + 日次 LEVEL 1(最も一般的)

曜日 バックアップ サイズ目安(DB 100GB 想定)
日曜 LEVEL 0(フルベース) 100 GB
月曜 LEVEL 1 差分 2〜5 GB
火曜 LEVEL 1 差分 2〜5 GB
水曜 LEVEL 1 差分 2〜5 GB
木曜 LEVEL 1 差分 2〜5 GB
金曜 LEVEL 1 差分 2〜5 GB
土曜 LEVEL 1 差分 2〜5 GB
合計(週) 約 112〜130 GB(フル毎日なら 700 GB)
Shell(週次戦略のスクリプト例)
#!/bin/bash
# backup.sh - 曜日に応じて LEVEL 0 / LEVEL 1 を切り替え

DOW=$(date +%u)  # 1=月曜 ... 7=日曜

if [ "$DOW" -eq 7 ]; then
    # 日曜: LEVEL 0
    rman target / <<EOF
BACKUP INCREMENTAL LEVEL 0 DATABASE
    PLUS ARCHIVELOG DELETE INPUT;
EOF
else
    # 月〜土: LEVEL 1 差分
    rman target / <<EOF
BACKUP INCREMENTAL LEVEL 1 DATABASE
    PLUS ARCHIVELOG DELETE INPUT;
EOF
fi

戦略(2): 増分更新バックアップ(最速リカバリ)

Shell(日次スクリプト: 毎日同じコマンドを実行)
#!/bin/bash
# incr_update.sh - 毎日実行

rman target / <<EOF
RECOVER COPY OF DATABASE
    WITH TAG 'daily_incr';
BACKUP INCREMENTAL LEVEL 1
    FOR RECOVER OF COPY WITH TAG 'daily_incr'
    DATABASE;
BACKUP ARCHIVELOG ALL DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
EOF

cron / タスクスケジューラでの自動化は「RMAN バックアップを自動化する方法」を参照してください。

増分バックアップからのリストア・リカバリ

Shell(差分増分からのリストア)
# (1) データベースを MOUNT モードにする
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;

# (2) リストア(LEVEL 0 を展開)
RMAN> RESTORE DATABASE;

# (3) リカバリ(LEVEL 1 を順番に適用 + アーカイブログ適用)
RMAN> RECOVER DATABASE;
# RMAN が自動的に LEVEL 0 → LEVEL 1 群 → アーカイブログの順に適用

# (4) データベースを OPEN
RMAN> ALTER DATABASE OPEN RESETLOGS;
Shell(増分更新バックアップからのリストア: 最速)
# イメージコピーに SWITCH するだけで即座に復元
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;

# イメージコピーをデータファイルとして使用
RMAN> SWITCH DATABASE TO COPY;

# アーカイブログでリカバリ(イメージコピー以降の変更を適用)
RMAN> RECOVER DATABASE;

RMAN> ALTER DATABASE OPEN RESETLOGS;
RMAN はリカバリに必要なバックアップを自動選択する
RECOVER DATABASE を実行すると、RMAN が自動的に最適な LEVEL 0 + LEVEL 1 + アーカイブログを選択して適用します。手動でファイルを指定する必要はありません。

増分バックアップの確認

Shell(バックアップ一覧の確認)
RMAN> LIST BACKUP SUMMARY;

-- 増分レベル別のバックアップ一覧
RMAN> LIST BACKUP OF DATABASE;

-- 不要なバックアップの削除
RMAN> DELETE NOPROMPT OBSOLETE;
SQL(バックアップサイズの確認)
-- 増分レベル別のバックアップサイズ
SELECT incremental_level,
       COUNT(*) AS backup_count,
       ROUND(SUM(bytes)/1024/1024/1024, 2) AS total_gb,
       TO_CHAR(MAX(completion_time), 'YYYY-MM-DD HH24:MI') AS latest
FROM v$backup_datafile
WHERE incremental_level IS NOT NULL
GROUP BY incremental_level
ORDER BY incremental_level;

よくある質問

QLEVEL 0 とフルバックアップの違いは何ですか?
Aバックアップの内容(全ブロック)は同じですが、LEVEL 0 は増分チェーンの起点として RMAN に記録されます。LEVEL 1 は LEVEL 0 を基準に「何が変わったか」を計算するため、増分バックアップを使うなら LEVEL 0 が必須です。BACKUP DATABASE(INCREMENTAL なし)のフルバックアップは増分の起点にはなりません。
QLEVEL 0 を取り直す頻度はどのくらいが適切ですか?
A一般的には週 1 回です。LEVEL 1 が日々累積するため、週 1 回 LEVEL 0 を取り直すことで LEVEL 1 のサイズとリストア時間をリセットできます。変更量が非常に多いデータベースでは週 2 回にする場合もあります。
QBlock Change Tracking は Standard Edition で使えますか?
A使えません。BCT は Enterprise Edition 専用の機能です。Standard Edition でも増分バックアップ自体は使えますが、BCT なしだと変更ブロックの検出に全ブロックスキャンが必要になるため、フルバックアップとの速度差が小さくなります。
Q差分と累積はどちらが一般的ですか?
A差分(DIFFERENTIAL)がデフォルトで最も一般的です。バックアップサイズが小さく、ストレージ効率が良いためです。リストア速度を最優先する場合は累積(CUMULATIVE)を検討してください。更に速いリストアが必要なら「増分更新バックアップ(RECOVER COPY)」が最適です。
QARCHIVELOG モードでないと増分バックアップは使えませんか?
A増分バックアップ自体は NOARCHIVELOG モードでも取得可能ですが、NOARCHIVELOG ではオンラインバックアップ(DB 稼働中のバックアップ)ができません。また、アーカイブログがないとリカバリが「最後のバックアップ時点」までしかできません。本番環境ではARCHIVELOG モードが事実上必須です。
QLEVEL 2 以上は使えますか?
AOracle 10g 以降ではLEVEL 0 と LEVEL 1 のみがサポートされています。Oracle 9i 以前では LEVEL 0〜4 が使えましたが、現在は廃止されています。実用的には LEVEL 0 + LEVEL 1 の 2 段階で十分です。

まとめ

RMAN 増分バックアップの要点をまとめます。

やりたいこと コマンド
増分ベース(LEVEL 0) BACKUP INCREMENTAL LEVEL 0 DATABASE
差分増分(LEVEL 1) BACKUP INCREMENTAL LEVEL 1 DATABASE
累積増分(LEVEL 1) BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE
アーカイブログも含める … PLUS ARCHIVELOG DELETE INPUT
BCT を有効化 ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE ‘…’
増分更新バックアップ(最速リカバリ) RECOVER COPY OF DATABASE WITH TAG ‘tag’; BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY …
リストア + リカバリ RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS
不要バックアップの削除 DELETE NOPROMPT OBSOLETE

RMAN バックアップの自動化は「RMAN バックアップを自動化する方法」、アーカイブログの管理は「アーカイブログを自動削除する方法」、制御ファイルのバックアップは「制御ファイルと SPFILE をバックアップ・復元する方法」も併せて参照してください。