大規模な 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 1 は LEVEL 0 を起点として「何が変わったか」を計算するため、増分バックアップを使うなら最初に LEVEL 0 を取得する必要があります。フルバックアップ(INCREMENTAL なし)は増分の起点にはなりません。
LEVEL 0 / LEVEL 1 の基本コマンド
# 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;
# 増分バックアップ + アーカイブログ + 制御ファイル
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)を有効にすると、変更されたブロックの位置を追跡ファイルに記録するため、スキャンが不要になり増分バックアップが大幅に高速化されます。
-- 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 が必要 |
Block Change Tracking は Enterprise Edition でのみ利用可能です。Standard Edition では BCT なしで増分バックアップを使用しますが、全ブロックスキャンが発生するためフルバックアップとの速度差が小さくなります。
増分更新バックアップ(RECOVER COPY + 増分マージ)
Oracle 10g 以降の増分更新バックアップは、LEVEL 0 のイメージコピーに LEVEL 1 の増分をマージして、常に最新の「仮想フルバックアップ」を維持する方式です。リストア時に増分を順番に適用する必要がなく、最速のリカバリが可能です。
# (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) |
#!/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): 増分更新バックアップ(最速リカバリ)
#!/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 バックアップを自動化する方法」を参照してください。
増分バックアップからのリストア・リカバリ
# (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;
# イメージコピーに SWITCH するだけで即座に復元 RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT; # イメージコピーをデータファイルとして使用 RMAN> SWITCH DATABASE TO COPY; # アーカイブログでリカバリ(イメージコピー以降の変更を適用) RMAN> RECOVER DATABASE; RMAN> ALTER DATABASE OPEN RESETLOGS;
RECOVER DATABASE を実行すると、RMAN が自動的に最適な LEVEL 0 + LEVEL 1 + アーカイブログを選択して適用します。手動でファイルを指定する必要はありません。増分バックアップの確認
RMAN> LIST BACKUP SUMMARY; -- 増分レベル別のバックアップ一覧 RMAN> LIST BACKUP OF DATABASE; -- 不要なバックアップの削除 RMAN> DELETE NOPROMPT OBSOLETE;
-- 増分レベル別のバックアップサイズ
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;
よくある質問
BACKUP DATABASE(INCREMENTAL なし)のフルバックアップは増分の起点にはなりません。まとめ
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 をバックアップ・復元する方法」も併せて参照してください。

