50-75%
Ahorro Compresión
5-10x
Más Rápido con BCT
RPO
Recuperar a un punto (PITR)
1 CMD
Backup Completo

¿Qué es Oracle RMAN? (La Explicación de 30 Segundos)

RMAN significa Recovery Manager (Administrador de Recuperación). Es la herramienta integrada de Oracle para hacer backup, restaurar y recuperar bases de datos.

Piensa en RMAN como el guardaespaldas personal + máquina del tiempo de tu base de datos:

  • 🛡️ Guardaespaldas: Protege tus datos de desastres
  • ⏰ Máquina del Tiempo: Te permite viajar a cualquier punto en el tiempo

Antes de que existiera RMAN (pre-Oracle 8), los DBAs tenían que escribir scripts shell complejos, rastrear archivos manualmente y rezar para que todo funcionara durante la recuperación. RMAN lo cambió todo.

⚠️ Modo ARCHIVELOG (Muy Recomendado)

PITR y la recuperación a un tiempo/SCN entre backups requieren modo ARCHIVELOG. En NOARCHIVELOG aún puedes hacer backups offline, pero la recuperación generalmente se limita al último backup consistente (sin roll-forward con redo archivado). Verifica con: SELECT LOG_MODE FROM V$DATABASE;

¿Por Qué No Simplemente Copiar Archivos?

¡Buena pregunta! Aquí está por qué RMAN supera la copia manual de archivos:

Característica Backup Manual RMAN
Manejo de Bloques Copia TODOS los bloques (incluso vacíos) ✅ Solo respalda bloques USADOS
Detección de Corrupción ❌ Ninguna ✅ Validación automática de bloques
Scripting Scripts shell complejos requeridos ✅ Comandos simples e intuitivos
Gestión de Catálogo Seguimiento manual ✅ Metadatos de backup automáticos
Recuperación Manual, propenso a errores ✅ Recuperación punto en tiempo integrada
Compresión Herramientas externas necesarias ✅ Compresión nativa

🏗️ Arquitectura de RMAN

Entender cómo funcionan juntos los componentes de RMAN es crucial. Aquí está el panorama general:

Diagrama de Arquitectura RMAN
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#f59e0b', 'primaryTextColor': '#000', 'lineColor': '#a1a1aa', 'fontSize': '13px'}}}%% flowchart LR subgraph RMAN["🛡️ RMAN Client"] CLIENT["RMAN"]:::rmanNode CMD["Commands"]:::rmanNode CH["Channels"]:::rmanNode end subgraph TARGET["🎯 Target Database"] CF["Control File"]:::targetNode DF["Data Files"]:::targetNode AL["Archive Logs"]:::targetNode end subgraph CATALOG["📚 Recovery Catalog"] META["Metadata"]:::catalogNode SCRIPTS["Stored Scripts"]:::catalogNode end subgraph STORAGE["💾 Backup Storage"] DISK["Disk / FRA"]:::storageNode TAPE["Tape / Cloud"]:::storageNode end CLIENT --> CMD CMD --> CH CH --> TARGET CH --> STORAGE CLIENT <-.->|Optional| CATALOG classDef rmanNode fill:#fef3c7,stroke:#f59e0b,color:#000,stroke-width:2px classDef targetNode fill:#ccfbf1,stroke:#14b8a6,color:#000,stroke-width:2px classDef catalogNode fill:#d1fae5,stroke:#22c55e,color:#000,stroke-width:2px classDef storageNode fill:#fecaca,stroke:#dc2626,color:#000,stroke-width:2px

Componentes Clave Explicados

Componente Descripción ¿Requerido?
Cliente RMAN Interfaz de línea de comandos con la que interactúas ✅ Sí
Base de Datos Objetivo La base de datos que se respalda/recupera ✅ Sí
Catálogo de Recuperación BD separada que almacena metadatos de backup Opcional (recomendado)
Canales Procesos del servidor que realizan operaciones I/O ✅ Sí (auto-asignados)
Gestión de Medios Interfaz hacia almacenamiento en cinta/nube Opcional

Conceptos Fundamentales: Los Bloques de Construcción

Antes de sumergirnos en los comandos, establezcamos el vocabulario. Confía en mí, esto te ahorrará horas de confusión después.

1. Base de Datos Objetivo (Target)

La base de datos que deseas respaldar o recuperar. Cuando conectas RMAN a una base de datos, te estás conectando a un "target".

rman target /
# or
rman target sys/password@orcl

2. Catálogo de Recuperación (Opcional pero Recomendado)

Una base de datos separada que almacena metadatos sobre tus backups. Piensa en él como la memoria externa de RMAN.

💡 Catálogo vs Sin Catálogo

Sin catálogo: RMAN almacena información en el control file de la base de datos objetivo (historial limitado)
Con catálogo: Historial ilimitado, gestión centralizada para múltiples bases de datos

3. Backup Sets vs. Image Copies

¡Este es un concepto crítico! Entender cuándo usar cada uno puede impactar significativamente tu estrategia de backup.

┌──────────────────────────────────────────────────────────────────┐ │ BACKUP SET vs IMAGE COPY COMPARISON │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ BACKUP SET (default): │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ ████ ████ ████ ████ ████ │ Compressed │ │ │ │ Only used blocks, RMAN format │ 50-75% smaller │ │ │ └──────────────────────────────────────────────────────┘ │ │ ⚠️ Needs RESTORE command to extract │ │ │ │ IMAGE COPY: │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ ████ ████ ░░░░ ████ ████ ████ ░░░░░░░░ │ Full size │ │ │ │ Exact copy including empty blocks │ 100% size │ │ │ └──────────────────────────────────────────────────────┘ │ │ ✅ Instant SWITCH command - no restore needed! │ │ │ ├──────────────────────────────────────────────────────────────────┤ │ SIZE COMPARISON (100GB Database): │ │ │ │ Original: ████████████████████████████████████████ 100 GB │ │ Backup Set: ████████████ ~30 GB │ │ Image Copy: ████████████████████████████████████████ 100 GB │ │ │ │ 💰 Backup Set saves ~70% storage! │ └──────────────────────────────────────────────────────────────────┘
-- Backup Set (default)
BACKUP DATABASE;

-- Image Copy
BACKUP AS COPY DATABASE;

4. Canales (Channels)

Los canales son los trabajadores que realizan las operaciones de backup/restauración. Más canales = procesamiento paralelo = backups más rápidos.

┌─────────────────────────────────────────────────────────────────┐ │ CHANNEL PARALLELISM │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Single Channel: │ │ ═══════════════════════════════════════════▶ 100 min │ │ │ │ 2 Channels (Parallel): │ │ ══════════════════════▶ │ │ ══════════════════════▶ ~50 min │ │ │ │ 4 Channels (Parallel): │ │ ═══════════▶ │ │ ═══════════▶ │ │ ═══════════▶ ~25 min │ │ ═══════════▶ │ │ │ └─────────────────────────────────────────────────────────────────┘
RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c3 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c4 DEVICE TYPE DISK;
    BACKUP DATABASE;
}

5. Backups Incrementales

¿Por qué respaldar todo cada vez? Los backups incrementales solo capturan cambios.

  • Level 0: Backup completo (la línea base) - respalda todos los bloques que alguna vez se han usado
  • Level 1 Diferencial (por defecto): Cambios desde el último Level 0 O Level 1
  • Level 1 Acumulativo: Todos los cambios desde el último Level 0 solamente (usa la palabra clave CUMULATIVE)
📊 Estrategia de Backup Incremental - Vista Semanal
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#f59e0b', 'primaryTextColor': '#000', 'lineColor': '#71717a', 'fontSize': '13px', 'nodeTextColor': '#000'}}}%% flowchart LR subgraph WEEK[" "] direction LR SUN["☀️ SUN
Level 0
100 GB"] MON["MON
Level 1
5 GB"] TUE["TUE
Level 1
8 GB"] WED["WED
Level 1
3 GB"] THU["THU
Level 1
6 GB"] FRI["FRI
Level 1
4 GB"] SAT["SAT
Level 1
7 GB"] end SUN --> MON --> TUE --> WED --> THU --> FRI --> SAT SAT -.->|Next Week| SUN2["☀️ SUN
Level 0
100 GB"] style SUN fill:#f59e0b,stroke:#d97706,color:#000,stroke-width:2px style SUN2 fill:#f59e0b,stroke:#d97706,color:#000,stroke-width:2px style MON fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px style TUE fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px style WED fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px style THU fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px style FRI fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px style SAT fill:#4ecdc4,stroke:#14b8a6,color:#000,stroke-width:2px
┌────────────────────────────────────────────────────────────────┐ │ WEEKLY BACKUP STORAGE COMPARISON │ ├────────────────────────────────────────────────────────────────┤ │ │ │ Full Backup Daily (7 days): │ │ ████████████████████████████████████████████████████ 700 GB │ │ │ │ Incremental Strategy: │ │ ████████████ Level 0: 100 GB │ │ █████ Level 1s: ~33 GB │ │ ─────────────────────────────────────────────── │ │ Total: ~133 GB │ │ │ │ 💰 SAVINGS: 81% less storage! │ │ │ └────────────────────────────────────────────────────────────────┘

🎬 Tu Primera Sesión RMAN

¡Manos a la obra! Abre tu terminal y sigue adelante.

1

Conectar a RMAN

# Conectar como SYSDBA a la base de datos local
$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production
Copyright (c) 1982, 2019, Oracle. All rights reserved.

connected to target database: ORCL (DBID=1234567890)

RMAN>

¡Ya estás dentro! El prompt RMAN> es donde ocurre la magia.

2

Verificar el Estado de tu Base de Datos

RMAN> REPORT SCHEMA;

Report of database schema for database with db_unique_name ORCL

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    900      SYSTEM               YES     /u01/oradata/ORCL/system01.dbf
2    500      SYSAUX               NO      /u01/oradata/ORCL/sysaux01.dbf
3    100      UNDOTBS1             YES     /u01/oradata/ORCL/undotbs01.dbf
4    50       USERS                NO      /u01/oradata/ORCL/users01.dbf
3

Configurar Ajustes de RMAN

-- Establecer destino de backup
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/backup/%U';

-- Enable automatic control file backup (CRITICAL!)
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

-- Set retention policy (keep 7 days)
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

-- Enable compression (saves 50-75% space)
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET;

-- View all configurations
RMAN> SHOW ALL;
4

¡Tu Primer Backup Completo! 🎉

RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

Starting backup at 12-DEC-24
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
...
channel ORA_DISK_1: backup set complete, elapsed time: 00:02:35
Finished backup at 12-DEC-24
🎊 ¡Felicitaciones!

Acabas de respaldar toda tu base de datos. Déjalo asimilar — un solo comando protegió gigabytes de datos críticos.

Comandos Esenciales de RMAN: Tu Kit de Herramientas Diario

Aquí están los comandos que usarás el 90% del tiempo:

Comandos de Backup

-- Full database backup
BACKUP DATABASE;

-- Database + archive logs (recommended for production)
BACKUP DATABASE PLUS ARCHIVELOG;

-- Only specific tablespace
BACKUP TABLESPACE users;

-- Only specific datafile
BACKUP DATAFILE 4;

-- Archive logs only
BACKUP ARCHIVELOG ALL;

-- Incremental backups
BACKUP INCREMENTAL LEVEL 0 DATABASE;  -- baseline (full)
BACKUP INCREMENTAL LEVEL 1 DATABASE;  -- changes only

-- Compressed backup (saves 50-75% space!)
BACKUP AS COMPRESSED BACKUPSET DATABASE;

-- Tag your backups for easy identification
BACKUP DATABASE TAG 'WEEKLY_FULL_20241212';

Listado y Reportes

-- List all backups
LIST BACKUP;

-- List backups of specific database
LIST BACKUP OF DATABASE;

-- List backup of tablespace
LIST BACKUP OF TABLESPACE users;

-- Find files needing backup
REPORT NEED BACKUP;

-- Find obsolete backups (based on retention)
REPORT OBSOLETE;

-- Check for corruptions (DO THIS REGULARLY!)
VALIDATE DATABASE;

Comandos de Mantenimiento

-- Delete obsolete backups (based on retention policy)
DELETE OBSOLETE;

-- Delete specific backup
DELETE BACKUPSET 123;

-- Crosscheck (verify backups still exist on disk)
CROSSCHECK BACKUP;

-- Remove catalog entries for missing files
DELETE EXPIRED BACKUP;

🆘 Escenarios de Recuperación: Cuando las Cosas Salen Mal

Aquí es donde RMAN realmente brilla. Cuando ocurre un desastre, usa este árbol de decisión:

Árbol de Decisión de Recuperación
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#f59e0b', 'primaryTextColor': '#000', 'lineColor': '#a1a1aa', 'fontSize': '12px'}}}%% flowchart TD DISASTER(["🚨 DISASTER!"]):::red --> Q1{"What happened?"}:::question Q1 -->|DB Won't Start| PATH1["Path 1"]:::path Q1 -->|File Corrupt| PATH2["Path 2"]:::path Q1 -->|Need PITR| PATH3["Path 3"]:::path PATH1 --> MOUNT["STARTUP MOUNT"]:::cmd MOUNT --> Q2{"Files OK?"}:::question Q2 -->|Yes| REC1["RECOVER DATABASE"]:::cmd Q2 -->|No| REST1["RESTORE DATABASE"]:::cmd REST1 --> REC1 REC1 --> OPEN1["ALTER DATABASE OPEN"]:::cmd OPEN1 --> DONE1(["✅ Complete"]):::green PATH2 --> OFF["DATAFILE OFFLINE"]:::cmd OFF --> REST2["RESTORE DATAFILE"]:::cmd REST2 --> REC2["RECOVER DATAFILE"]:::cmd REC2 --> ON["DATAFILE ONLINE"]:::cmd ON --> DONE2(["✅ Zero Downtime"]):::green PATH3 --> SHUT["SHUTDOWN + MOUNT"]:::cmd SHUT --> UNTIL["SET UNTIL TIME"]:::cmd UNTIL --> REST3["RESTORE DATABASE"]:::cmd REST3 --> REC3["RECOVER DATABASE"]:::cmd REC3 --> RESET["OPEN RESETLOGS"]:::warning RESET --> DONE3(["✅ Time Traveled"]):::green classDef red fill:#dc2626,stroke:#b91c1c,color:#fff,stroke-width:2px classDef green fill:#16a34a,stroke:#15803d,color:#fff,stroke-width:2px classDef warning fill:#f59e0b,stroke:#d97706,color:#000,stroke-width:2px classDef question fill:#3b82f6,stroke:#2563eb,color:#fff,stroke-width:2px classDef path fill:#6366f1,stroke:#4f46e5,color:#fff,stroke-width:2px classDef cmd fill:#1e293b,stroke:#f59e0b,color:#f4f4f5,stroke-width:2px

Escenario 1: Recuperación Completa de Base de Datos

Tu base de datos falló. El servidor se reinició. Es hora de recuperar.

-- Start database in mount mode
RMAN> STARTUP MOUNT;

-- Restore all datafiles from backup
RMAN> RESTORE DATABASE;

-- Apply all archived logs to catch up to failure point
RMAN> RECOVER DATABASE;

-- Open the database
RMAN> ALTER DATABASE OPEN;
💡 Si el Control File Está Perdido

Si perdiste el control file (o está corrupto) y habilitaste CONFIGURE CONTROLFILE AUTOBACKUP ON, generalmente puedes restaurarlo primero, luego proceder con restore/recover.

-- If you know DBID (recommended to record it!)
RMAN> SET DBID 1234567890;

RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
RMAN> ALTER DATABASE MOUNT;

RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

Escenario 2: Recuperación de un Solo Datafile (¡Base de Datos Online!)

Un solo datafile se corrompió, pero la base de datos sigue funcionando.

┌──────────────────────────────────────────────────────────────┐ │ ONLINE DATAFILE RECOVERY │ │ │ │ Users on USERS tablespace: ❌ Blocked │ │ Users on OTHER tablespaces: ✅ Working normally │ │ │ │ Timeline: │ │ ═══════════════════════════════════════════════════════ │ │ │ Detect │ Offline │ Restore │ Recover │ Online │ │ │ │ 30s │ 5s │ 10min │ 5min │ 5s │ │ │ ═══════════════════════════════════════════════════════ │ │ │ │ Total Downtime for affected tablespace: ~15 minutes │ │ Total Downtime for database: ZERO │ └──────────────────────────────────────────────────────────────┘
-- Take the datafile offline (use IMMEDIATE if file is corrupted/inaccessible)
RMAN> SQL 'ALTER DATABASE DATAFILE 4 OFFLINE IMMEDIATE';

-- Restore just that file
RMAN> RESTORE DATAFILE 4;

-- Recover to current point (applies all archived logs)
RMAN> RECOVER DATAFILE 4;

-- Bring it back online
RMAN> SQL 'ALTER DATABASE DATAFILE 4 ONLINE';
💡 ¡Cero Tiempo de Inactividad!

Los usuarios en otros tablespaces continúan trabajando mientras arreglas el archivo corrupto.

Escenario 3: Recuperación Punto en el Tiempo (¡La Máquina del Tiempo!)

Alguien accidentalmente eliminó una tabla crítica a las 14:30. Ahora son las 15:00.

┌──────────────────────────────────────────────────────────────┐ │ TIME TRAVEL RECOVERY │ ├──────────────────────────────────────────────────────────────┤ │ │ │ Timeline: │ │ │ │ 10:00 ────────── 14:25 ──── 14:30 ──── 15:00 │ │ │ │ │ │ │ │ Backup Target DROP TABLE NOW │ │ Taken Time (Disaster!) (Recovery) │ │ │ │ │ │ ▼ ▼ │ │ [████████████████████] │ │ Restored state includes all data up to 14:25 │ │ │ └──────────────────────────────────────────────────────────────┘
-- Shut down and mount
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;

-- Restore to just before the disaster
RMAN> RUN {
    SET UNTIL TIME "to_date('2024-12-12 14:25:00','YYYY-MM-DD HH24:MI:SS')";
    RESTORE DATABASE;
    RECOVER DATABASE;
}

-- Alternative: use NLS_DATE_FORMAT compatible string
-- SET UNTIL TIME '12-DEC-2024 14:25:00';

-- Open with reset logs (required after incomplete recovery)
RMAN> ALTER DATABASE OPEN RESETLOGS;
⚠️ Nota Importante

OPEN RESETLOGS crea una nueva encarnación y descarta el redo más allá del tiempo/SCN objetivo. Toma un backup completo fresco inmediatamente después de una recuperación incompleta.

⭐ Mejores Prácticas de RMAN

1. Siempre Respalda el Control File y SPFILE

-- Enable automatic controlfile backup (includes SPFILE)
CONFIGURE CONTROLFILE AUTOBACKUP ON;

-- Then every backup automatically includes controlfile + spfile
BACKUP DATABASE PLUS ARCHIVELOG;

-- Or explicitly backup spfile separately
BACKUP SPFILE;

Sin estos, la recuperación se vuelve significativamente más difícil. La configuración CONTROLFILE AUTOBACKUP asegura que siempre tengas un controlfile y SPFILE recuperables.

2. Usa Block Change Tracking para Incrementales Más Rápidos

-- Enable (one-time setup)
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING 
      USING FILE '/u01/oradata/ORCL/bct.dbf';
┌────────────────────────────────────────────────────────────┐ │ BLOCK CHANGE TRACKING PERFORMANCE │ ├────────────────────────────────────────────────────────────┤ │ │ │ Without BCT: │ │ [Scan ALL blocks] ══════════════════════════▶ 45 min │ │ │ │ With BCT: │ │ [Read BCT file] ═══▶ 4 min │ │ │ │ ⚡ 10x FASTER! │ │ │ └────────────────────────────────────────────────────────────┘

3. Valida tus Backups Regularmente

-- Check backup integrity without restoring
RESTORE DATABASE VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;

-- Validate with logical corruption check (more thorough)
RESTORE DATABASE VALIDATE CHECK LOGICAL;

-- Validate specific backup set
VALIDATE BACKUPSET 123;

-- Validate entire database for physical/logical corruption
VALIDATE DATABASE;
⚠️ Recordatorio Crítico

Un backup que no se puede restaurar NO ES un backup. ¡Valida semanalmente!

4. Usa Optimización de Backup

CONFIGURE BACKUP OPTIMIZATION ON;

RMAN omite archivos que no han cambiado desde el último backup.

5. Implementa una Política de Retención Sensata

-- Keep backups for 30 days
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 30 DAYS;

-- OR keep last 3 backups
CONFIGURE RETENTION POLICY TO REDUNDANCY 3;

6. Prueba la Recuperación Trimestralmente

La mejor estrategia de backup es inútil si no puedes restaurar. Programa simulacros de recuperación trimestrales.

🚀 Temas Avanzados

Una vez que hayas dominado los conceptos básicos, estas características avanzadas llevarán tu estrategia de backup al siguiente nivel.

1. Backups Encriptados con RMAN

Protege tus backups del acceso no autorizado con encriptación. Oracle soporta tres modos de encriptación:

Modo Gestión de Claves Caso de Uso
Transparente (TDE) Oracle Wallet / Key Vault Entornos de producción con TDE ya habilitado
Basado en Contraseña Contraseña proporcionada por usuario Envío de backups a terceros
Modo Dual Wallet + Contraseña Máxima flexibilidad para recuperación ante desastres
-- Configure transparent encryption (requires TDE wallet)
CONFIGURE ENCRYPTION FOR DATABASE ON;
CONFIGURE ENCRYPTION ALGORITHM 'AES256';

-- Password-based encryption for a single backup
RMAN> SET ENCRYPTION ON IDENTIFIED BY 'MySecurePassword123' ONLY;
RMAN> BACKUP DATABASE;

-- Dual-mode encryption (can restore with wallet OR password)
RMAN> SET ENCRYPTION ON IDENTIFIED BY 'MySecurePassword123';
RMAN> BACKUP DATABASE;

-- Restore encrypted backup with password
RMAN> SET DECRYPTION IDENTIFIED BY 'MySecurePassword123';
RMAN> RESTORE DATABASE;
⚠️ Crítico: Gestión de Contraseñas

Si pierdes la contraseña de encriptación y no tienes el wallet, tus backups son permanentemente irrecuperables. ¡Almacena las contraseñas de forma segura en una bóveda o gestor de contraseñas!

2. Backups de Arquitectura Multitenant (CDB/PDB)

Oracle 12c+ introdujo la arquitectura multitenant. Aquí está cómo respaldar Container Databases y Pluggable Databases:

┌─────────────────────────────────────────────────────────────────┐ │ MULTITENANT BACKUP ARCHITECTURE │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ CDB$ROOT (Container) │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ PDB$SEED │ │ PDB1 │ │ PDB2 │ │ │ │ │ │ (Template) │ │ (Sales) │ │ (HR) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ Backup Options: │ │ • BACKUP DATABASE → Entire CDB + all PDBs │ │ • BACKUP PLUGGABLE DATABASE pdb1 → Single PDB only │ │ • BACKUP TABLESPACE pdb1:users → Tablespace in PDB │ │ │ └─────────────────────────────────────────────────────────────────┘
-- Connect to CDB root
$ rman target sys/password@cdb1

-- Backup entire CDB (includes all PDBs)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

-- Backup specific PDB only
RMAN> BACKUP PLUGGABLE DATABASE pdb1;

-- Backup tablespace within a PDB
RMAN> BACKUP TABLESPACE pdb1:users;

-- Recover a single PDB to point-in-time
RMAN> RUN {
    SET UNTIL TIME "to_date('2024-12-12 14:00:00','YYYY-MM-DD HH24:MI:SS')";
    RESTORE PLUGGABLE DATABASE pdb1;
    RECOVER PLUGGABLE DATABASE pdb1;
    ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS;
}
💡 Recuperación Punto en Tiempo de PDB

Desde Oracle 12.2+, puedes realizar recuperación punto en tiempo en PDBs individuales sin afectar otras PDBs en la CDB. ¡Esto es revolucionario para entornos multitenant!

3. Integración con Data Guard

En entornos Data Guard, puedes descargar los backups a la base de datos standby, reduciendo la carga en producción:

-- On STANDBY database: Enable backup mode
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- Connect RMAN to standby
$ rman target sys/password@standby_db

-- Backup from standby (preferred for large databases)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

-- Resume managed recovery
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

-- IMPORTANT: Register backup in primary's catalog
$ rman target sys/password@primary_db
RMAN> CATALOG START WITH '/standby/backup/location/';
✅ Ventaja de Active Data Guard

Con Active Data Guard, puedes hacer backup desde un standby de solo lectura sin detener la recuperación, proporcionando backups de impacto cero en tu base de datos primaria de producción.

4. Integración Cloud (OCI Object Storage)

Los backups a almacenamiento de objetos típicamente se hacen a través de una biblioteca de gestión de medios SBT (módulo Oracle o de terceros). Los parámetros exactos de instalación varían según la versión de Oracle y el release del módulo, así que trata el paso de instalación como específico del proveedor y verifica con la documentación oficial.

-- Install Oracle Database Backup Cloud Module
-- (Vendor-specific) Install the cloud backup module to obtain:
-- 1) an SBT library (e.g., libopc.so) and 2) a config file (e.g., opc.ora)

-- Configure RMAN for OCI backup
RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT PARMS 
      'SBT_LIBRARY=/u01/app/oracle/lib/libopc.so,
       SBT_PARMS=(OPC_PFILE=/u01/app/oracle/wallet/opc.ora)';

-- Backup to OCI Object Storage
RMAN> BACKUP DEVICE TYPE SBT DATABASE PLUS ARCHIVELOG;

-- Hybrid approach: Local + Cloud
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;  -- Local (fast recovery)
RMAN> BACKUP DEVICE TYPE SBT BACKUPSET ALL
      NOT BACKED UP 1 TIMES;  -- Backup-of-backupset (replicate to object storage)
┌────────────────────────────────────────────────────────────────┐ │ HYBRID BACKUP STRATEGY (3-2-1 RULE) │ ├────────────────────────────────────────────────────────────────┤ │ │ │ 3 Copies of Data: │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Original │ │ Local │ │ Cloud │ │ │ │ Database │ ─► │ Backup │ ─► │ Backup │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ 2 Different Media Types: │ │ • Disk (FRA) │ │ • Cloud Object Storage / Tape │ │ │ │ 1 Offsite Copy: │ │ • OCI Object Storage in different region │ │ • AWS S3 / Azure Blob via third-party tools │ │ │ └────────────────────────────────────────────────────────────────┘

5. Configuración del Fast Recovery Area (FRA)

El Fast Recovery Area es el enfoque recomendado por Oracle para gestionar todos los archivos relacionados con la recuperación:

-- Configure FRA location and size
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/fra' SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 500G SCOPE=BOTH;

-- FRA automatically manages:
-- • Archived redo logs
-- • RMAN backups (when using default location)
-- • Flashback logs
-- • Control file autobackups

-- Monitor FRA usage
SELECT 
    NAME,
    SPACE_LIMIT/1024/1024/1024 AS SIZE_GB,
    SPACE_USED/1024/1024/1024 AS USED_GB,
    ROUND(SPACE_USED/SPACE_LIMIT*100,2) AS PCT_USED
FROM V$RECOVERY_FILE_DEST;

-- Check what's consuming FRA space
SELECT 
    FILE_TYPE,
    PERCENT_SPACE_USED AS PCT_USED,
    NUMBER_OF_FILES AS NUM_FILES
FROM V$RECOVERY_AREA_USAGE;

🤖 Scripts de Automatización

Los entornos de producción necesitan backups automatizados y programados. Aquí están scripts listos para usar:

⚠️ Sobre DELETE INPUT (Lee Esto Antes de Copiar/Pegar)

DELETE INPUT elimina los archived redo logs después de respaldarlos. Esto es común, pero solo es seguro si coincide con tu diseño de HA/DR.

  • Data Guard: asegúrate de que los archived logs se envíen y apliquen a los standbys requeridos antes de eliminarlos (considera CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;).
  • Backups offsite: asegúrate de que los archivelogs se respalden a tu medio requerido (disco/cinta/cloud) y se verifiquen según la retención/RPO.
  • Seguridad operacional: si no estás seguro, elimina DELETE INPUT y gestiona la eliminación de logs por separado.

Script Shell Linux/Unix

#!/bin/bash
#############################################
# RMAN Automated Backup Script
# Schedule with cron: 0 2 * * * /scripts/rman_backup.sh
#############################################

# Environment variables
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# Directories
BACKUP_DIR=/u01/backup
LOG_DIR=/u01/backup/logs
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=$LOG_DIR/rman_backup_$DATE.log

# Create log directory if not exists
mkdir -p $LOG_DIR

# Determine backup type based on day of week
DOW=$(date +%u)
if [ $DOW -eq 7 ]; then
    BACKUP_TYPE="INCREMENTAL LEVEL 0"
    BACKUP_TAG="WEEKLY_L0_$DATE"
else
    BACKUP_TYPE="INCREMENTAL LEVEL 1"
    BACKUP_TAG="DAILY_L1_$DATE"
fi

# Execute RMAN backup
rman target / <<EOF >> $LOG_FILE 2>&1
RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
    
    BACKUP $BACKUP_TYPE DATABASE 
        TAG '$BACKUP_TAG'
        FORMAT '$BACKUP_DIR/%U';
    
    BACKUP ARCHIVELOG ALL 
        NOT BACKED UP 1 TIMES
        TAG 'ARCH_$DATE'
        DELETE INPUT;
    
    DELETE NOPROMPT OBSOLETE;
    
    RELEASE CHANNEL c1;
    RELEASE CHANNEL c2;
}
EXIT;
EOF

# Check for errors
if grep -i "RMAN-" $LOG_FILE | grep -v "RMAN-08138"; then
    echo "RMAN Backup FAILED - Check $LOG_FILE" | mail -s "RMAN Backup FAILED: $ORACLE_SID" [email protected]
else
    echo "RMAN Backup completed successfully" >> $LOG_FILE
fi

Script PowerShell para Windows

# RMAN Automated Backup Script for Windows
# Schedule with Task Scheduler

$env:ORACLE_SID = "ORCL"
$env:ORACLE_HOME = "C:\app\oracle\product\19c\dbhome_1"
$env:PATH = "$env:ORACLE_HOME\bin;$env:PATH"

$BackupDir = "D:\backup"
$LogDir = "D:\backup\logs"
$Date = Get-Date -Format "yyyyMMdd_HHmmss"
$LogFile = "$LogDir\rman_backup_$Date.log"

# Create directories
New-Item -ItemType Directory -Force -Path $LogDir | Out-Null

# Determine backup type
$DayOfWeek = (Get-Date).DayOfWeek
if ($DayOfWeek -eq "Sunday") {
    $BackupType = "INCREMENTAL LEVEL 0"
    $BackupTag = "WEEKLY_L0_$Date"
} else {
    $BackupType = "INCREMENTAL LEVEL 1"
    $BackupTag = "DAILY_L1_$Date"
}

# RMAN script content
$RmanScript = @"
RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
    
    BACKUP $BackupType DATABASE 
        TAG '$BackupTag'
        FORMAT '$BackupDir\%U';
    
    BACKUP ARCHIVELOG ALL 
        NOT BACKED UP 1 TIMES
        TAG 'ARCH_$Date'
        DELETE INPUT;
    
    DELETE NOPROMPT OBSOLETE;
}
EXIT;
"@

# Execute RMAN
$RmanScript | & rman target / | Out-File $LogFile -Encoding UTF8

# Check for errors
if (Select-String -Path $LogFile -Pattern "RMAN-" -SimpleMatch) {
    Send-MailMessage -To "[email protected]" -From "[email protected]" `
        -Subject "RMAN Backup FAILED: $env:ORACLE_SID" `
        -Body "Check log: $LogFile" -SmtpServer "smtp.company.com"
}

Scripts Almacenados en RMAN (Catálogo)

Almacena scripts usados frecuentemente en el catálogo de recuperación para consistencia entre bases de datos:

-- Connect to catalog
$ rman target / catalog rman/password@catdb

-- Create a stored script
RMAN> CREATE SCRIPT full_backup {
    BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
    DELETE NOPROMPT OBSOLETE;
}

-- Create an incremental script
RMAN> CREATE SCRIPT incr_backup {
    BACKUP INCREMENTAL LEVEL 1 DATABASE;
    BACKUP ARCHIVELOG ALL NOT BACKED UP 1 TIMES DELETE INPUT;
}

-- List all stored scripts
RMAN> LIST SCRIPT NAMES;

-- Execute a stored script
RMAN> RUN { EXECUTE SCRIPT full_backup; }

-- Execute from command line
$ rman target / catalog rman/password@catdb <<EOF
RUN { EXECUTE SCRIPT incr_backup; }
EOF
💡 Mejor Práctica: Programación de Backups

Una programación típica empresarial:

  • Domingo 2:00 AM: Backup Level 0 (Completo)
  • Lun-Sáb 2:00 AM: Backup Level 1 (Incremental)
  • Cada 30 minutos: Backup de archive logs
  • Mensual: Backup completo a cinta/cloud para retención a largo plazo

🔧 Errores Comunes de RMAN y Soluciones

ORA-19502: Write error on file, block number

Causa: Disco lleno o problema de permisos
Solución: Verifica el espacio en disco y los permisos en el destino de backup

df -h /u01/backup/
ls -la /u01/backup/

RMAN-06059: Expected archived log not found

Causa: Faltan archive logs necesarios para la recuperación
Solución: Verifica si los logs fueron eliminados. Si usas Data Guard, obtén del standby.

LIST ARCHIVELOG ALL;

ORA-01152: File not restored from a sufficiently old backup

Causa: El datafile es más nuevo que el backup siendo restaurado
Solución: Usa un backup más reciente o restaura a un punto posterior en el tiempo

RMAN-06004: Recovery Manager error

Causa: Muchas causas posibles
Solución: Revisa la pila completa de errores y el alert log de Oracle

tail -100 $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log

ORA-19809 / ORA-19804: Recovery area full

Causa: El Fast Recovery Area (FRA) ha alcanzado su límite de tamaño
Solución: Elimina backups obsoletos, aumenta el tamaño del FRA, o mueve backups a cinta

-- Check FRA usage
SELECT * FROM V$RECOVERY_FILE_DEST;

-- Delete obsolete backups to free space
RMAN> DELETE OBSOLETE;

-- Or increase FRA size
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 200G;

RMAN-06023: No backup or copy of datafile found

Causa: RMAN no puede encontrar un backup para el datafile solicitado
Solución: Verifica que el backup existe y es accesible; cataloga backups si fueron reubicados

-- List available backups
LIST BACKUP OF DATAFILE 4;

-- Catalog backups from a directory (if moved)
CATALOG START WITH '/new/backup/location/';

📋 Referencia Rápida: Hoja de Trucos RMAN

¡Guarda esto para tu pared! 📌

🛡️ REFERENCIA RÁPIDA RMAN

CONNECT

rman target /
rman target sys/pwd@db catalog rman/pwd@catdb

BACKUP

BACKUP DATABASE PLUS ARCHIVELOG;
BACKUP INCREMENTAL LEVEL 0 DATABASE;
BACKUP INCREMENTAL LEVEL 1 DATABASE;
BACKUP AS COMPRESSED BACKUPSET DATABASE;
BACKUP TABLESPACE users;
BACKUP CURRENT CONTROLFILE;

RESTORE & RECOVER

RESTORE DATABASE;
RECOVER DATABASE;
RESTORE TABLESPACE users;
RECOVER TABLESPACE users;

REPORTING

LIST BACKUP;
LIST BACKUP OF DATABASE;
REPORT NEED BACKUP;
REPORT OBSOLETE;
REPORT SCHEMA;

MAINTENANCE

CROSSCHECK BACKUP;
DELETE OBSOLETE;
DELETE EXPIRED BACKUP;

VALIDATION

VALIDATE DATABASE;
VALIDATE BACKUPSET 123;
RESTORE DATABASE VALIDATE;
RESTORE DATABASE VALIDATE CHECK LOGICAL;

CONFIGURATION

SHOW ALL;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE BACKUP OPTIMIZATION ON;

ENCRYPTION

CONFIGURE ENCRYPTION FOR DATABASE ON;
SET ENCRYPTION ON IDENTIFIED BY 'password' ONLY;
SET DECRYPTION IDENTIFIED BY 'password';

MULTITENANT (CDB/PDB)

BACKUP PLUGGABLE DATABASE pdb1;
RESTORE PLUGGABLE DATABASE pdb1;
RECOVER PLUGGABLE DATABASE pdb1;
BACKUP TABLESPACE pdb1:users;

🎯 Conclusión: Tu Viaje con RMAN Comienza Aquí

RMAN puede parecer intimidante al principio, pero es genuinamente una de las herramientas más poderosas en el arsenal de un DBA. Lo que cubrimos hoy:

  • Qué es RMAN — La solución integrada de backup y recuperación de Oracle
  • Arquitectura — Cómo funcionan juntos todos los componentes
  • Conceptos fundamentales — Backup sets, image copies, canales, incrementales
  • Comandos esenciales — Backup, restore, recover, list, report
  • Escenarios de recuperación — Desde archivo único hasta punto en tiempo
  • Mejores prácticas — Consejos que separan buenos DBAs de los excelentes
  • Temas avanzados — Encriptación, CDB/PDB, Data Guard, integración Cloud
  • Automatización — Scripts de backup listos para producción

Tus Próximos Pasos

  1. Configura un entorno de pruebas — ¡Nunca practiques en producción!
  2. Ejecuta tu primer backupBACKUP DATABASE PLUS ARCHIVELOG;
  3. Prueba la recuperación — Restaura en una ubicación diferente
  4. Documenta tus procedimientos — Tu yo del futuro te lo agradecerá
  5. Automatiza con scripts — Programa backups con cron/Task Scheduler
"Los backups no valen nada. Las restauraciones no tienen precio." — Cada DBA que ha pasado por un desastre

El mejor momento para aprender RMAN fue ayer. El segundo mejor momento es ahora mismo.

💡 Cuando RMAN No Puede Ayudar

RMAN es poderoso, pero cuando los backups fallan o no existen, necesitas herramientas especializadas. DBRECOVER for Oracle puede extraer datos directamente de datafiles corruptos sin requerir una instancia en ejecución, control files o redo logs — el último recurso para la recuperación de bases de datos.