How to Create an Oracle RMAN Backup - Full & Incremental
How to Create an Oracle RMAN Backup
Section titled “How to Create an Oracle RMAN Backup”Oracle Recovery Manager (RMAN) is the standard tool for Oracle database backups. It integrates with the database to provide block-change tracking, incremental backups, compression, and automatic catalog maintenance. This guide covers all backup types with production-ready scripts.
Prerequisites
Section titled “Prerequisites”- RMAN is installed with Oracle Database — no separate installation needed
- Connect as
SYSDBAor a user withSYSBACKUPprivilege - The Fast Recovery Area (FRA) or a backup destination must be configured
- The database should be in ARCHIVELOG mode for online backups
# Connect to RMANrman target / # Connect to local instance as SYSDBArman target sys@ORCL # Connect to remote instancerman target / catalog rman/rman@RCAT # Connect with recovery catalog-- Verify database is in ARCHIVELOG modeSELECT log_mode FROM v$database;
-- Check FRA configurationSHOW PARAMETER db_recovery_file_dest;SHOW PARAMETER db_recovery_file_dest_size;
-- Check RMAN configurationRMAN> SHOW ALL;Step 1: Configure RMAN Before First Backup
Section titled “Step 1: Configure RMAN Before First Backup”-- Set backup retention policy (keep 14 days or 2 recovery window)RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
-- Set compression (requires Advanced Compression Option for MEDIUM/HIGH)RMAN> CONFIGURE COMPRESSION ALGORITHM 'BASIC'; -- No license needed-- RMAN> CONFIGURE COMPRESSION ALGORITHM 'MEDIUM'; -- Requires ACO
-- Configure backup optimization (skip already-backed-up files)RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
-- Configure parallelism (use 4 channels for parallel backup)RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
-- Enable automatic channel configurationRMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u02/backup/ORCL/%d_%T_%U';
-- Enable block change tracking (dramatically speeds up incremental backups)ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/oradata/ORCL/bct.dbf';Step 2: Full Database Backup (Level 0)
Section titled “Step 2: Full Database Backup (Level 0)”A Level 0 incremental backup is the baseline for incremental backup strategies. It backs up every used block — similar to a full backup but usable as an incremental base.
# Run from OS as oracle userrman target /-- Full database backupRMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT TAG 'FULL_WEEKLY';
-- Full backup with compression (no ACO license needed for BASIC)RMAN> BACKUP COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG DELETE INPUT TAG 'FULL_COMPRESSED' FORMAT '/u02/backup/ORCL/full_%d_%T_%U';
-- Level 0 incremental (foundation for incremental strategy)RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG DELETE INPUT TAG 'L0_WEEKLY' FORMAT '/u02/backup/ORCL/l0_%d_%T_%U';Step 3: Incremental Level 1 Backup (Daily)
Section titled “Step 3: Incremental Level 1 Backup (Daily)”Level 1 incrementals back up only blocks changed since the last Level 0 or Level 1 backup — far smaller and faster than a full backup.
-- Cumulative Level 1 (backs up changes since last Level 0)-- Larger than differential but simpler to recover fromRMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE PLUS ARCHIVELOG DELETE INPUT TAG 'L1_CUMULATIVE_DAILY' FORMAT '/u02/backup/ORCL/l1c_%d_%T_%U';
-- Differential Level 1 (backs up changes since last Level 0 OR Level 1)-- Smaller backups but requires more backup sets during recoveryRMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG DELETE INPUT TAG 'L1_DIFFERENTIAL_DAILY' FORMAT '/u02/backup/ORCL/l1d_%d_%T_%U';Step 4: Back Up Archived Redo Logs
Section titled “Step 4: Back Up Archived Redo Logs”Archived logs are required for media recovery and point-in-time recovery. Back them up separately or as part of database backups.
-- Back up all archived logsRMAN> BACKUP ARCHIVELOG ALL DELETE INPUT FORMAT '/u02/backup/ORCL/arch_%d_%T_%U';
-- Back up archived logs from a specific timeRMAN> BACKUP ARCHIVELOG FROM TIME 'SYSDATE-1' UNTIL TIME 'SYSDATE' DELETE INPUT;
-- Back up the current redo log (force an archive first)RMAN> ALTER SYSTEM ARCHIVE LOG CURRENT;RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;Step 5: Back Up Control File and SPFILE
Section titled “Step 5: Back Up Control File and SPFILE”-- Back up control file explicitlyRMAN> BACKUP CURRENT CONTROLFILE;
-- Back up SPFILERMAN> BACKUP SPFILE;
-- Autobackup of control file and SPFILE after every backupRMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u02/backup/ORCL/ctrl_%F';Step 6: Tablespace or Datafile Backup
Section titled “Step 6: Tablespace or Datafile Backup”-- Back up a specific tablespaceRMAN> BACKUP TABLESPACE app_data, app_idx FORMAT '/u02/backup/ORCL/ts_%d_%T_%U';
-- Back up specific datafilesRMAN> BACKUP DATAFILE 5, 6 FORMAT '/u02/backup/ORCL/df_%d_%T_%U';Complete Weekly Backup Script
Section titled “Complete Weekly Backup Script”Save this as /opt/oracle/scripts/rman_weekly_backup.rman and schedule with cron.
# Connect to RMAN and run this script# rman target / @/opt/oracle/scripts/rman_weekly_backup.rman log /opt/oracle/logs/rman_weekly_$(date +%Y%m%d).log
RUN { -- Allocate 4 parallel channels ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/u02/backup/ORCL/%d_%T_%U'; ALLOCATE CHANNEL ch2 DEVICE TYPE DISK FORMAT '/u02/backup/ORCL/%d_%T_%U'; ALLOCATE CHANNEL ch3 DEVICE TYPE DISK FORMAT '/u02/backup/ORCL/%d_%T_%U'; ALLOCATE CHANNEL ch4 DEVICE TYPE DISK FORMAT '/u02/backup/ORCL/%d_%T_%U';
-- Level 0 (full baseline) backup BACKUP INCREMENTAL LEVEL 0 COMPRESSED BACKUPSET DATABASE INCLUDE CURRENT CONTROLFILE PLUS ARCHIVELOG DELETE ALL INPUT TAG 'WEEKLY_LEVEL0';
-- Release channels RELEASE CHANNEL ch1; RELEASE CHANNEL ch2; RELEASE CHANNEL ch3; RELEASE CHANNEL ch4;}
-- Crosscheck and delete obsolete backupsCROSSCHECK BACKUP;DELETE NOPROMPT OBSOLETE;DELETE NOPROMPT EXPIRED BACKUP;Advanced Examples
Section titled “Advanced Examples”Multisection Backup (for Very Large Datafiles)
Section titled “Multisection Backup (for Very Large Datafiles)”-- Split large datafiles into sections for parallel backupRMAN> BACKUP SECTION SIZE 10G DATABASE TAG 'MULTISECTION_BACKUP';Backup to Tape (SBT)
Section titled “Backup to Tape (SBT)”-- Configure tape channel (requires media manager like NetBackup/DataDomain)RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT PARMS 'ENV=(NB_ORA_SERV=netbackup_server)';
RMAN> BACKUP DEVICE TYPE SBT DATABASE PLUS ARCHIVELOG TAG 'TAPE_WEEKLY';Backup Validation (Test Without Writing)
Section titled “Backup Validation (Test Without Writing)”-- Validate that all blocks are valid without actually writing backupRMAN> BACKUP VALIDATE DATABASE;
-- Validate archived logsRMAN> BACKUP VALIDATE ARCHIVELOG ALL;
-- Detailed validation with corruption checkRMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE;Common Mistakes and Pitfalls
Section titled “Common Mistakes and Pitfalls”Not configuring CONTROLFILE AUTOBACKUP — Without autobackup, if you lose the control file AND the database, you have no control file to start recovery. Always enable it.
Letting FRA fill up — RMAN will fail and the database will hang trying to archive logs if the FRA is 100% full. Monitor FRA usage and set db_recovery_file_dest_size appropriately.
Forgetting to back up archived logs — A database backup without the corresponding archived logs cannot be recovered to a point in time. Always include PLUS ARCHIVELOG or schedule separate archivelog backups.
Using FULL instead of INCREMENTAL LEVEL 0 — BACKUP DATABASE (full) cannot be used as the base for incrementals. Use BACKUP INCREMENTAL LEVEL 0 DATABASE as your weekly baseline.
Not testing restore — Unvalidated backups are just files. Regularly test RESTORE ... VALIDATE and full restore-to-test-environment to confirm your backups are usable.
Forgetting DELETE INPUT — Without DELETE INPUT on archivelog backups, archived logs accumulate and fill the archive destination or FRA.
Verification Queries
Section titled “Verification Queries”-- Check backup status from RMANRMAN> LIST BACKUP SUMMARY;RMAN> LIST BACKUP OF DATABASE;
-- Check for failed backupsSELECT session_key, session_recid, status, start_time, end_time, input_bytes/1024/1024/1024 AS input_gb, output_bytes/1024/1024/1024 AS output_gbFROM v$rman_backup_job_detailsWHERE start_time > SYSDATE - 7ORDER BY start_time DESC;
-- Check that all datafiles have been backed up recentlySELECT file#, name, completion_time, ROUND((SYSDATE - completion_time) * 24, 1) AS hours_agoFROM v$backup_datafileWHERE completion_time = ( SELECT MAX(completion_time) FROM v$backup_datafile b2 WHERE b2.file# = v$backup_datafile.file#)ORDER BY hours_ago DESC NULLS FIRST;
-- Check FRA usageSELECT name, space_limit/1024/1024/1024 AS limit_gb, space_used/1024/1024/1024 AS used_gb, ROUND(space_used/space_limit*100, 1) AS used_pctFROM v$recovery_file_dest;Related Topics
Section titled “Related Topics”- How to Recover an Oracle Database with RMAN - Use the backup you created
- RMAN Documentation - Comprehensive RMAN reference
- RMAN Commands Cheat Sheet - Quick reference
- Oracle Errors: ORA-19815 - Flash Recovery Area full