The Problem With Traditional Level 0 / Level 1 Strategies
The standard RMAN backup strategy for most production Oracle databases is a weekly level 0 (full) backup with daily level 1 incrementals. The level 0 captures the entire database. Each subsequent level 1 captures only blocks changed since the last level 0 or level 1. On restore, you apply the level 0 then layer the level 1s on top, applying archive logs to reach the target SCN.
This strategy has two well-understood problems that get worse as databases grow:
Problem 1: The weekly level 0 backup window. As the database grows from 2TB to 8TB over three years, the weekly full backup takes proportionally longer. If your Saturday night backup window was 4 hours when the database was 2TB, it's approaching 16 hours for an 8TB database — assuming similar I/O throughput. At some point, the level 0 doesn't finish before Monday morning traffic begins.
Problem 2: Restore time grows with retention period. If you maintain 7 days of incrementals and need to restore to a point 6 days old, you apply the level 0 plus 6 level 1s plus archive logs. The more incrementals in the chain, the longer the restore. Recovery time objective (RTO) grows passively as retention periods are extended.
Incremental Merge: The Concept
The RMAN incremental merge strategy (also called "incremental backup to image copy" or the "rolling forward" strategy) solves the growing level 0 problem by maintaining an image copy of the database that is updated daily with a level 1 incremental merge.
The concept: instead of creating a new level 0 backup each week, you maintain one long-lived image copy on disk. Each day, you take a level 1 incremental backup, then merge it into the image copy. The image copy is always current as of the last merge. Restore from an image copy is the fastest possible RMAN restore — there's no backup set to extract, no level 1s to apply.
-- Day 1: Create the initial image copy (equivalent to level 0)
RMAN> BACKUP AS COPY DATABASE
FORMAT '/backup/imagecopy/data_%U'
TAG 'DAILY_IMAGECOPY';
-- Day 2 onwards: Take level 1 incremental, then merge into copy
-- This is the daily backup job that replaces the traditional level 0/level 1 schedule
RMAN> RUN {
-- Step 1: Take level 1 incremental since last backup
BACKUP INCREMENTAL LEVEL 1
FOR RECOVER OF COPY WITH TAG 'DAILY_IMAGECOPY'
DATABASE;
-- Step 2: Merge the level 1 into the image copy
-- The image copy is now current as of this backup
RECOVER COPY OF DATABASE
WITH TAG 'DAILY_IMAGECOPY';
}
-- Also back up archive logs (separate from the image copy job)
RMAN> BACKUP ARCHIVELOG ALL
FORMAT '/backup/archivelogs/arch_%U'
DELETE INPUT;
After the merge, the image copy reflects all changes up to the SCN at which the level 1 was taken. The incremental backup file is no longer needed — the merge consumed it. You only ever have one image copy on disk (plus current archive logs), regardless of how long you've been running the strategy.
The Backup Window Comparison
To make the trade-off concrete, compare the two strategies for a 4TB database with a 10% daily change rate (400GB of changed blocks per day):
Traditional Level 0 / Level 1:
- Weekly level 0: reads all 4TB, writes ~2TB compressed. Duration: 6-8 hours at 100MB/s sustained throughput.
- Daily level 1: reads/writes ~400GB of changed blocks. Duration: ~1 hour.
- Weekly full backup window: 6-8 hours (grows as database grows)
Incremental Merge:
- Initial image copy: same as a level 0 — 6-8 hours. Done once, then never repeated.
- Daily job: level 1 incremental (~400GB, ~1 hour) + merge operation (~400GB read/write, ~45 min). Total: ~1.75 hours every day.
- Daily backup window: ~1.75 hours regardless of total database size (only changed blocks, not full database)
The cross-over point: if your daily change rate is low relative to database size, incremental merge wins on backup window. For a 10TB database with 5% daily change rate (500GB/day), the daily incremental merge job takes about 2 hours. The equivalent weekly level 0 of a 10TB database takes 15-20 hours — completely impractical.
Restore Procedure Differences
This is where teams often underestimate the incremental merge strategy's complexity. Restore from an image copy is simpler in some ways and more nuanced in others.
-- Restore from image copy (fastest path)
-- The image copy is already a usable database -- just switch to it
RMAN> RUN {
-- Switch datafiles to use the image copy location
SWITCH DATABASE TO COPY;
-- Recover to current time using archive logs
RECOVER DATABASE;
}
-- The database is now using the image copy files directly.
-- No backup set extraction needed -- this is the speed advantage.
-- Point-in-time recovery with image copy:
-- The image copy is current as of the last merge.
-- For recovery to a point AFTER the last merge, apply archive logs forward.
-- For recovery to a point BEFORE the last merge, you need a previous image copy
-- (if you maintain multiple generations) or fall back to level 0 + level 1 chain.
RMAN> RUN {
SWITCH DATABASE TO COPY;
SET UNTIL TIME "TO_DATE('2022-08-16 14:30:00','YYYY-MM-DD HH24:MI:SS')";
RECOVER DATABASE;
}
The critical limitation: the image copy strategy only gives you one recovery point by default — "as of last merge." If you need to recover to a point three days ago and you only maintain one image copy generation, you cannot recover to that point without the archive logs spanning from last merge back to the target time. Make sure your archive log retention covers your full recovery window.
Maintaining Multiple Image Copy Generations
For environments that need point-in-time recovery flexibility, maintain two or three generations of image copies tagged by date. Each generation is a complete copy of the database at a different point in time.
-- Multi-generation image copy strategy
-- Maintain 3 generations: yesterday, 3 days ago, 7 days ago
-- Daily job tags by day of week
RMAN> RUN {
BACKUP INCREMENTAL LEVEL 1
FOR RECOVER OF COPY WITH TAG 'IMAGECOPY_MON'
DATABASE;
RECOVER COPY OF DATABASE WITH TAG 'IMAGECOPY_MON';
}
-- Weekly rotation: on Sunday, create a new generation
-- tagged for the next 7-day window
-- Expire old generations after they age past retention policy
RMAN> DELETE COPY TAG 'IMAGECOPY_SUN_PRIOR';
Multi-generation image copy is storage-intensive: three generations of a 4TB database requires 12TB of backup storage for the copies alone, plus archive logs. Compare this to the traditional strategy where a level 0 + 7 level 1s for a 4TB database might require 3-4TB total (with compression). The incremental merge strategy trades storage cost for backup window performance. On AWS with S3 storage at $0.023/GB-month, storing three 4TB image copies costs about $280/month — worth modeling against the operational value of a predictable 2-hour backup window.
Integrating With S3 for Cloud Environments
Oracle databases running on EC2 can use RMAN with the Oracle S3 integration or the standard Unix file system approach (backup to local EBS staging, then sync to S3). For image copy strategies, the image copy must be on locally accessible storage during the merge operation — RMAN reads the image copy files and overwrites individual blocks. This means keeping image copies on EBS, not directly on S3.
-- Configuration for EC2/EBS-based image copy with S3 archive of image copies
-- Image copies stay on EBS (fast local access for merge operations)
CONFIGURE CHANNEL DEVICE TYPE DISK
FORMAT '/mnt/rman_imagecopy/data_%U';
-- After merge, sync updated image copy files to S3 for DR
# Shell script run after RMAN completes:
aws s3 sync /mnt/rman_imagecopy/ \
s3://my-oracle-backups/imagecopy/ \
--sse aws:kms \
--sse-kms-key-id alias/oracle-backup-key \
--storage-class STANDARD_IA
# Archive logs go directly to S3 (no merge needed, sequential access is fine)
CONFIGURE CHANNEL DEVICE TYPE DISK
FORMAT '/mnt/rman_archivelogs/arch_%U';
Which Strategy to Use
The decision is driven by two questions: what is your RTO requirement, and what is your backup window constraint?
- Use incremental merge if: your database is over 2TB and growing, your backup window is constrained (nightly batch jobs, business hours operations), and you have sufficient EBS/local storage for image copies. The flat daily backup window is the primary benefit.
- Use traditional level 0/level 1 if: your database is under 1TB and unlikely to grow significantly, storage cost is a hard constraint, or your operational team is more comfortable with the traditional restore procedure (which is more widely documented and tested).
- Use cumulative level 1 if: you want to reduce restore time from the traditional differential strategy without changing to image copies. Cumulative level 1 captures all changes since the last level 0 (not just since the last level 1), so restore requires only one level 1 application rather than a full chain. The trade-off: each cumulative level 1 backup grows in size throughout the week, approaching level 0 size by Sunday.
Test your restore procedure on the actual strategy you run in production. The incremental merge strategy's restore path is different enough from the traditional approach that a DBA unfamiliar with it will slow down during an actual recovery incident. Document the exact RMAN commands for your environment and run a full restore test in a non-production environment every quarter.
Oracle backup strategy not keeping up with database growth?
We review RMAN configurations and backup window constraints, and design a strategy that fits your RTO and operational requirements. Free assessment.