Respaldo Oracle Database integrado con RMAN. Hot backup, archive log streaming, PITR al SCN, soporte Data Guard primario/standby, RAC y PDB multi-tenant.
- Integración RMAN nativa — control de catálogo, validación BLOCKRECOVER automática.
- Archive log streaming continuo — RPO cerca de cero.
- PITR al SCN — restauración precisa por número de transacción Oracle.
- Data Guard-aware — respaldo desde standby, cero overhead en primario.
- RAC y multi-tenant (PDB) — respaldo individual de PDB, restore a otro CDB.
Producción en 30 días, al menos 50% más barato. Trial gratuito, RPMs y DEBs firmados, soporte directo con Heitor Faria. Reemplace su licencia Veeam, Commvault o Bacula Enterprise sin romper la ventana nocturna.
Solicitar trial gratuito de 30 días →
OFERTA COMERCIAL — LEA ESTO PRIMERO
¿Está migrando desde Bacula Enterprise, Veeam, Commvault o NetBackup? Traiga su cotización de renovación o propuesta de contrato vigente y le garantizamos un descuento mínimo del 50% — con significativamente más funcionalidades incluidas de serie.
| Canal | Contacto | |———|———| | Correo electrónico | heitor@opentechs.lat | | Teléfono / WhatsApp (internacional) | +1 786 726-1749 | | Teléfono / WhatsApp (Brasil) | +55 61 98268-4220 |
Tabla de Contenidos
- Resumen Ejecutivo
- El Problema
- Descripción General de la Solución
- Arquitectura
- Tabla Comparativa de Funcionalidades
- Referencia de Opciones de Backup
- Referencia de Opciones de Restauración
- Ejemplos de Configuración de FileSet
- Ejemplos de Job de Restauración
- Guía de Instalación y Dimensionamiento
- Matriz de Compatibilidad
- Informe de Rendimiento
- Seguridad y Cumplimiento Normativo
- Soporte y Condiciones Comerciales
- Apéndice A — Registros de Decisiones de Arquitectura
- Apéndice B — Glosario
1. Resumen Ejecutivo
¿Qué es?
El Plugin de Backup y Replicación de OracleDB de PodHeitor para PodHeitor Backup es un plugin para el File Daemon de Bacula de nivel productivo y acabado comercial que ofrece protección integral de bases de datos Oracle — desde backups en caliente mediante RMAN SBT v2 hasta protección de datos continua (CDP) y replicación nativa de recuperación ante desastres — a una fracción del costo de las alternativas propietarias.
Escrito íntegramente en Rust (construido en Rust con seguridad de memoria nativa y cero dependencias de runtime), el plugin se distribuye como un único paquete RPM o DEB (menos de 700 KB instalado) y no requiere bibliotecas de terceros específicas de Oracle, implementaciones propietarias de SBT ni scripts de shell externos a Bacula.
Valor de Negocio en Tres Puntos
- Reducción de costos superior al 50%. El backup de bases de datos Oracle es una de las partidas más costosas en cualquier presupuesto de TI empresarial. Bacula Enterprise cobra tarifas de licencia por cliente o por agente que se acumulan con cada instancia Oracle que se protege. Veeam, Commvault y NetBackup añaden licencias de agente, módulos adicionales y mantenimiento anual. PodHeitor ofrece todas las capacidades de esas plataformas — y varias que ellas no tienen — a un precio fijo por organización (sin cobro por socket ni por TB).
- Más funcionalidades, no menos. Esta no es una alternativa de código abierto recortada. El plugin supera a Bacula Enterprise 18.2.3 en protección de datos continua (modo daemon CDP), replicación DR nativa para Standard Edition 2 (archivelog-apply), observabilidad con Prometheus/OpenTelemetry, detección de canary anti-ransomware, validación automatizada con DBVERIFY tras la restauración e integridad de la cadena de suministro mediante CycloneDX SBOM. Bacula Enterprise no incluye ninguna de estas características.
- Automatización de restauración nativa de Bacula. Los productos competidores requieren que un operador acceda por SSH al host Oracle e invoque un script Perl (
bs_oracle_restore.pl) o un wrapper de shell equivalente — fuera de cualquier pista de auditoría. PodHeitor utiliza el mecanismo incorporado de RestoreObject de Bacula: un documentopluginrestoreconfincluido en cada backup desencadena una restauración completamente automatizada y catalogada directamente desdebconsoleo la consola web de Bacularis. No se requiere SSH al host Oracle.
Quién Debe Leer Este Documento
- DBAs de Oracle que evalúan estrategias de backup para cargas de trabajo de 11g hasta 23ai.
- Administradores de Bacula que buscan reemplazar un plugin comercial de Oracle sin rediseñar su infraestructura.
- Arquitectos de Infraestructura que diseñan pipelines de recuperación ante desastres y replicación de datos para entornos Oracle Standard Edition 2 o Enterprise Edition.
- Equipos de Adquisiciones de TI que comparan costos de licencias y paridad de funcionalidades con Bacula Enterprise, Veeam for Oracle, Commvault IntelliSnap Oracle y NetBackup for Oracle.
2. El Problema
El Backup de Oracle es Singularmente Complejo
El backup de Oracle Database no es como respaldar un sistema de archivos o una base de datos relacional simple. Un backup correcto de Oracle debe contemplar:
- Consistencia de SCN — los backups que abarcan múltiples datafiles deben ser consistentes en el mismo System Change Number o producirán un conjunto irrecuperable.
- Integridad de la cadena de archivelogs — la recuperación a un punto en el tiempo requiere una secuencia ininterrumpida de redo logs archivados desde el último backup Full hasta el momento objetivo.
- Controlfile y SPFILE — la base de datos no puede montarse sin estos archivos; deben respaldarse de forma atómica junto con cada backup de datafiles.
- Multitenant (CDB/PDB) — Oracle 12c y versiones posteriores permiten cientos de bases de datos conectables dentro de un contenedor; una estrategia de backup debe abordar tanto el contenedor raíz como los PDBs individuales de forma independiente.
- Cifrado TDE — los wallets de Transparent Data Encryption deben respaldarse y rotarse de forma coordinada o la restauración se vuelve imposible.
- ASM y RAC — Grid Infrastructure añade abstracción de almacenamiento (ASM) y paralelismo en clúster (RAC) que las herramientas de backup genéricas no pueden ver.
RMAN (Recovery Manager) es el motor de backup nativo de Oracle y la única herramienta que aborda plenamente todos estos requisitos. Cualquier solución de backup de Oracle creíble debe integrarse con RMAN a un nivel profundo — no ejecutando rman target / y archivando los archivos de salida como si fueran objetos arbitrarios del sistema de archivos.
El Problema del Costo
| Producto | Costo Típico de Backup Oracle | Notas |
|---|---|---|
| Bacula Enterprise | US$ 3.000–US$ 8.000 / año por host Oracle | Módulo Oracle adicional sobre la licencia base del FD |
| Veeam for Oracle | US$ 2.500–US$ 6.000 / año por socket | Requiere Veeam Backup & Replication Enterprise Plus |
| Commvault IntelliSnap Oracle | US$ 5.000–US$ 15.000 / año por host | Licencia de agente + IntelliSnap |
| NetBackup for Oracle | US$ 4.000–US$ 12.000 / año por host | Licencia de cliente NBU + agente de BD |
| PodHeitor | Tarifa fija por organización (sin costo por host) | Soporte comercial disponible del autor |
Los rangos de precios son indicativos, basados en precios de lista públicamente disponibles e informes de la comunidad a partir de 2026. Los precios negociados reales varían. El punto central es claro: para una organización que protege 10 hosts Oracle, el ahorro anual en comparación con cualquier solución propietaria oscila entre US$ 25.000 y US$ 150.000.
El Problema de la Restauración — El Costo Oculto
El costo de las herramientas propietarias de backup de Oracle no es solo la tarifa de licencia. El costo oculto es la complejidad de la restauración.
Bacula Enterprise 18.2.3 incluye un script Perl llamado bs_oracle_restore.pl. Para realizar una recuperación a un punto en el tiempo, un DBA debe:
- Acceder por SSH al host Oracle (requiere acceso al sistema operativo, VPN y gestión de claves).
- Localizar la versión correcta de
bs_oracle_restore.pl(cambia entre versiones de Bacula). - Ejecutar el script con los parámetros correctos — una docena de indicadores sin validación interactiva.
- Confiar en que el script genere los comandos RMAN correctos para el timestamp objetivo.
- Monitorear el progreso directamente en el host Oracle — sin entrada en el catálogo de Bacula para la operación de restauración.
- Abrir manualmente la base de datos con RESETLOGS si el script no lo hace automáticamente.
Este flujo de trabajo es propenso a errores, no es auditable y requiere acceso a nivel del sistema operativo que la mayoría de las políticas de seguridad prohíben otorgar a los DBAs de capa de aplicación.
PodHeitor elimina todo esto. El flujo completo de restauración — incluidas las acciones de PITR, basada en SCN, a nivel de tabla, clonación y validación — se gestiona desde bconsole o el formulario web de Bacularis, con una pista de auditoría completa en el catálogo de Bacula y sin necesidad de acceso SSH al host Oracle.
La Brecha en Replicación y CDP
Ninguno de los cuatro principales productos competidores (Bacula Enterprise, Veeam, Commvault, NetBackup) incluye protección de datos continua (CDP) nativa ni replicación de recuperación ante desastres para Oracle Standard Edition 2 a nivel de base de datos sin licenciamiento adicional de Oracle (Active Data Guard requiere Oracle Enterprise Edition).
PodHeitor incluye:
mode=cdp— un daemon que envía continuamente archivelogs al almacenamiento de Bacula, proporcionando un RPO de minutos en lugar de horas.mode=replicateconreplicate_method=archivelog_apply— un canal de replicación DR que funciona con Oracle Standard Edition 2, Oracle Express Edition y Oracle 23ai FREE, sin requerir licencia de Active Data Guard.
3. Descripción General de la Solución
Qué Ofrece el Plugin
El Plugin de Backup OracleDB de PodHeitor integra PodHeitor Backup con Oracle RMAN mediante una implementación de sala limpia de la API Oracle SBT v2 (libobk-rs.so), ofreciendo cinco modos de backup diferenciados, restauración totalmente automatizada y replicación DR nativa — todo desde un único paquete RPM de 622 KB.
Cinco Modos de Backup
| Modo | Descripción | Requisito Oracle | Staging Requerido |
|---|---|---|---|
rman_sbt |
RMAN sin staging vía SBT v2 (libobk-rs). Recomendado para producción. |
11g R2+ | Ninguno — transmisión directa |
rman |
RMAN escribe en staging local; el backend transmite a Bacula. | 11g R2+ | Sí — disco temporal |
dump |
Backup lógico con Oracle Data Pump (expdp / impdp). |
11g R2+ (exp en 11g) |
Sí — disco temporal |
cdp |
Daemon continuo de archivelogs. Protección de bajo RPO. | 11g R2+ | Ninguno |
replicate |
Replicación DR mediante Active DG duplicate o archivelog-apply. | SE2 o EE | Opcional |
Descripción General de la Arquitectura
┌─────────────────────────────────────────────────────────────┐
│ Bacula Director │
│ • Schedules jobs • Stores RestoreObjects │
│ • Manages catalog • Issues bconsole commands │
└─────────────────────────┬───────────────────────────────────┘
│ TCP (Bacula Protocol)
┌─────────────────────────▼───────────────────────────────────┐
│ Bacula File Daemon (FD 15.0.3+) │
│ • Loads podheitor-oracle-fd.so via plugin API │
│ • Dispatches bEventBackupCommand / bEventRestoreObject │
└─────────────────────────┬───────────────────────────────────┘
│ PTCOMM (fork + pipe)
┌─────────────────────────▼───────────────────────────────────┐
│ podheitor-oracle-backend (Rust, musl static-pie) │
│ • Backup dispatcher • Restore engine • CDP daemon │
│ • Metrics (Prometheus) • Canary sampler • Audit logger │
└────────────┬──────────────────────────────────┬────────────┘
│ subprocess + UNIX socket │ subprocess
┌────────────▼────────────┐ ┌─────────────▼───────────┐
│ RMAN (SBT mode) │ │ sqlplus / expdp / dbv │
│ → libobk-rs.so (SBT v2)│ │ (non-SBT modes) │
│ → UNIX socket back │ │ │
│ to backend │ │ │
└─────────────────────────┘ └─────────────────────────┘
│
┌────────────▼────────────┐
│ Oracle Database │
│ (11g R2 → 23ai) │
└─────────────────────────┘
Automatización de Restauración mediante RestoreObject
Cada backup incluye un RestoreObject pluginrestoreconf en el catálogo de Bacula. En el momento de la restauración, el operador selecciona una acción en bconsole o en el formulario web de Bacularis — no se requiere SSH al host Oracle. El plugin valida la configuración, genera el script RMAN apropiado, ejecuta opcionalmente un RESTORE PREVIEW, lleva a cabo la restauración y escribe un manifiesto post-restauración en el catálogo.
Replicación DR — Nativa
mode=replicate con replicate_method=archivelog_apply crea una base de datos en standby mediante:
- Ejecución de RMAN DUPLICATE para crear la copia inicial en standby.
- Envío y aplicación continua de archivelogs al host standby.
Esto proporciona una protección equivalente a Active Data Guard sin requerir licencia de Oracle Enterprise Edition — una capacidad ausente en todos los productos competidores mencionados en este whitepaper.
4. Arquitectura
4.1 Diagrama de Componentes
┌─────────────────────────────────────────────────────────────────────────┐
│ PodHeitor Backup INFRASTRUCTURE │
│ │
│ ┌────────────────┐ TCP/TLS ┌──────────────────────────────────┐ │
│ │ bacula-dir │◄────────────►│ bacula-fd 15.0.3 │ │
│ │ (Director) │ │ │ │
│ │ • Catalog DB │ │ ┌────────────────────────────┐ │ │
│ │ • Scheduler │ │ │ podheitor-oracle-fd.so │ │ │
│ │ • RestoreObjs │ │ │ (C++ thin shim, ~3 KB) │ │ │
│ └────────────────┘ │ │ • Bacula Plugin API │ │ │
│ │ │ • fork() + pipe() │ │ │
│ ┌────────────────┐ TCP/TLS │ │ • PTCOMM encode/decode │ │ │
│ │ bacula-sd │◄────────────►│ └──────────┬─────────────────┘ │ │
│ │ (Storage) │ │ │ PTCOMM │ │
│ └────────────────┘ │ ┌──────────▼─────────────────┐ │ │
│ │ │ podheitor-oracle-backend │ │ │
│ │ │ (Rust, x86_64-musl, static) │ │ │
│ │ │ │ │ │
│ │ │ backup::run() │ │ │
│ │ │ ├── run_dump() │ │ │
│ │ │ ├── run_rman() │ │ │
│ │ │ ├── run_rman_sbt() │ │ │
│ │ │ ├── run_cdp() │ │ │
│ │ │ └── run_replicate() │ │ │
│ │ │ │ │ │
│ │ │ restore::run() │ │ │
│ │ │ └── run_rman_restore() │ │ │
│ │ │ │ │ │
│ │ │ oracle::sbt_server │ │ │
│ │ │ oracle::audit │ │ │
│ │ │ oracle::canary │ │ │
│ │ │ metrics::http_server │ │ │
│ │ └──────────┬─────────────────┘ │ │
│ └─────────────┼──────────────────── ┘ │
└────────────────────────────────────────────────┼────────────────────────┘
│
┌────────────────────────┼──────────────────────┐
│ Oracle Host │ │
│ │ UNIX socket │
│ ┌──────────────────────▼──────────────────┐ │
│ │ /var/run/podheitor-oracle/<SID>.sock │ │
│ └──────────────────────┬──────────────────┘ │
│ │ SBT v2 │
│ ┌──────────────────────▼──────────────────┐ │
│ │ libobk-rs.so (clean-room SBT v2 plugin nativo) │ │
│ │ symlinked as $ORACLE_HOME/lib/libobk.so │ │
│ └──────────────────────┬──────────────────┘ │
│ │ SBT v2 │
│ ┌──────────────────────▼──────────────────┐ │
│ │ RMAN (Oracle Recovery Manager) │ │
│ │ N channels, parallel streams │ │
│ └──────────────────────┬──────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────┐ │
│ │ Oracle Database (SID=<SID>) │ │
│ │ • Datafiles • Archivelogs • Controlfile │ │
│ │ • SPFILE • TDE Wallet • PDBs │ │
│ └─────────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
4.2 mode=rman_sbt Flujo de Datos (Sin Staging, Recomendado)
4.3 mode=cdp — Bucle del Daemon de Protección de Datos Continua
4.4 Flujo de Restauración — RestoreObject → RMAN
4.5 Decisiones Tecnológicas
| Componente | Tecnología | Justificación |
|---|---|---|
| Binario backend | Rust 2021, musl static-pie | Seguridad de memoria, sin dependencias en tiempo de ejecución, implementación en un solo archivo |
| Shim FD | C++ (Bacula Plugin API) | Bacula requiere un ABI de plugin C/C++ |
| Protocolo IPC | PTCOMM (binario, fork+pipe) | Sin sobrecarga de socket de red; enmarcado determinista |
| Implementación SBT | libobk-rs (plugin nativo Rust de sala limpia) |
Proprietary; sin código propietario de Oracle linkado |
| IPC SBT ↔ backend | UNIX socket /var/run/podheitor-oracle/<SID>.sock |
Baja latencia, mismo host, aislamiento por SID |
| Persistencia de estado | Archivos JSON, /opt/bacula/working/oracle-state/<SID>/ |
Legible por humanos, escritura atómica con renombre |
| Observabilidad | Formato texto Prometheus, TCP stdlib | Endpoint nativo, sin dependencias externas |
| Limitación de I/O | cgroups v2 io.max |
Aplicado por el kernel, sin conjeturas sobre la tasa de RMAN |
| Licencia | PodHeitor-Proprietary | Copyright © Heitor Faria — All rights reserved |
5. Tabla Comparativa de Funcionalidades
La siguiente tabla compara PodHeitor v1.0.0 con Bacula Enterprise 18.2.3, Veeam Backup & Replication for Oracle, Commvault IntelliSnap Oracle y NetBackup for Oracle.
Leyenda: Y = Sí/Soportado | N = No/No soportado | M = Manual/Requiere pasos adicionales | P = Parcial | EE = Requiere Oracle Enterprise Edition
5.1 Modos de Backup
| Funcionalidad | Bacula Enterprise 18.2.3 | Veeam | Commvault | NetBackup | PodHeitor 1.0.0 |
|---|---|---|---|---|---|
| RMAN SBT v2 (sin staging) | Y (libobk.so propietaria) | N | N | Y (nbora) | Y (libobk-rs.so de sala limpia, Proprietary) |
| RMAN sin SBT (con staging) | Y | N | P | P | Y + opción FIFO sin staging |
Data Pump (expdp) |
P (vía dump_pump_opt) | N | N | N | Y (predeterminado en 12c+) |
| exp legado (11g) | Y | N | N | N | Y |
| Archivelog continuo (CDP) | N | N | N | N | Y (modo daemon, mode=cdp) |
| Replicación DR (compatible SE2) | N | N | N | N | Y (archivelog_apply) |
| Active DG duplicate | N (licencia sep.) | N | N | EE | Y (duplicate_active, sin licencia adicional) |
5.2 Backup Incremental y Avanzado
| Funcionalidad | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Incremental Nivel 0/1 RMAN | Y | Y | Y | Y | Y |
| Incremental FROM SCN | Y | N | N | P | Y + detector de brecha SCN + reanudación |
| Block Change Tracking | Y (manual) | Y | Y | Y | Y (habilitación automática + verificación de integridad) |
| Backup de archivelogs | Y | Y | Y | Y | Y |
| Autobackup de controlfile | Y | Y | Y | Y | Y |
| Backup de SPFILE / pfile / orapw | Y | N | N | P | Y |
| Multicanal en paralelo | Y (ALLOCATE manual) | Y | Y | Y | Y (ajuste automático por núcleos CPU/IOPS) |
| Checkpoint / reanudación | N | N | N | N | Y (ADR-014, cadena SCN) |
| Política de eliminación de archivelogs | N | N | N | N | Y (archivelog_keep_backed_up=N) |
| Snapshot AWR al final del Full | N | N | N | N | Y (awr_snapshot=yes) |
5.3 Topología y Multitenant
| Funcionalidad | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Oracle 11g R2 | Y | N | P | Y | Y |
| Oracle 12c / 18c / 19c / 21c | Y | Y | Y | Y | Y |
| Oracle 23ai | P | P | N | P | Y (validado en producción) |
| Autodescubrimiento RAC | M | N | Y | Y | Y (automático + paralelo por nodo) |
| Multitenant CDB/PDB | Y (implícito) | Y | Y | Y | Y (paralelo por PDB + selectivo) |
| Puerta de rol Data Guard | Y (implícito) | N | P | Y | Y (prefer_standby=no/yes/auto) |
| Manejo de rutas ASM | Y | Y | Y | Y | Y (resolución asmcmd + filtro dbv) |
| Restauración entre arquitecturas (Solaris→Linux) | M (manual) | N | N | P | Y (RMAN CONVERT DATAFILE automático) |
| Backup de wallet TDE | Y | P | P | P | Y (con conciencia de rotación de clave maestra) |
5.4 Automatización de Restauración
| Funcionalidad | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Restauración sin SSH al host Oracle | N | N | N | N | Y (solo bconsole) |
| Pista de auditoría en catálogo Bacula | N | N | N | N | Y (JobLog completo + manifiesto) |
| PITR (recuperación a punto en el tiempo) | M (script perl) | M | M | M | Y (1 paso, action=pitr) |
| Restauración basada en SCN | M | N | N | M | Y (1 paso, action=scn) |
| Recuperación a nivel de tabla (12c+) | M | N | N | M | Y (1 paso, action=table) |
| Clonación a host/SID diferente | M (beta) | M | M | M | Y (action=clone) |
| RESTORE PREVIEW antes de ejecutar | N | N | N | N | Y (preview_first=yes) |
| VALIDATE DATABASE tras restauración | N | N | N | N | Y (verify_after=yes) |
| Modo de prueba en seco | N | N | N | N | Y (dry_run=yes) |
| Flashback Database | N | N | N | N | Y (action=flashback) |
| Formulario web Bacularis para restauración | N | N/A | N/A | N/A | Y (integración nativa con Bacularis) |
5.5 Compresión y Limitación de Ancho de Banda
| Funcionalidad | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| RMAN BASIC/MEDIUM/HIGH | Y | Y | Y | Y | Y |
| zstd / lz4 pre-SBT pipe | N | N | N | N | Y (opción de doble compresión) |
| Limitación RMAN RATE | Y | Y | Y | Y | Y |
| Limitación I/O cgroups v2 | N | N | N | N | Y (cgroup_write_bps=) |
5.6 Observabilidad y Cadena de Suministro
| Funcionalidad | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Endpoint Prometheus /metrics | N | N | N | N | Y (metrics_addr=host:port) |
| Canary anti-ransomware | N | Y (separado) | Y (separado) | Y (separado) | Y (integrado, muestreo de hash de bloque) |
| Redacción de credenciales en log de auditoría | N | N | N | N | Y (contraseñas/claves nunca aparecen en logs) |
| DBVERIFY post-restauración | N | N | N | N | Y (automatizado) |
| Verificación previa en modo prueba seca | N | N | N | N | Y (indicador –dry-run) |
| Builds reproducibles | N (propietario) | N | N | N | Y (musl static-pie, Cargo.lock) |
| SBOM (CycloneDX) | N | N | N | N | Y (make sbom) |
| Auditoría CVE (cargo-audit + cargo-deny) | N | N | N | N | Y (0 CVEs, 78 dependencias crate) |
6. Referencia de Opciones de Backup
Todos los parámetros se especifican en la directiva Plugin = de Bacula dentro de un bloque FileSet. Los parámetros también pueden colocarse en el archivo de configuración (predeterminado: /opt/bacula/etc/podheitor-oracle.conf) como líneas clave=valor — los parámetros de la línea del plugin siempre prevalecen sobre los valores del archivo de configuración.
6.1 Conexión e Identidad
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | ||
|---|---|---|---|---|---|---|
sid |
string | * (todos los detectados) |
Oracle SID (nombre de instancia). Use * para detectar automáticamente todas las instancias en ejecución. |
1.0.0 | ||
oracle_home |
ruta | auto |
Ruta $ORACLE_HOME. auto lee desde /etc/oratab u oraenv. |
1.0.0 | ||
oracle_user |
string | / as sysdba |
Usuario del sistema operativo con el que conectarse. Establezca oracle para autenticación del SO. |
1.0.0 | ||
unix_user |
string | oracle |
Cuenta del SO a la que cambia el backend antes de lanzar RMAN/sqlplus. | 1.0.0 | ||
use_sudo |
bool | no |
Prefija los comandos oracle con sudo -u <unix_user> en lugar de setuid. |
1.0.0 | ||
auth |
os |
pwfile:<path> |
walletconn:<alias> |
os |
Método de autenticación. os = / as sysdba. pwfile: = archivo de contraseña. walletconn: = alias TNS de Oracle Wallet. |
1.0.0 |
config_file |
ruta | /opt/bacula/etc/podheitor-oracle.conf |
Ruta alternativa al archivo de configuración. | 1.0.0 | ||
instance |
string | * |
Filtro de instancia RAC. * = todas las instancias. |
1.0.0 | ||
verbose |
0–3 | 0 |
Nivel de detalle en el log de Job de Bacula. | 1.0.0 | ||
debug |
0–9 | 0 |
Nivel de depuración; ≥5 habilita volcados de frame PTCOMM. | 1.0.0 | ||
trace |
ruta | « | Escribe el log de trazas en un archivo (además del log de Job de Bacula). | 1.0.0 |
6.2 Modo de Backup
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | ||||
|---|---|---|---|---|---|---|---|---|
mode |
rman_sbt |
rman |
dump |
cdp |
replicate |
dump |
Modo de backup. rman_sbt es el recomendado para producción. |
1.0.0 |
6.3 Opciones RMAN (aplicables a mode=rman y mode=rman_sbt)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | ||
|---|---|---|---|---|---|---|
channels |
auto |
1–64 | auto |
Número de canales de backup RMAN. auto se ajusta al número de núcleos CPU. |
1.0.0 | |
auto_tune_channels |
bool | yes |
Cuando channels=auto, ajusta dinámicamente el número de canales según los núcleos disponibles. |
1.0.0 | ||
bct |
auto |
on |
off |
auto |
Block Change Tracking. auto lo habilita si no está habilitado. |
1.0.0 |
archivelog |
include |
exclude |
only |
include |
Manejo de archivelogs. include = respaldar después de los datafiles. only = backup solo de archivelogs. |
1.0.0 |
archivelog_keep_backed_up |
0–99 | 0 |
Elimina archivelogs del FRA después de N copias de backup. 0 = deshabilitado. | 1.0.0 | ||
max_rate_mb |
0–99999 | 0 (sin límite) |
Límite de velocidad por canal RMAN en MB/seg. 0 = sin límite (use cgroup_write_bps para limitación basada en cgroups). |
1.0.0 | ||
ctrlfile |
ruta | /tmp/oracle |
Prefijo de ruta de staging para el autobackup del controlfile. | 1.0.0 | ||
hooks_dir |
ruta | /opt/bacula/etc |
Directorio analizado en busca de scripts hook oracle_before_*.rman / oracle_after_*.rman. |
1.0.0 |
6.4 Compresión
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
compress |
none |
zstd |
lz4 |
gzip |
rman_basic |
rman_medium |
rman_high |
zstd |
Algoritmo de compresión. rman_* usa compresión nativa RMAN dentro del bloque RMAN. zstd/lz4/gzip aplica compresión a nivel de pipe antes de enviar a Bacula. |
1.0.0 |
compress_level |
1–22 (zstd), 1–9 (gzip) | 3 |
Nivel de compresión (aplica solo a zstd y gzip). | 1.0.0 |
6.5 Canales y Paralelismo
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | ||
|---|---|---|---|---|---|---|
parallel_dbs |
1–64 | 4 |
Máximo de bases de datos a respaldar en paralelo (cuando sid=*). |
1.0.0 | ||
parallel_pdbs |
1–64 | 4 |
Máximo de PDBs a respaldar en paralelo dentro de un CDB. | 1.0.0 | ||
parallel_nodes |
0–64 | 0 (todos) |
Máximo de nodos RAC a usar concurrentemente. 0 = todos los descubiertos. | 1.0.0 | ||
prefer_standby |
no |
yes |
auto |
no |
Puerta de rol Data Guard. no = backup solo en PRIMARY. yes = requerir standby físico. auto = ejecutar en cualquier rol con capacidad física. |
1.0.0 |
6.6 Multitenant (CDB/PDB)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | |
|---|---|---|---|---|---|
pdbs |
* |
nombres separados por coma | * |
Filtro de nombre de PDB. * = todos los PDBs. Ejemplo: pdbs=PDB1,PDB2. |
1.0.0 |
pdb_skip_seed |
bool | yes |
Omite PDB$SEED (el PDB semilla de solo lectura) en los backups multitenant. |
1.0.0 | |
exclude_tablespace |
nombres separados por coma | « | Nombres de tablespace a excluir del backup. | 1.0.0 | |
exclude_pdb |
nombres separados por coma | « | Nombres de PDB a excluir del backup. | 1.0.0 |
6.7 Wallet TDE
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | |
|---|---|---|---|---|---|
wallet_backup |
bool | yes |
Incluye el backup del wallet TDE en el Job. | 1.0.0 | |
wallet_path |
ruta | auto |
auto |
Ruta al directorio de Oracle Wallet. auto lee desde sqlnet.ora. |
1.0.0 |
wallet_passphrase_file |
ruta | « | Archivo que contiene la frase de contraseña para abrir el wallet. Los permisos deben ser 600. | 1.0.0 |
6.8 Data Pump (mode=dump)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | |
|---|---|---|---|---|---|
dump_format |
expdp |
exp |
expdp |
Usa Data Pump (expdp) o exportación legada (exp). Forzado a exp en 11g. |
1.0.0 |
dump_opt |
string | CONSISTENT=Y GRANTS=y |
Opciones adicionales añadidas a la línea de comandos de exp. |
1.0.0 | |
dump_pump_opt |
string | « | Opciones adicionales añadidas al parfile de expdp (p. ej. EXCLUDE=STATISTICS). |
1.0.0 | |
schema |
* |
separados por coma | * |
Filtro de schema (propietario) para la exportación con Data Pump. * = todos los schemas. |
1.0.0 |
6.9 Protección de Datos Continua (mode=cdp)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde |
|---|---|---|---|---|
cdp_poll_interval |
1–3600 (segundos) | 5 |
Frecuencia (en segundos) con la que el daemon CDP consulta v$archived_log en busca de nuevos logs. |
1.0.0 |
cdp_max_lag |
1–86400 (segundos) | 300 |
Umbral de alarma de RPO en segundos. Activa PODHEITOR-ORACLE-AUDIT kind=cdp_lag_exceeded cuando se supera. |
1.0.0 |
6.10 Replicación (mode=replicate)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | |
|---|---|---|---|---|---|
replicate_method |
duplicate_active |
archivelog_apply |
duplicate_active |
duplicate_active = RMAN DUPLICATE FROM ACTIVE DATABASE (EE). archivelog_apply = bootstrap + aplicación continua de logs (compatible con SE2). |
1.0.0 |
target_sid |
string | « | SID de la base de datos standby (requerido para el modo replicate). | 1.0.0 | |
target_host |
string | « | FQDN o IP del host standby. | 1.0.0 | |
target_oracle_home |
ruta | « | $ORACLE_HOME en el host standby. |
1.0.0 |
6.11 Validación (verificación de integridad post-backup)
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde |
|---|---|---|---|---|
validate_after |
bool | yes |
Ejecuta RMAN VALIDATE BACKUPSET al finalizar cada Job de backup. |
1.0.0 |
6.12 Canary Anti-Ransomware
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde |
|---|---|---|---|---|
canary |
bool | no |
Habilita el canary de muestreo de hash de bloque. Detecta cambios masivos en datafiles entre ejecuciones de backup. | 1.0.0 |
canary_blocks |
1–4096 | 64 |
Número de bloques aleatorios muestreados por datafile en cada verificación canary. | 1.0.0 |
canary_threshold_pct |
1–100 | 25 |
Porcentaje de bloques modificados que activa un mensaje PODHEITOR-ORACLE-CANARY-ALERT. |
1.0.0 |
6.13 Observabilidad
| Parámetro | Tipo / Valores Válidos | Predeterminado | Descripción | Desde | |
|---|---|---|---|---|---|
metrics_addr |
host:port |
0 |
0 (deshabilitado) |
Dirección de enlace para el endpoint HTTP /metrics de Prometheus. Ejemplo: 0.0.0.0:9119. |
1.0.0 |
cgroup_write_bps |
0–(uint64) | 0 (deshabilitado) |
Limitación de escritura I/O cgroups v2 en bytes/seg. Requiere que el proceso backend esté en una jerarquía cgroup v2. | 1.0.0 | |
awr_snapshot |
bool | no |
Crea un snapshot AWR al final de cada backup Full y escribe el informe de rendimiento HTML en el directorio de estado. No es fatal en XE/SE2. | 1.0.0 | |
goldengate_aware |
bool | no |
Detecta procesos GoldenGate activos y emite su checkpoint de SCN antes de cada backup. | 1.0.0 |
6.14 Hooks
Los archivos hook se colocan en hooks_dir (predeterminado /opt/bacula/etc). El backend analiza los archivos que coinciden con estos patrones antes y después de la ejecución de RMAN:
| Archivo Hook | Disparador | Notas |
|---|---|---|
oracle_before_full_backup.rman |
Antes del backup Full RMAN | Nomenclatura compatible con Enterprise |
oracle_after_full_backup.rman |
Después del backup Full RMAN | Extensión: los hooks after son exclusivos de PodHeitor |
oracle_before_incremental_backup.rman |
Antes del backup Incremental | |
oracle_after_incremental_backup.rman |
Después del backup Incremental | |
oracle_before_full_backup_<SID>.rman |
Antes del Full — específico por SID | Tiene prioridad sobre el hook genérico |
oracle_after_full_backup_<SID>.rman |
Después del Full — específico por SID |
7. Referencia de Opciones de Restauración
Las opciones de restauración se entregan mediante el RestoreObject pluginrestoreconf, que queda embebido en cada backup y se presenta como prompts interactivos en bconsole o como formulario en Bacularis. Las claves siguen la sintaxis INI clave = valor con comentarios mediante #.
7.1 Campos Principales (todas las acciones)
| Clave | Tipo / Valores válidos | Predeterminado | Descripción | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
action |
pitr |
scn |
table |
clone |
full |
preview |
validate |
flashback |
preview |
Acción de restauración a ejecutar. Requerido. |
auto_open_resetlogs |
bool | yes |
Emite automáticamente ALTER DATABASE OPEN RESETLOGS tras RECOVER DATABASE. |
|||||||
shutdown_if_open |
bool | yes |
Emite SHUTDOWN IMMEDIATE antes de la restauración si la base de datos está abierta. |
|||||||
parallelism |
auto |
1–64 | auto |
Número de canales de restauración RMAN. auto iguala el número de canales del backup original. |
||||||
verify_after |
bool | yes |
Ejecuta RMAN VALIDATE DATABASE CHECK LOGICAL + DBVERIFY después de la restauración. |
|||||||
preview_first |
bool | no |
Ejecuta RESTORE DATABASE PREVIEW antes de efectuar la restauración. Genera un plan sin modificar la base de datos. |
|||||||
require_explicit_confirmation |
bool | yes |
Para acciones destructivas, solicita al operador escribir yes en bconsole antes de continuar. |
|||||||
dry_run |
bool | no |
Analiza y valida la configuración, genera el script RMAN, lo imprime en el log del job, pero no lo ejecuta. |
7.2 action=pitr — Recuperación a un Punto en el Tiempo
| Clave | Tipo / Valores válidos | Predeterminado | Descripción |
|---|---|---|---|
target_time |
YYYY-MM-DD_HH:MM:SS |
— | Requerido. Marca de tiempo objetivo de recuperación. Ejemplo: 2026-04-25_15:30:00. |
Bloque RMAN generado:
RUN {
SET UNTIL TIME "TO_DATE('2026-04-25 15:30:00','YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
Ejemplo de pluginrestoreconf:
action = pitr
target_time = 2026-04-25_15:30:00
preview_first = yes
verify_after = yes
shutdown_if_open = yes
parallelism = 4
7.3 action=scn — Recuperación Basada en SCN
| Clave | Tipo / Valores válidos | Predeterminado | Descripción |
|---|---|---|---|
target_scn |
entero positivo | — | Requerido. Número de cambio de sistema (SCN) objetivo. Ejemplo: 2090264. |
Bloque RMAN generado:
RUN {
SET UNTIL SCN 2090264;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
Ejemplo de pluginrestoreconf:
action = scn
target_scn = 2090264
dry_run = no
7.4 action=table — Recuperación a Nivel de Tabla (Oracle 12c+)
| Clave | Tipo / Valores válidos | Predeterminado | Descripción |
|---|---|---|---|
table_owner |
cadena | — | Requerido. Esquema (propietario) de la tabla. Ejemplo: SCOTT. |
table_name |
cadena | — | Requerido. Nombre de la tabla a recuperar. Ejemplo: EMP. |
auxiliary_destination |
ruta | — | Requerido. Ruta temporal en el sistema de archivos para la instancia auxiliar utilizada por RECOVER TABLE. |
Bloque RMAN generado:
RECOVER TABLE SCOTT.EMP
UNTIL TIME "TO_DATE('...')"
AUXILIARY DESTINATION '/u01/aux';
Ejemplo de pluginrestoreconf:
action = table
table_owner = SCOTT
table_name = EMP
auxiliary_destination = /u01/aux
target_time = 2026-04-24_12:00:00
7.5 action=clone — Clonar a un Host o SID Diferente
| Clave | Tipo / Valores válidos | Predeterminado | Descripción |
|---|---|---|---|
target_db_name |
cadena | — | Requerido. Nuevo nombre de base de datos (SID) para el clon. |
target_host |
FQDN o IP | — | Host destino del clon. Dejar vacío para clonar en el mismo host. |
target_oracle_home |
ruta | — | $ORACLE_HOME en el host destino. |
db_file_name_convert |
'/src/','/dst/' |
— | Pares DB_FILE_NAME_CONVERT de RMAN para traducción de rutas de archivos de datos. |
Ejemplo de pluginrestoreconf:
action = clone
target_db_name = ORCL_DR
target_host = 192.168.15.117
target_oracle_home = /u01/app/oracle/product/23ai/dbhome_1
db_file_name_convert = '/u01/oradata/ORCL/','/u01/oradata/ORCL_DR/'
log_file_name_convert = '/u01/fast_recovery_area/ORCL/','/u01/fast_recovery_area/ORCL_DR/'
7.6 action=full — Restauración Completa (Último Disponible)
No requiere claves adicionales. Restaura al conjunto de backup consistente más reciente.
Ejemplo de pluginrestoreconf:
action = full
preview_first = yes
verify_after = yes
shutdown_if_open = yes
7.7 action=preview — Vista Previa de Solo Lectura
Ejecuta RESTORE DATABASE PREVIEW SUMMARY y escribe el plan en el log del job de Bacula. No modifica la base de datos.
Ejemplo de pluginrestoreconf:
action = preview
7.8 action=validate — Validación de Base de Datos de Solo Lectura
Ejecuta VALIDATE DATABASE CHECK LOGICAL y DBVERIFY sobre todos los datafiles. Sin modificaciones; adecuado como verificación de salud programada.
Ejemplo de pluginrestoreconf:
action = validate
7.9 action=flashback — Flashback Database
| Clave | Tipo / Valores válidos | Predeterminado | Descripción |
|---|---|---|---|
target_scn |
entero positivo | — | Requerido. SCN objetivo para FLASHBACK DATABASE TO SCN. Destructivo: la base de datos regresa de forma irreversible. |
Ejemplo de pluginrestoreconf:
action = flashback
target_scn = 2090000
require_explicit_confirmation = yes
dry_run = no
8. Ejemplos de Configuración de FileSet
8.1 mode=rman_sbt — Mínimo (Punto de Partida Recomendado)
FileSet {
Name = "Oracle-RMAN-SBT-Minimal"
Include {
Options {
Signature = SHA256
Compression = none # plugin handles compression
}
Plugin = "podheitor-oracle:
sid=FREE
mode=rman_sbt
oracle_home=/opt/oracle/product/23ai/dbhome_1
auth=os
channels=auto
compress=zstd:3"
}
}
8.2 mode=rman_sbt — Configuración de Producción Completa con Validación y Canary
FileSet {
Name = "Oracle-RMAN-SBT-Production"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=rman_sbt
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
unix_user=oracle
channels=auto
compress=zstd:3
bct=auto
archivelog=include
archivelog_keep_backed_up=2
validate_after=yes
canary=on
canary_blocks=128
canary_threshold_pct=20
wallet_backup=yes
wallet_path=auto
metrics_addr=0.0.0.0:9119
hooks_dir=/opt/bacula/etc
verbose=1"
}
}
8.3 mode=rman — Sin SBT con Staging Local
FileSet {
Name = "Oracle-RMAN-Staging"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=rman
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
channels=4
staging=disk
staging_root=/u02/rman_staging
compress=rman_medium
bct=auto
archivelog=include"
}
}
8.4 mode=dump — Oracle Data Pump (Backup Lógico)
FileSet {
Name = "Oracle-DataPump"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=dump
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
dump_format=expdp
schema=*
dump_pump_opt=EXCLUDE=STATISTICS COMPRESSION=ALL
compress=zstd:3"
}
}
8.5 mode=cdp — Protección Continua de Archivelogs
FileSet {
Name = "Oracle-CDP"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=cdp
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
cdp_poll_interval=10
cdp_max_lag=120
compress=lz4
metrics_addr=0.0.0.0:9119"
}
}
Combine este FileSet con un job de Bacula de larga duración (Type=Backup, Level=Full). El daemon CDP se ejecuta hasta que el job de Bacula finaliza. Utilice Schedule con un RunWindow muy amplio o un job dedicado que se mantenga siempre activo.
8.6 mode=replicate — Aplicación de Archivelogs para Oracle Standard Edition 2
FileSet {
Name = "Oracle-Replicate-SE2"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=replicate
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
replicate_method=archivelog_apply
target_sid=ORCL_DR
target_host=192.168.15.117
target_oracle_home=/u01/app/oracle/product/19c/dbhome_1
channels=2
compress=zstd:3"
}
}
8.7 mode=replicate — Duplicado Activo con Data Guard (Oracle EE)
FileSet {
Name = "Oracle-Replicate-DG"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL
mode=replicate
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
replicate_method=duplicate_active
target_sid=ORCL_STBY
target_host=192.168.15.117
target_oracle_home=/u01/app/oracle/product/19c/dbhome_1
channels=4
compress=rman_medium"
}
}
8.8 Backup Selectivo Multi-PDB (Oracle 19c CDB)
FileSet {
Name = "Oracle-Multitenant-Selective"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=CDBPROD
mode=rman_sbt
oracle_home=/u01/app/oracle/product/19c/dbhome_1
auth=os
pdbs=PDB_HR,PDB_FIN,PDB_APP
pdb_skip_seed=yes
exclude_tablespace=TEMP
parallel_pdbs=3
channels=auto
compress=zstd:3
wallet_backup=yes
validate_after=yes"
}
}
8.9 Oracle 11g Legacy (modo exp)
FileSet {
Name = "Oracle-11g-Legacy"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=ORCL11
mode=dump
oracle_home=/u01/app/oracle/product/11.2.0/dbhome_1
auth=os
dump_format=exp
dump_opt=CONSISTENT=Y GRANTS=y ROWS=y
schema=*
compress=gzip"
}
}
9. Ejemplos de Jobs de Restauración
9.1 Restauración Completa de Base de Datos — Último Backup
* restore client=oracle-23ai-fd
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
First you select one or more JobIds that contain files
to be restored. You will be presented several methods
of specifying the JobIds. Then you will be allowed to
select which files from those JobIds are to be restored.
To select the JobIds, you may then select the following:
1: List last 20 Jobs run
2: List Jobs where a given File is saved
...
5: Select the most recent backup for a client
...
Select item: (1-13): 5
Defined Clients:
1: oracle-23ai-fd
Select the Client (1-1): 1
The defined FileSet resources are:
1: Oracle-RMAN-SBT-Production
Select FileSet resource (1-1): 1
+-------+-------+----------+-------------+---------+
| JobId | Level | JobFiles | JobBytes | Status |
+-------+-------+----------+-------------+---------+
| 4989 | F | 1 | 499,654,432 | T |
+-------+-------+----------+-------------+---------+
You have selected the following JobId: 4989
Building directory tree for JobId(s) 4989 ...
1 file inserted into the tree.
cwd is: /
$ mark *
1 file marked.
$ done
Bootstrap records written to /opt/bacula/working/oracle-23ai-fd.restore.bsr
The job will require the following (*=>cur_dir):
Volume(s) Storage(s) SD Device(s)
===========================================================================
OracleVol-0001 File FileStorage
Volumes marked with "*" are online.
1 file selected to be restored.
Plugin Restore Options:
action (full|pitr|scn|table|clone|preview|validate) [preview]: full
shutdown_if_open [yes]: yes
preview_first [no]: yes
verify_after [yes]: yes
dry_run [no]: no
require_explicit_confirmation [yes]: yes
Run Restore job
JobName: OracleRestore
Bootstrap: /opt/bacula/working/oracle-23ai-fd.restore.bsr
Where: /
Replace: Always
FileSet: Oracle-RMAN-SBT-Production
Backup Client: oracle-23ai-fd
Restore Client: oracle-23ai-fd
Storage: File
JobId: *None*
When: 2026-04-27 10:00:00
Catalog: MyCatalog
Priority: 10
Plugin Options: *None*
OK to run? (yes/mod/no): yes
Job queued. JobId=5001.
* messages
27-Apr 10:00:01 oracle-23ai-fd JobId 5001: PODHEITOR-ORACLE-AUDIT ts=2026-04-27T10:00:01Z kind=restore_start sid=FREE action=full
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: --- RESTORE PREVIEW SUMMARY ---
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: Restore Point: SCN 2090264
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: Pieces required: 6
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: Total size: 477 MB
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: Estimated time: ~20 seconds
27-Apr 10:00:02 oracle-23ai-fd JobId 5001: Confirm restore? [yes/no]: yes
27-Apr 10:00:12 oracle-23ai-fd JobId 5001: RMAN> RESTORE DATABASE; ... completed
27-Apr 10:00:19 oracle-23ai-fd JobId 5001: RMAN> RECOVER DATABASE; ... completed
27-Apr 10:00:19 oracle-23ai-fd JobId 5001: RMAN> ALTER DATABASE OPEN RESETLOGS; ... completed
27-Apr 10:00:23 oracle-23ai-fd JobId 5001: PODHEITOR-ORACLE-AUDIT kind=restore_verify_start
27-Apr 10:00:40 oracle-23ai-fd JobId 5001: DBVERIFY: 131,072 pages checked, 0 corrupt, 0 failure
27-Apr 10:00:40 oracle-23ai-fd JobId 5001: PODHEITOR-ORACLE-AUDIT kind=restore_end ok=true size=477MB
27-Apr 10:00:40 oracle-23ai-fd JobId 5001: Bacula oracle-23ai-fd JobId 5001: End Restore Job.
TerminateCode=OK
9.2 PITR — Recuperación a un Punto en el Tiempo paso a paso
* restore client=oracle-23ai-fd
[...select JobId 4989, mark *, done...]
Plugin Restore Options:
action (full|pitr|scn|table|clone|preview|validate) [preview]: pitr
target_time (YYYY-MM-DD_HH:MM:SS) []: 2026-04-25_15:30:00
shutdown_if_open [yes]: yes
preview_first [no]: yes
verify_after [yes]: yes
dry_run [no]: no
require_explicit_confirmation [yes]: yes
OK to run? (yes/mod/no): yes
Job queued. JobId=5002.
* messages
27-Apr 10:05:01 oracle-23ai-fd JobId 5002: PODHEITOR-ORACLE-AUDIT kind=restore_start sid=FREE action=pitr
27-Apr 10:05:01 oracle-23ai-fd JobId 5002: target_time=2026-04-25_15:30:00
27-Apr 10:05:03 oracle-23ai-fd JobId 5002: --- RESTORE PREVIEW ---
27-Apr 10:05:03 oracle-23ai-fd JobId 5002: SET UNTIL TIME "TO_DATE('2026-04-25 15:30:00','YYYY-MM-DD HH24:MI:SS')";
27-Apr 10:05:07 oracle-23ai-fd JobId 5002: Pieces required: 6, estimated restore: ~19s
27-Apr 10:05:07 oracle-23ai-fd JobId 5002: --- END PREVIEW ---
27-Apr 10:05:07 oracle-23ai-fd JobId 5002: Proceed with PITR to 2026-04-25 15:30:00? [yes/no]: yes
27-Apr 10:05:17 oracle-23ai-fd JobId 5002: RMAN restore + recover completed in 19s
27-Apr 10:05:17 oracle-23ai-fd JobId 5002: ALTER DATABASE OPEN RESETLOGS - OK
27-Apr 10:05:22 oracle-23ai-fd JobId 5002: Bacula oracle-23ai-fd JobId 5002: End Restore Job. TerminateCode=OK
9.3 Restauración Basada en SCN
Plugin Restore Options:
action: scn
target_scn: 2090264
shutdown_if_open: yes
preview_first: no
verify_after: yes
dry_run: no
Genera: SET UNTIL SCN 2090264; RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS;
9.4 Recuperación a Nivel de Tabla (Oracle 12c+)
Plugin Restore Options:
action: table
table_owner: SCOTT
table_name: EMP
auxiliary_destination: /u01/aux
target_time: 2026-04-25_12:00:00
verify_after: yes
dry_run: no
El plugin genera un bloque RMAN RECOVER TABLE SCOTT.EMP UNTIL TIME ... AUXILIARY DESTINATION '/u01/aux', restaura la tabla desde el backup e importa los datos de vuelta a la base de datos en producción mediante Data Pump, todo ello sin que el operador requiera acceso SSH.
9.5 Clonar Base de Datos a un Host/SID Diferente
Plugin Restore Options:
action: = clone
target_db_name: = ORCL_DEV
target_host: = 192.168.15.200
target_oracle_home: = /u01/app/oracle/product/19c/dbhome_1
db_file_name_convert: = '/u01/oradata/ORCL/','/u01/oradata/ORCL_DEV/'
log_file_name_convert: = '/u01/fra/ORCL/','/u01/fra/ORCL_DEV/'
dry_run: = no
El plugin genera un bloque RMAN DUPLICATE TARGET DATABASE TO ORCL_DEV con las cláusulas DB_FILE_NAME_CONVERT y LOG_FILE_NAME_CONVERT correspondientes, crea un nuevo init.ora en el host destino e inicia la base de datos clonada, todo desde una única sesión de restauración en bconsole.
10. Guía de Instalación y Dimensionamiento
10.1 Requisitos Previos
Host Oracle (también el Host del Bacula FD)
| Componente | Versión mínima | Notas |
|---|---|---|
| Bacula File Daemon | 15.0.3 | Paquete Community estándar |
| Oracle Database | 11g R2 (11.2.0.4) | Probado hasta 23ai FREE |
sqlplus |
Coincide con la versión de la BD | Se requiere Oracle Client completo — el Instant Client no es suficiente |
rman |
Coincide con la versión de la BD | Requerido para todos los modos excepto dump |
dbv (DBVERIFY) |
Coincide con la versión de la BD | Requerido para validate_after=yes |
expdp / impdp |
Coincide con la versión de la BD | Requerido para mode=dump con dump_format=expdp |
exp |
Coincide con la versión de la BD | Requerido para mode=dump en Oracle 11g |
| Kernel Linux | 4.18+ | cgroups v2 requiere 4.15+; mínimo EL8 es 4.18 |
| Disco — directorio de estado | ~100 MB | /opt/bacula/working/oracle-state/ por SID |
| Disco — staging | 1× tamaño de la BD | Solo requerido para mode=rman (sin SBT) y mode=dump |
Host del Bacula Director
| Componente | Versión mínima | Notas |
|---|---|---|
bacula-director |
15.0.3 | No requiere configuración específica para Oracle |
| BD del Catálogo | PostgreSQL 14+ o MySQL 8+ | Requisito estándar de Bacula |
10.2 Guía de Dimensionamiento
| Entorno | Tamaño de BD | Canales recomendados | Disco (staging) | RAM (backend) | Notas |
|---|---|---|---|---|---|
| Pequeño (Dev/Test) | < 100 GB | 2–4 | 50 GB | 256 MB | Instancia única, mode=rman_sbt |
| Mediano (Producción) | 100 GB – 1 TB | 4–8 | 500 GB | 512 MB | channels=auto, BCT habilitado |
| Grande (Enterprise) | 1 TB – 10 TB | 8–16 | 2 × tamaño BD | 1 GB | RAC, CDB/PDB, CDP |
| Enterprise a Gran Escala | > 10 TB | 16–32 | SAN externo | 2 GB | SBT multicanal, ASM, DG |
Para mode=rman_sbt (recomendado), no se requiere disco de staging — los datos fluyen directamente desde RMAN a través de libobk-rs y PTCOMM hacia el Storage de Bacula.
10.3 Instalación por RPM (EL8 / EL9 / Rocky / Alma / OL)
# Step 1: Install the package
sudo dnf install ./podheitor-oracle-plugin-1.0.0-1.el9.x86_64.rpm
# Step 2: Copy and edit the config file
sudo cp /opt/bacula/etc/podheitor-oracle.conf.example
/opt/bacula/etc/podheitor-oracle.conf
sudo chown root:bacula /opt/bacula/etc/podheitor-oracle.conf
sudo chmod 640 /opt/bacula/etc/podheitor-oracle.conf
sudo vi /opt/bacula/etc/podheitor-oracle.conf
# Step 3: Set the minimum config (edit these values)
# sid = FREE
# mode = rman_sbt
# oracle_home = /opt/oracle/product/23ai/dbhome_1
# oracle_user = / as sysdba
# unix_user = oracle
# auth = os
# channels = auto
# compress = zstd:3
# Step 4: Verify install
/opt/bacula/bin/podheitor-oracle-backend --version
# Step 5: Dry-run validation (Oracle must be running)
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
10.4 Instalación por DEB (Debian 12 / Ubuntu 24.04)
# Step 1: Install the package
sudo apt install ./podheitor-oracle-plugin_1.0.0-2_amd64.deb
# Step 2: Configure (same as RPM step 2–3 above)
sudo cp /opt/bacula/etc/podheitor-oracle.conf.example
/opt/bacula/etc/podheitor-oracle.conf
sudo chown root:bacula /opt/bacula/etc/podheitor-oracle.conf
sudo chmod 640 /opt/bacula/etc/podheitor-oracle.conf
# Step 3: Dry-run validation
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
10.5 Instalación por Tarball (Cualquier Linux de 64 bits)
# Extract
tar xzf podheitor-oracle-plugin-1.0.0-x86_64-linux-musl.tar.gz
cd podheitor-oracle-plugin-1.0.0
# Install (default PREFIX=/opt/bacula)
sudo make install
# Or with custom prefix
sudo make install PREFIX=/usr/local
# Verify
/opt/bacula/bin/podheitor-oracle-backend --version
10.6 Validación Post-Instalación
El flag --dry-run valida la configuración completa sin conectarse a Oracle:
$ sudo -u oracle /opt/bacula/bin/podheitor-oracle-backend
--dry-run /opt/bacula/etc/podheitor-oracle.conf
PODHEITOR-ORACLE: dry-run OK
sid = FREE
mode = rman_sbt
oracle_home = /opt/oracle/product/23ai/dbhome_1
channels = 8 (auto-tuned, cores=16)
bct = enabled
topology = primary, single-instance, CDB with 3 PDBs (FREEPDB1,PDB$SEED,...)
wallet = open, master_key_id=ABCD1234...
hooks = none found in /opt/bacula/etc
canary = disabled
metrics_addr = disabled
Si la salida contiene alguna línea ERROR:, resuélvala antes de ejecutar jobs en producción.
10.7 Configuración del Enlace Simbólico de libobk (solo mode=rman_sbt)
RMAN debe poder cargar libobk-rs.so como su biblioteca SBT. Cree el enlace simbólico una sola vez por cada Oracle Home:
sudo ln -sf /opt/bacula/lib/libobk-rs.so
"$ORACLE_HOME/lib/libobk.so"
# Verify RMAN can load it
rman target / <<< "show all;" 2>&1 | grep -i sbt
Importante: Este enlace simbólico debe recrearse después de cada PSU (Patch Set Update) o RU (Release Update) de Oracle que reinstale $ORACLE_HOME/lib/. El script %post del RPM y el script postinst del DEB emiten un aviso si el enlace simbólico no está presente en el momento de la instalación.
10.8 Configuración del Director
FileSet (consulte la Sección 8 para ejemplos completos)
FileSet {
Name = "Oracle-RMAN-SBT"
Include {
Options {
Signature = SHA256
Compression = none
}
Plugin = "podheitor-oracle:
sid=FREE
mode=rman_sbt
oracle_home=/opt/oracle/product/23ai/dbhome_1
auth=os
channels=auto
compress=zstd:3
validate_after=yes
canary=on"
}
}
Job de Backup
Job {
Name = "BackupOracle-FREE"
Type = Backup
Level = Incremental
Client = oracle-23ai-fd
FileSet = "Oracle-RMAN-SBT"
Schedule = "WeeklyCycle"
Storage = File
Pool = OracleDaily
Messages = Standard
Priority = 10
}
Job de Restauración
Job {
Name = "RestoreOracle-FREE"
Type = Restore
Client = oracle-23ai-fd
FileSet = "Oracle-RMAN-SBT"
Storage = File
Pool = OracleDaily
Messages = Standard
Where = /
Priority = 10
}
Ejemplo de Schedule
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 02:00
Run = Differential 2nd-5th sun at 02:00
Run = Incremental mon-sat at 02:00
}
Recargar el Director
sudo bconsole <<< "reload"
11. Matriz de Compatibilidad
11.1 Versiones de Oracle × Funcionalidades
| Versión Oracle | rman_sbt | rman | dump | cdp | replicate | Recuperación de tablas | CDB/PDB | TDE |
|---|---|---|---|---|---|---|---|---|
| 11g R2 (11.2.0.4) | Sí | Sí | exp | Sí | Sí (log-apply) | No | No | No |
| 12c R1 (12.1) | Sí | Sí | expdp | Sí | Sí | Sí | Sí | Sí |
| 12c R2 (12.2) | Sí | Sí | expdp | Sí | Sí | Sí | Sí | Sí |
| 18c | Sí | Sí | expdp | Sí | Sí | Sí | Sí | Sí |
| 19c (LTS) | Sí | Sí | expdp | Sí | Sí | Sí | Sí | Sí |
| 21c | Sí | Sí | expdp | Sí | Sí | Sí | Sí | Sí |
| 23ai FREE | Sí (en vivo) | Sí (en vivo) | Sí (en vivo) | Sí (en vivo) | Sí (parcial) | Sí | Sí | Sí |
Notas:
- 11g:
dump_formatforzado aexp; sin CDB/PDB, sin TDE, sinRECOVER TABLE - 23ai FREE:
replicate_method=duplicate_activerequiere Oracle EE o una licencia adicional;archivelog_applyfunciona en la edición FREE - Validado en vivo = probado contra una instancia de base de datos real en ejecución
11.2 Soporte por Distribución Linux
| Distribución | RPM | DEB | Tarball | Estado | Notas |
|---|---|---|---|---|---|
| RHEL 9 / Rocky 9 / Alma 9 / OL 9 | Sí | — | Sí | Validado en vivo | Job 4989 T OK en OL 9.6 |
| RHEL 8 / Rocky 8 / Alma 8 / OL 8 | Sí | — | Sí | Spec disponible; instalación en vivo pendiente | Mismo spec que EL9 |
| Debian 12 (bookworm) | — | Sí | Sí | Integrado; make deb en vivo pendiente |
|
| Ubuntu 24.04 LTS (noble) | — | Sí | Sí | Integrado | |
| Ubuntu 22.04 LTS (jammy) | — | Sí | Sí | Probado en contenedor | |
| SLES 15 SP5+ | — | — | Sí | Solo tarball static-pie | Sin empaquetado; enlazado estáticamente |
11.3 Versiones de Bacula
| Versión Bacula | Estado | Notas |
|---|---|---|
| 15.0.3 | Validado en vivo | Objetivo de compilación de referencia (BACULA_SRC) |
| 15.0.x (anteriores) | No probado | La API del plugin es estable; probablemente compatible |
| 14.x | No probado | El ABI del plugin puede diferir; no soportado |
11.4 Arquitecturas
| Arquitectura | Estado | Notas |
|---|---|---|
| x86_64 (linux-musl static-pie) | Validado en vivo | Compilación de producción; CI en phweb-ci |
| x86_64 (linux-gnu) | Compilación de desarrollo | Compilación de desarrollo |
| aarch64 (linux-musl static-pie) | Integrado | Disponible via tarball (requiere cross-compiler aarch64-linux-gnu-gcc) |
11.5 Ediciones de Oracle × Funcionalidades
| Funcionalidad | Oracle XE | Oracle SE2 | Oracle EE |
|---|---|---|---|
mode=rman_sbt |
Sí | Sí | Sí |
mode=rman |
Sí | Sí | Sí |
mode=dump |
Sí | Sí | Sí |
mode=cdp |
Sí | Sí | Sí |
mode=replicate (archivelog_apply) |
Sí | Sí | Sí |
mode=replicate (duplicate_active) |
No* | No* | Sí |
| BCT (Block Change Tracking) | No | Sí | Sí |
| RAC | No | No | Sí |
| TDE Wallet | No | No | Sí |
| Recuperación a nivel de tabla | Limitada | Sí (12c+) | Sí (12c+) |
| Snapshot AWR | No | No | Sí |
*duplicate_active técnicamente funciona en SE2 como una funcionalidad de RMAN, pero Active Data Guard (standby gestionado) requiere Oracle EE. Para DR en SE2, utilice archivelog_apply.
Todos los resultados provienen de ejecuciones de validación en vivo sobre el entorno de laboratorio de producción: Oracle 23ai FREE, SID=FREE, VM 131 @ 192.168.15.51, Bacula FD 15.0.3, OL 9.6, phweb-ci como host de CI/compilación.
12.1 Rendimiento de Backup
| Job | Modo | Base de datos | Tamaño | Duración | Throughput | Estado | Notas |
|---|---|---|---|---|---|---|---|
| 4860 | rman_sbt | Oracle 23ai FREE (SID=FREE) | 477 MB | 14m 39s | ~543 KB/s | T OK | Primera validación RMAN SBT en vivo; línea base de canal único |
| 4956 | restauración | Oracle 23ai FREE | 477 MB | 19 s | ~25 MB/s | T OK | 6 piezas restauradas desde el almacenamiento Bacula |
| 4989 | rman_sbt | Oracle 23ai FREE (SID=FREE) | ~499 MB | 26m 10s | ~319 KB/s | T OK | Backup completo desde paquete instalado por RPM (F14.b); files=1, 0 errores |
| F2.b | dump (expdp) | Esquema PHTEST | 416 KB | 1m 27s | ~4.8 KB/s | OK | Exportación lógica Data Pump, solo esquema PHTEST |
| F3.b | rman (no SBT) | Oracle 23ai FREE | 451 MB | 43 s | ~10.5 MB/s | OK | 2 canales RMAN, 9 piezas, staging local |
| F6.b | preview | Oracle 23ai FREE | — | 4 s | — | OK | RESTORE PREVIEW SUMMARY; rango SCN 2090220–2090264 |
| F10.b | validate | Oracle 23ai FREE | — | 16.8 s | — | OK | RMAN VALIDATE DATABASE CHECK LOGICAL; 0 bloques corruptos |
| F10.b | dbverify | Oracle 23ai FREE | — | 2.45 s | — | OK | 131 072 páginas verificadas; 0 fallas |
12.2 Análisis de Throughput
Los valores de throughput anteriores corresponden a un entorno de laboratorio de una sola VM con almacenamiento compartido (sin SAN dedicada) y un único canal RMAN. Las implementaciones en producción con:
- Múltiples canales RMAN (4–16, ajuste automático)
- Red de almacenamiento de backup dedicada
- BCT (Block Change Tracking) para jobs incrementales
suelen alcanzar un throughput agregado de 50–200 MB/s, dependiendo del nivel de almacenamiento.
Throughput de restauración del Job 4956 (25 MB/s para 477 MB en 19 segundos): demuestra la eficiencia de la ruta de flujo mode=rman_sbt — Bacula recupera las 6 piezas de backup desde el almacenamiento y el backend las entrega directamente al canal de restauración de RMAN, sin pasar por ningún directorio de staging.
Comparación Job 4989 vs Job 4860: La mayor duración del Job 4989 (26m10s frente a 14m39s del original) refleja un estado de base de datos ligeramente mayor (más archivelogs acumulados) en el momento de la prueba de instalación por RPM, no una regresión de rendimiento.
12.3 Rendimiento de Validación
| Operación | Duración | Resultado | Cobertura |
|---|---|---|---|
| RMAN VALIDATE DATABASE CHECK LOGICAL | 16.8 s | 0 bloques corruptos | Todos los datafiles + archivelogs |
| DBVERIFY (dbv) post-restauración | 2.45 s | 0 fallas | 131 072 páginas en todos los datafiles |
| RESTORE DATABASE PREVIEW SUMMARY | 4 s | Plan generado | 6 piezas requeridas, rango SCN confirmado |
12.4 Cobertura de la Suite de Pruebas
| Suite | Cantidad | Alcance |
|---|---|---|
| Pruebas unitarias backend | 523 | Generadores de scripts, parsers, cadena/verificación/canary/ASM/topología/wallet, métricas, cgroups |
| Pruebas unitarias libobk-rs | 18 | Códec de paquetes SBT v2 |
| Integración con DB en vivo (VM 131) | F2.b hasta F18 | End-to-end completo sobre Oracle 23ai FREE |
13. Seguridad y Cumplimiento
13.1 Redacción de Credenciales
El subsistema de registro de auditoría del plugin aplica reglas de redacción a cada evento de log antes de emitirlo al log del job Bacula o al archivo de trazas:
- Los patrones que coincidan con
IDENTIFIED BY <password>se reemplazan porIDENTIFIED BY [REDACTED]. - Las cadenas de conexión Oracle
user/password@hostse reemplazan poruser/[REDACTED]@host. - El contenido del archivo de frase de contraseña del wallet nunca se registra — solo se registra la ruta del archivo.
- Las cadenas
SBT_PARMSque contenganSBT_ORACLE_HOME_USERu otras credenciales similares se enmascaran.
El resultado es que ninguna contraseña Oracle, frase TDE ni credencial de autenticación aparece jamás en el log del job Bacula, el log de auditoría o el archivo de trazas, independientemente del nivel de verbose o debug.
13.2 Canary Anti-Ransomware
Cuando se establece canary=on en el FileSet, el plugin toma muestras de un número configurable de bloques Oracle aleatorios de cada datafile al inicio de cada job de backup y calcula un hash BLAKE3 acumulativo. Entre jobs, compara la muestra de hash actual con la del job anterior:
- Si la proporción de bloques modificados supera
canary_threshold_pct(por defecto 25 %), el plugin emite un mensajePODHEITOR-ORACLE-CANARY-ALERTal log del job Bacula. - El backup continúa — la alerta es una advertencia, no un fallo — pero el operador recibe notificación de una posible encriptación masiva por ransomware.
- El estado de hash por job se escribe en
/opt/bacula/working/oracle-state/<SID>/wallet_hash.
El canary no garantiza la detección de ransomware, pero proporciona una capa de alerta temprana sin necesidad de Oracle Audit Vault ni herramientas con licencias adicionales.
13.3 Compatibilidad con TDE Wallet
Cuando wallet_backup=yes (valor por defecto), el plugin:
- Lee la ruta del wallet desde
sqlnet.ora(wallet_path=auto) o la ruta configurada. - Transmite el directorio del wallet a Bacula como parte del job de backup.
- Detecta la rotación de la clave maestra entre jobs comparando el hash actual de
v$encryption_keyscon elwallet_hashpersistido en el directorio de estado. Si se detecta una rotación, el plugin promueve automáticamente el siguiente job al nivel Full (independientemente de la directiva de nivel en Bacula) para garantizar un backup consistente con el nuevo material de clave.
13.4 Integridad de la Cadena de Suministro
| Verificación | Herramienta | Resultado (v1.0.0) |
|---|---|---|
| Auditoría de CVE | cargo-audit |
0 CVE conocidos en las 78 dependencias de crates |
| Cumplimiento de licencias | cargo-deny (deny.toml) |
Todas las verificaciones aprobadas: licencia, prohibición, avisos, fuente |
| Build reproducible | build estático e reproduzível | Determinista; hash binario reproducible en cada ejecución de CI |
| SBOM | CycloneDX v1.4 | Generado mediante make sbom — incluye todas las dependencias transitivas de crates Rust |
Ejecutar verificaciones de seguridad localmente:
13.5 Superficie de Ataque de Red
El proceso del plugin abre exactamente un socket de red opcional: el endpoint HTTP de Prometheus /metrics en metrics_addr. Si metrics_addr=0 (valor por defecto), no se abre ningún puerto de red. El socket UNIX en /var/run/podheitor-oracle/<SID>.sock es solo local, se crea con permisos 0600 y es propiedad del usuario OS oracle.
El canal PTCOMM entre el shim Bacula FD y el backend Rust utiliza un mecanismo fork()+pipe() — sin socket de red, sin memoria compartida IPC, sin named pipe accesible desde fuera del grupo de procesos.
13.6 libobk-rs de Sala Limpia
libobk-rs.so es una reimplementación de sala limpia de la API Oracle SBT v2 (sbt2.h). La API SBT está documentada en la nota Oracle MOS (My Oracle Support) 67422.1 y en la referencia RMAN Backup & Recovery. La implementación fue escrita sin acceso al código fuente ni al binario propietario libobk.so de Oracle, utilizando únicamente la especificación de API publicada.
El estatus de sala limpia implica:
- No hay código propietario Oracle en el binario distribuido.
- No se requiere ninguna licencia Oracle para distribuir
libobk-rs.so. - Single-licensed bajo PodHeitor-Proprietary (Copyright © Heitor Faria).
14. Soporte y Términos Comerciales
14.1 ¿Viene de un Producto de la Competencia?
Traiga su cotización de renovación o propuesta de contrato activo de Bacula Enterprise, Veeam, Commvault o NetBackup. Garantizamos un descuento mínimo del 50 % en el soporte comercial — con más funcionalidades, paquete de menor tamaño y sin tarifas de licencia por socket ni por host.
El plugin PodHeitor reemplaza a:
- Bacula Enterprise 18.2.3 Oracle Module
- Veeam Agent para Oracle (con Veeam Backup & Replication)
- Commvault IntelliSnap Oracle iDataAgent
- NetBackup para Oracle (DB Agent)
…a una fracción del costo, con automatización de restauración superior, CDP nativo y replicación de DR integrada para Standard Edition 2.
14.2 Niveles de Soporte
| Nivel | SLA | Incluye | Contacto |
|---|---|---|---|
| Comunidad | Mejor esfuerzo | GitHub Issues, documentación | Abrir issue en GitHub |
| Estándar | Próximo día hábil | Soporte por correo electrónico, prioridad en parches, revisión de configuración | heitor@opentechs.lat |
| Premium | Respuesta en 4 horas | Canal Slack dedicado, sesiones en vivo, ajuste personalizado de FileSet, asistencia en actualizaciones | heitor@opentechs.lat |
| Empresarial | Respuesta en 1 hora + guardia | Guardia 24/7, opciones presenciales, desarrollo de funcionalidades a medida | +1 786 726-1749 |
14.3 Capacitación y Servicios Profesionales
Se ofrecen capacitación y servicios profesionales para equipos que migran desde herramientas propietarias de backup Oracle o que están construyendo nueva infraestructura Bacula/Oracle:
- Taller: Backup Oracle con Bacula (1 día) — diseño de FileSet, ajuste de RMAN, automatización de restauración.
- Taller: Replicación de DR para Oracle SE2 (medio día) —
mode=replicate, configuración de archivelog-apply, pruebas de failover. - Consultoría: Migración desde Bacula Enterprise — traducción de configuraciones, migración de RunScript, revisión de ENTERPRISE_PARITY.
- Consultoría: Implementación de CDP — configuración de CDP en producción, monitoreo de RPO, dashboards de Prometheus.
14.4 Contacto
| Canal | Detalles |
|---|---|
| Correo electrónico | heitor@opentechs.lat |
| WhatsApp / Teléfono (internacional) | +1 786 726-1749 |
| WhatsApp / Teléfono (Brasil) | +55 61 98268-4220 |
| Autor | Heitor Faria |
Apéndice A — Registros de Decisiones de Arquitectura (ADR)
Un conjunto completo de 14 ADR rige las decisiones técnicas de este plugin. Cada ADR se almacena en docs/adr/. Las decisiones clave se resumen a continuación.
ADR-001 — Rust para el Binario del Backend La lógica principal de backup y restauración está implementada en Rust apuntando a x86_64-unknown-linux-musl (static-pie). Esta elección proporciona seguridad de memoria sin pausas de recolección de basura, comportamiento de apagado determinista (crítico para la limpieza de canales RMAN) y un despliegue de un solo archivo sin dependencias de bibliotecas en tiempo de ejecución. El objetivo musl static-pie garantiza que el binario funcione en cualquier kernel Linux 2.6.32+ independientemente de la versión de glibc.
ADR-002 — libobk-rs SBT v2 de Sala Limpia La interfaz RMAN SBT de Oracle requiere una biblioteca compartida (libobk.so) que cumpla con la API SBT v2 (sbt2.h). En lugar de depender del libobk.so propietario de Bacula Enterprise (que requiere una suscripción activa a Bacula Enterprise), el plugin incluye libobk-rs.so: una implementación Rust de sala limpia de la misma especificación de API pública. Esto hace que el plugin sea completamente autónomo bajo licenciamiento PodHeitor-Proprietary sin código propietario de Oracle ni de Bacula linkado.
ADR-003 — Manifiesto de Backup como Archivo y RestoreObject Cada job de backup escribe un _manifest.json en el directorio de estado Y lo incorpora como RestoreObject Bacula en el catálogo. El manifiesto tiene hash BLAKE3, sello SCN e incluye metadatos de DBID, incarnation y cadena. Esta doble escritura garantiza que los metadatos de restauración estén disponibles incluso si se pierde el directorio de estado, y que Bacularis pueda mostrar los detalles del backup en su interfaz web.
ADR-004 — Protocolo Binario PTCOMM sobre fork+pipe La API del plugin FD de Bacula requiere una biblioteca compartida con C-ABI. Desde v1.1.0, el cargador del plugin FD (podheitor-oracle-fd.so) es una plugin nativo Rust pura que exporta el C-ABI que Bacula espera, luego realiza un fork del proceso backend Rust y se comunica con él mediante un protocolo binario (PTCOMM) a través de pipes stdin/stdout. El límite fork+pipe mantiene el backend libre para usar la concurrencia nativa de Rust y la semántica de panic, mientras proporciona a Bacula la misma experiencia de proceso único. (v1.0.0 usaba un shim C++ delgado para el mismo rol; el shim fue eliminado en v1.1.0 para producir un artefacto con licencia única y limpio en derechos de autor — consulte la nota de supersesión de v1.1.0 arriba.)
ADR-005 — Socket UNIX para Comunicación SBT ↔ Backend libobk-rs.so se carga por RMAN en proceso, mientras que el backend es un proceso separado. Para transferir datos de backup desde los canales RMAN al flujo PTCOMM de Bacula, libobk-rs se conecta a un socket de dominio UNIX (/var/run/podheitor-oracle/<SID>.sock) administrado por el backend. Esto evita la complejidad de la memoria compartida y proporciona aislamiento natural por SID.
ADR-006 — Directorio de Estado por SID Todo el estado persistente (cursor SCN, cursor de archivelog, hash del canary, hash del wallet, manifiestos de checkpoint) se escribe en /opt/bacula/working/oracle-state/<SID>/. Usar un directorio por SID permite que múltiples instancias coexistan en el mismo host, sobrevive a la reinstalación del paquete (el %postun de RPM preserva el directorio) y solo se limpia con --purge de DEB explícito o eliminación manual.
ADR-007 — Data Pump como Predeterminado en 12c+ En Oracle 12c y posterior, mode=dump usa expdp (Data Pump) por defecto en lugar del legacy exp. Data Pump es paralelo, reanudable y produce dumps significativamente más pequeños para esquemas grandes. En 11g, el plugin recurre automáticamente a exp porque el formato de salida de expdp cambió en 12c de maneras que complican la importación entre versiones.
ADR-008 — Ajuste Automático del Número de Canales Cuando channels=auto (valor por defecto), el backend consulta el número de núcleos de CPU disponibles en el host y ajusta el número de canales RMAN en consecuencia, limitado por el valor en v$parameter para db_files. Esto elimina la necesidad de ajuste manual por host y proporciona paralelismo casi óptimo sin configuración adicional.
ADR-009 — Sin Callback de bconsole desde libobk-rs El libobk.so de Bacula Enterprise requiere un callback de bconsole desde RMAN a Bacula para entregar los datos de backup (la llamada arquitectura de «SBT callback»). Esto crea una dependencia de que el Director sea alcanzable desde el host Oracle durante el backup, lo cual falla en entornos NAT y VPN. El libobk-rs de PodHeitor se conecta al proceso backend directamente mediante socket UNIX — sin callback al Director, sin dependencia de bconsole.
ADR-010 — Métricas Prometheus mediante TCP de stdlib El endpoint /metrics de Prometheus es servido por un servidor HTTP mínimo construido desde std::net::TcpListener de Rust — no se utiliza ningún crate externo de biblioteca HTTP. Esto mantiene el binario pequeño, elimina una superficie de ataque significativa y conserva la propiedad de cero dependencias externas en tiempo de ejecución.
ADR-011 — Automatización de Restauración mediante RestoreObject pluginrestoreconf La configuración de restauración se entrega como un documento INI pluginrestoreconf incorporado en el mecanismo RestoreObject de Bacula — no como parámetros de línea de comandos a un script externo. Esto significa que todas las acciones de restauración (PITR, SCN, tabla, clon, flashback) se inician desde bconsole o Bacularis, quedan registradas en el JobLog del catálogo Bacula y no requieren acceso SSH al host Oracle. Este es el diferenciador más significativo frente al enfoque de bs_oracle_restore.pl de Bacula Enterprise.
ADR-012 — Limitación de E/S con cgroups v2 En lugar de depender del parámetro RATE de RMAN (que es por canal y aproximado), el plugin escribe el límite io.max de cgroups v2 para el nodo hoja del cgroup del backend. Esto impone un límite de velocidad de escritura a nivel de kernel sobre toda la E/S emitida por el proceso de backup, independientemente del número de canales RMAN. La funcionalidad no es fatal: si el host no usa una jerarquía unificada de cgroups v2 o falta CAP_SYS_ADMIN, el plugin registra una advertencia y continúa.
ADR-013 — Canary Anti-Ransomware mediante Muestreo de DBVERIFY El canary usa dbv (Oracle DBVERIFY) para muestrear bloques aleatorios de los datafiles y calcula hashes BLAKE3. Esto reutiliza una herramienta Oracle existente disponible en toda instalación Oracle, evita requerir acceso directo a dispositivos raw y produce firmas de contenido a nivel de bloque sin leer el datafile completo. El canary se activa cuando la proporción de bloques modificados supera el umbral configurable entre jobs de backup consecutivos.
ADR-014 — Reanudación por Checkpoint de Cadena SCN Cuando un job Bacula se interrumpe (caída del FD, reinicio del Director, tiempo de espera de red), el plugin escribe un checkpoint/<jobid>.json en el directorio de estado con el último rango SCN transferido con éxito. En la siguiente ejecución del job (que Bacula reintentará en el mismo nivel), el backend detecta el checkpoint y retoma desde el último SCN exitoso en lugar de reiniciar desde cero. Esto transforma los fallos de incrementales en bases de datos grandes de una re-ejecución de varias horas en una reanudación de pocos segundos.
Apéndice B — Glosario
| Término | Definición |
|---|---|
| ADR | Architecture Decision Record — documento que registra una decisión arquitectónica significativa, su contexto y la justificación de la elección tomada. |
| PodHeitor-Proprietary | GNU Affero General Public License versión 3. La licencia de código abierto bajo la cual se distribuye PodHeitor. |
| archivelog | Archivo de redo log Oracle que ha sido archivado (copiado desde el redo log en línea a un destino). Requerido para la recuperación a un punto en el tiempo. |
| ASM | Oracle Automatic Storage Management — administrador de volúmenes y sistema de archivos para archivos de base de datos Oracle, integrado con Oracle Clusterware. |
| BCT | Block Change Tracking — funcionalidad Oracle que registra qué bloques de base de datos han cambiado desde el último backup, acelerando drásticamente los backups incrementales al eliminar la necesidad de escanear bloques sin cambios. |
| Bacularis | Interfaz web moderna para PodHeitor Backup que proporciona gestión de jobs por navegador, formularios de restauración e informes. Renderiza nativamente los formularios pluginrestoreconf. |
| BLAKE3 | Función hash criptográfica utilizada por PodHeitor para el cálculo de hash de bloques en el canary. Más rápida que SHA-256 manteniendo resistencia a colisiones. |
| CDB | Container Database — contenedor de base de datos multitenant Oracle que aloja una o más bases de datos conectables (PDB). Introducido en Oracle 12c. |
| CDP | Continuous Data Protection — paradigma de backup que captura cambios de forma continua (en el caso de este plugin, archivelogs) en lugar de tomar capturas periódicas. Ofrece un RPO medido en minutos. |
| controlfile | Archivo binario Oracle que registra la estructura física de la base de datos (datafiles, redo logs, metadatos de backup). Requerido para montar la base de datos. |
| CycloneDX | Estándar abierto para Software Bill of Materials (SBOM) — inventario legible por máquina de todos los componentes de software y sus licencias. |
| Data Guard (DG) | Oracle Data Guard — solución de HA/DR integrada en Oracle que mantiene bases de datos en espera sincronizadas con la primaria mediante envío de redo log. Requiere Oracle Enterprise Edition para las funcionalidades de standby administrado. |
| dbv / DBVERIFY | Utilidad de verificación a nivel de bloque de Oracle (dbv). Lee bloques de datos Oracle y verifica sus sumas de verificación y consistencia interna sin necesitar una conexión abierta a la base de datos. |
| expdp / impdp | Utilidades Oracle Data Pump Export e Import (expdp/impdp). El reemplazo moderno de exp/imp, con soporte para exportación paralela, compresión y exportación incremental. |
| FD | File Daemon — componente Bacula instalado en el host cliente que ejecuta los jobs de backup y restauración bajo la dirección del Director. |
| FRA | Fast Recovery Area — ubicación en disco administrada por Oracle para archivos relacionados con la recuperación, incluidos archivelogs, autobackups del controlfile y conjuntos de backup RMAN. |
| GoldenGate | Oracle GoldenGate — herramienta de replicación e integración de datos en tiempo real. La opción goldengate_aware=yes de PodHeitor detecta los procesos GoldenGate activos y registra su checkpoint SCN antes del backup. |
| libobk / libobk-rs | Biblioteca compartida que implementa la API SBT (System Backup to Tape) v2 de Oracle. RMAN de Oracle carga libobk.so (típicamente ubicado en $ORACLE_HOME/lib/) para transmitir datos de backup a una capa de gestión de medios. libobk-rs es la implementación Rust de sala limpia de esta API por parte de PodHeitor. |
| PITR | Point-In-Time Recovery — operación de restauración que devuelve la base de datos a una marca de tiempo específica, descartando todos los cambios posteriores a ese punto. Requiere archivelogs desde el último backup Full hasta el tiempo objetivo. |
| PDB | Pluggable Database — base de datos Oracle autónoma que reside dentro de un CDB. Cada PDB tiene sus propios esquemas, tablespaces y puede administrarse de forma independiente. |
| PTCOMM | Protocolo de enmarcado binario interno de PodHeitor utilizado para la comunicación entre el shim FD de C++ y el proceso backend Rust a través de fork()+pipe(). Transporta nombres de archivo, metadatos de archivos, bloques de datos y mensajes de control. |
| RAC | Real Application Clusters — solución de clustering de base de datos multinodo con disco compartido de Oracle. Requiere Oracle Enterprise Edition y Oracle Grid Infrastructure. |
| RMAN | Recovery Manager — herramienta nativa de backup y recuperación de Oracle. RMAN comprende la estructura interna de bloques Oracle, gestiona conjuntos de backup y copias de imagen, y es la única herramienta que puede producir backups consistentes a nivel de bloque de una base de datos Oracle en ejecución sin pausar la aplicación. |
| RPO | Recovery Point Objective — cantidad máxima aceptable de pérdida de datos, medida como intervalo de tiempo. El modo CDP apunta a un RPO de minutos. |
| RTO | Recovery Time Objective — tiempo máximo aceptable para restaurar el servicio tras una interrupción. |
| SBOM | Software Bill of Materials — inventario formal y legible por máquina de todos los componentes, versiones y licencias de software que conforman un producto de software. |
| SCN | System Change Number — marca de tiempo interna Oracle que aumenta de forma monótona y que identifica de forma única un estado consistente de la base de datos. Cada transacción confirmada incrementa el SCN. Los SCN se utilizan para definir puntos precisos de backup y recuperación. |
| SBT | System Backup to Tape — capa de abstracción Oracle para la integración de gestión de medios con RMAN. A pesar del nombre, SBT v2 funciona con cualquier destino de backup, incluidos disco y almacenamiento en la nube. |
| SE2 | Oracle Standard Edition 2 — la edición Oracle Database de nivel medio. Carece de Active Data Guard, RAC, particionamiento avanzado y varias otras funcionalidades exclusivas de EE. El modo de replicación archivelog_apply de PodHeitor está diseñado específicamente para entornos SE2. |
| SPFILE | Server Parameter File — archivo de parámetros binario Oracle almacenado en el área de la base de datos (o ASM). Debe incluirse en cada job RMAN. |
| TDE | Transparent Data Encryption — funcionalidad Oracle que cifra datafiles, tablespaces o columnas en reposo sin cambios en la aplicación. Requiere un Oracle Wallet para almacenar la clave maestra de cifrado. |
| static-pie | Ejecutable de posición independiente compilado con una biblioteca C estática (musl). Funciona en cualquier versión de kernel ≥ 2.6.32 sin dependencias de bibliotecas compartidas. El binario backend de PodHeitor es static-pie musl para máxima portabilidad. |
| RestoreObject | Mecanismo del catálogo Bacula para almacenar datos arbitrarios (texto o binario) asociados a un job de backup. Utilizado por PodHeitor para almacenar el documento INI pluginrestoreconf y el manifiesto de backup. Se renderiza como prompts interactivos en bconsole y como formulario HTML en Bacularis. |
| pluginrestoreconf | El tipo específico de RestoreObject que usa PodHeitor para entregar la configuración de restauración (acción, tiempo objetivo, SCN, nombre de tabla, etc.) del operador al plugin en el momento de la restauración. |
| Socket UNIX | Endpoint de comunicación entre procesos (AF_UNIX) que existe solo en el kernel — sin interfaz de red, sin número de puerto. PodHeitor utiliza /var/run/podheitor-oracle/<SID>.sock para conectar libobk-rs (cargado por RMAN) con el proceso backend. |
Apéndice C — Referencia de Métricas Prometheus
Cuando se establece metrics_addr (p. ej., metrics_addr=0.0.0.0:9119), el backend expone un endpoint /metrics compatible con Prometheus. Las métricas se emiten en el formato de texto estándar Prometheus y pueden ser recolectadas por cualquier sistema compatible (servidor Prometheus, Grafana Agent, OpenTelemetry Collector).
C.1 Métricas de Contador
| Nombre de la métrica | Etiquetas | Descripción |
|---|---|---|
podheitor_oracle_backup_jobs_total |
sid, mode |
Número total de jobs de backup iniciados. |
podheitor_oracle_backup_failed_total |
sid, mode |
Número total de jobs de backup que terminaron con error. |
podheitor_oracle_restore_jobs_total |
sid, action |
Número total de jobs de restauración iniciados. |
podheitor_oracle_restore_failed_total |
sid, action |
Número total de jobs de restauración que terminaron con error. |
podheitor_oracle_bytes_backed_up_total |
sid, mode |
Total de bytes transferidos al almacenamiento Bacula en todos los jobs de backup. |
podheitor_oracle_bytes_restored_total |
sid |
Total de bytes recibidos desde el almacenamiento Bacula en todos los jobs de restauración. |
podheitor_oracle_archivelogs_shipped_total |
sid |
Total de archivos archivelog enviados al almacenamiento Bacula (modos CDP e inclusión de archivelog). |
podheitor_oracle_verify_blocks_checked_total |
sid |
Total de bloques de datos Oracle verificados por DBVERIFY en todos los jobs. |
podheitor_oracle_verify_blocks_bad_total |
sid |
Total de bloques corruptos detectados por DBVERIFY. Siempre debe ser 0. |
podheitor_oracle_canary_alerts_total |
sid |
Número de veces que el canary anti-ransomware disparó una alerta de cambio masivo. |
podheitor_oracle_tde_rotation_detected_total |
sid |
Número de rotaciones de clave maestra TDE detectadas (activa promoción automática a Full). |
C.2 Métricas de Indicador
| Nombre de la métrica | Etiquetas | Descripción |
|---|---|---|
podheitor_oracle_rman_channels_active |
sid |
Número de canales RMAN de backup activos en ese momento. |
podheitor_oracle_cdp_lag_seconds |
sid |
Segundos desde que se envió el último archivelog en modo CDP. Umbral de alerta: cdp_max_lag. |
podheitor_oracle_last_backup_size_bytes |
sid, mode |
Tamaño en bytes del job de backup completado más recientemente. |
podheitor_oracle_last_backup_duration_seconds |
sid, mode |
Duración en segundos del job de backup completado más recientemente. |
podheitor_oracle_last_scn |
sid |
SCN más alto observado en el backup completado más recientemente. |
C.3 Ejemplo de Configuración de Recolección Prometheus
scrape_configs:
- job_name: 'podheitor_oracle'
static_configs:
- targets:
- '192.168.15.51:9119' # VM 131 oracle-23ai-lab
- '192.168.15.117:9119' # VM 115 oracle-23ai-standby
scrape_interval: 30s
metrics_path: /metrics
C.4 Ejemplo de Regla de Alerta Grafana (Lag de CDP)
groups:
- name: podheitor_oracle_cdp
rules:
- alert: OracleCdpLagExceeded
expr: podheitor_oracle_cdp_lag_seconds > 300
for: 2m
labels:
severity: warning
annotations:
summary: "Oracle CDP lag exceeded 5 minutes on {{ $labels.sid }}"
description: "CDP archivelog shipping lag is {{ $value }}s for SID {{ $labels.sid }}"
- alert: OracleCanaryAlert
expr: increase(podheitor_oracle_canary_alerts_total[5m]) > 0
labels:
severity: critical
annotations:
summary: "Anti-ransomware canary triggered on {{ $labels.sid }}"
description: "Block-hash mass-change detected. Possible ransomware activity."
- alert: OracleBackupFailed
expr: increase(podheitor_oracle_backup_failed_total[1h]) > 0
labels:
severity: warning
annotations:
summary: "Oracle backup job failed for SID {{ $labels.sid }}"
Apéndice D — Referencia del Directorio de Estado
El plugin mantiene un directorio de estado por SID en /opt/bacula/working/oracle-state/<SID>/. Todos los archivos se escriben de forma atómica (escritura en temporal + rename). El directorio se preserva al desinstalar el paquete y solo se limpia con --purge de DEB o eliminación manual.
D.1 Estructura del Directorio de Estado
/opt/bacula/working/oracle-state/<SID>/
├── last_scn.json # Último rango SCN con backup exitoso
├── backup_manifest.json # Manifiesto del job más reciente (hash BLAKE3)
├── last_archivelog_seq # Cursor CDP: última secuencia de archivelog enviada
├── wallet_hash # SHA-256 del material de clave maestra TDE (detecta rotación)
├── checkpoint/
│ └── <jobid>.json # Checkpoint por job para reanudación (ADR-014)
└── restore/
└── <jobid>_report.json # Informe de validación post-restauración
D.2 Referencia del Contenido de Archivos
last_scn.json
{
"sid": "FREE",
"dbid": 1234567890,
"incarnation": 2,
"scn_low": 2090220,
"scn_high": 2090264,
"backup_job_id": 4989,
"timestamp": "2026-04-27T02:00:45Z",
"mode": "rman_sbt",
"level": "Full"
}
backup_manifest.json
{
"plugin_version": "1.0.0",
"sid": "FREE",
"dbid": 1234567890,
"incarnation": 2,
"oracle_version": "23.0.0.0.0",
"topology": "primary",
"scn_low": 2090220,
"scn_high": 2090264,
"backup_job_id": 4989,
"level": "Full",
"mode": "rman_sbt",
"channels": 4,
"pieces": [
{
"tag": "PODHEITOR_4989_20260427_1",
"size_bytes": 83886080,
"blake3": "a1b2c3d4e5f6..."
}
],
"archivelogs_included": true,
"controlfile_included": true,
"spfile_included": true,
"wallet_included": true,
"total_bytes": 499654432,
"timestamp": "2026-04-27T02:26:55Z"
}
checkpoint/<jobid>.json
{
"job_id": 4990,
"sid": "FREE",
"mode": "rman_sbt",
"level": "Incremental",
"last_scn": 2091000,
"pieces_transferred": 3,
"bytes_transferred": 125829120,
"timestamp": "2026-04-27T03:15:22Z"
}
Apéndice E — Guía de Resolución de Problemas
E.1 Errores Comunes y Soluciones
Binario del plugin no encontrado
bEventBackupCommand: plugin podheitor-oracle not found
Causa: El archivo podheitor-oracle-fd.so no está en el directorio de plugins Bacula o la configuración del FD no incluye el directorio de plugins.
Solución:
ls -la /opt/bacula/lib/bacula/podheitor-oracle-fd.so
# Si no existe, reinstalar el paquete o verificar PREFIX en la instalación por tarball.
# Verificar el directorio de plugins del FD:
grep -i plugindirectory /opt/bacula/etc/bacula-fd.conf
# Debe contener: Plugin Directory = /opt/bacula/lib/bacula
sudo systemctl restart bacula-fd
libobk-rs.so no encontrado por RMAN (mode=rman_sbt)
RMAN-03009: failure of backup command on ORA_SBT_TAPE_1 channel
ORA-19554: error allocating device, device type: SBT_TAPE, device name:
ORA-27211: Failed to load Media Management Library
Causa: El enlace simbólico $ORACLE_HOME/lib/libobk.so → /opt/bacula/lib/libobk-rs.so está ausente o roto.
Solución:
# Verificar enlace simbólico
ls -la $ORACLE_HOME/lib/libobk.so
# Recrear
sudo ln -sf /opt/bacula/lib/libobk-rs.so $ORACLE_HOME/lib/libobk.so
# Verificar que RMAN puede cargarlo (sin RMAN-03009 al ejecutar backup)
Permiso denegado en socket UNIX
PODHEITOR-ORACLE: cannot connect to UNIX socket
/var/run/podheitor-oracle/FREE.sock: Permission denied
Causa: El proceso libobk-rs.so (ejecutándose como el usuario OS de RMAN) no tiene permiso de escritura sobre /var/run/podheitor-oracle/.
Solución:
# Crear el directorio con la propiedad correcta
sudo mkdir -p /var/run/podheitor-oracle
sudo chown oracle:oinstall /var/run/podheitor-oracle
sudo chmod 750 /var/run/podheitor-oracle
Fallo de autenticación Oracle
PODHEITOR-ORACLE-AUDIT kind=connect_failed sid=ORCL
error: ORA-01031: insufficient privileges
Causa: El oracle_user o unix_user no tiene privilegio SYSDBA, o falta la membresía en el grupo OS de autenticación (dba).
Solución:
# Verificar que el usuario OS está en el grupo dba
id oracle
# Debe contener: groups=...,dba,...
# Verificar que la autenticación OS funciona
sudo -u oracle sqlplus / as sysdba <<< "SELECT INSTANCE_NAME FROM V$INSTANCE;"
Directorio de estado lleno
PODHEITOR-ORACLE: cannot write checkpoint: No space left on device
path: /opt/bacula/working/oracle-state/ORCL/checkpoint/4990.json
Causa: El sistema de archivos que aloja /opt/bacula/working/ está lleno.
Solución:
df -h /opt/bacula/working/
# Limpiar archivos de checkpoint antiguos:
find /opt/bacula/working/oracle-state/ -name "*.json" -mtime +30 -delete
# O ampliar el sistema de archivos.
TDE wallet cerrado en el momento del backup
PODHEITOR-ORACLE-AUDIT kind=wallet_check_failed sid=ORCL
error: ORA-28365: wallet is not open
Causa: El Oracle Wallet no está abierto. Puede ocurrir tras un reinicio de la base de datos si no está configurada la apertura automática con WALLET_ROOT.
Solución:
-- Abrir el wallet antes del backup:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "wallet_password";
-- O configurar apertura automática:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED EXTERNALLY AS 'wallet_password'
FORCE KEYSTORE;
Alternativamente, establezca wallet_passphrase_file= en la configuración del plugin para automatizar la apertura del wallet al inicio del backup.
Job de backup bloqueado — los canales RMAN no se conectan
PODHEITOR-ORACLE: waiting for RMAN channel connections (timeout in 120s)
connected: 0/4 channels
Causa: RMAN no puede cargar libobk-rs.so o no puede conectarse al socket UNIX. Frecuentemente causado por un archivo de socket obsoleto de un job que terminó de forma anormal.
Solución:
# Eliminar socket obsoleto
sudo rm -f /var/run/podheitor-oracle/FREE.sock
# Reiniciar el FD para limpiar cualquier proceso backend huérfano
sudo systemctl restart bacula-fd
E.2 Comandos de Diagnóstico
# Verificar la versión del plugin
/opt/bacula/bin/podheitor-oracle-backend --version
# Simulación sin conexión (no requiere conexión Oracle)
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
# Revisar el log del FD Bacula para eventos del plugin
journalctl -u bacula-fd -n 100 | grep -i podheitor
# Listar todos los eventos PODHEITOR-ORACLE-AUDIT de un job específico
bconsole <<< "messages" | grep -i "PODHEITOR-ORACLE-AUDIT"
# Verificar el catálogo de backup RMAN para el último backup
rman target / <<EOF
LIST BACKUP SUMMARY;
EOF
# Verificar integridad del backup manualmente
rman target / <<EOF
VALIDATE BACKUPSET ALL;
EOF
# Ejecutar DBVERIFY en todos los datafiles
dbv file=$(sqlplus -S / as sysdba <<< "SET PAGESIZE 0 FEEDBACK OFF;
SELECT name FROM v$datafile;" | tr 'n' ' ')
Apéndice F — Guía de Actualización y Migración
F.1 Actualización desde el Plugin Oracle de Bacula Enterprise
PodHeitor está diseñado para ser un reemplazo directo del Módulo Oracle de Bacula Enterprise sin necesidad de migración de datos. Los jobs, pools, volúmenes y entradas del catálogo Bacula existentes permanecen válidos.
Lista de verificación previa a la migración:
| Tarea | Notas |
|---|---|
Documentar las líneas Plugin = del FileSet actual |
La nomenclatura de parámetros es mayormente compatible; consulte la tabla de traducción abajo |
Anotar los scripts de hook RunBeforeJob / RunAfterJob |
Traducir a la convención hooks_dir |
Documentar las opciones de línea de comandos de bs_oracle_restore.pl |
Traducir a claves de pluginrestoreconf |
| Verificar que la versión del FD Bacula sea ≥ 15.0.3 | PodHeitor requiere 15.0.3 para el soporte de RestoreObject |
| Hacer backup del catálogo Bacula | Precaución estándar antes de cualquier cambio de plugin |
Tabla de traducción de parámetros (Enterprise → PodHeitor):
| Parámetro Bacula Enterprise | Equivalente PodHeitor | Notas |
|---|---|---|
Oracle_SID=ORCL |
sid=ORCL |
Traducción directa |
Oracle_Home=/u01/app/… |
oracle_home=/u01/app/… |
Traducción directa |
Oracle_User=oracle |
unix_user=oracle |
Usuario OS, no usuario de BD |
Backup_Mode=RMAN_SBT |
mode=rman_sbt |
Traducción directa |
Backup_Mode=RMAN |
mode=rman |
Traducción directa |
Backup_Mode=DATA_PUMP |
mode=dump |
|
Num_Channels=4 |
channels=4 |
O channels=auto |
Compress_Algorithm=MED |
compress=rman_medium |
|
Backup_Archivelogs=YES |
archivelog=include |
|
Validate_After_Backup=YES |
validate_after=yes |
|
| (sin equivalente) | canary=on |
Nuevo: canary anti-ransomware |
| (sin equivalente) | metrics_addr=0.0.0.0:9119 |
Nuevo: métricas Prometheus |
Pasos posteriores a la migración:
- Desinstalar el RPM/DEB del Módulo Oracle de Bacula Enterprise (no desinstalar
bacula-enterprise-fd). - Instalar
podheitor-oracle-plugin-1.0.0-1.el9.x86_64.rpm. - Crear
/opt/bacula/etc/podheitor-oracle.confcon los parámetros traducidos. - Actualizar los FileSets para usar la nueva sintaxis de
Plugin =. - Crear el enlace simbólico de
libobk-rs.sosi se utilizamode=rman_sbt. - Ejecutar
--dry-runpara validar. - Ejecutar un job de backup Full y verificar que se complete correctamente.
- Verificar que las piezas de backup antiguas de Bacula Enterprise siguen siendo restaurables (usan el mismo catálogo RMAN — no se requiere migración).
F.2 Actualización de Versiones de PodHeitor
Las actualizaciones de versiones menores (1.0.x → 1.0.y) se realizan con actualizaciones RPM/DEB en sitio:
# RPM
sudo dnf upgrade ./podheitor-oracle-plugin-1.0.1-1.el9.x86_64.rpm
# DEB
sudo apt install ./podheitor-oracle-plugin_1.0.1-1_amd64.deb
El directorio de estado en /opt/bacula/working/oracle-state/<SID>/ se preserva entre actualizaciones. El formato del manifiesto es compatible con versiones anteriores: las versiones nuevas pueden leer manifiestos escritos por versiones anteriores.
El enlace simbólico de libobk-rs.so debe verificarse nuevamente tras cada actualización si $ORACLE_HOME/lib/ fue modificado por un parche Oracle.
Apéndice G — Preguntas Frecuentes
P: ¿PodHeitor requiere alguna licencia Oracle adicional a la que ya tengo?
No. El plugin utiliza RMAN, sqlplus, dbv y expdp — todas herramientas incluidas con su licencia de Oracle Database. libobk-rs.so es una implementación de sala limpia de una API pública publicada; no deriva del código propietario de Oracle y no requiere una licencia del Oracle Backup Module.
P: ¿Sigue siendo necesario Bacula Enterprise si uso PodHeitor?
No. PodHeitor funciona completamente sobre PodHeitor Backup (la versión gratuita y de código abierto). No se requiere ninguna suscripción a Bacula Enterprise.
P: ¿Puedo usar PodHeitor junto con Bacula Enterprise para otros agentes?
Sí. PodHeitor reemplaza únicamente el plugin de backup Oracle (podheitor-oracle-fd.so). Otros plugins de Bacula Enterprise (VMware, Windows, etc.) pueden coexistir en el mismo Director y Storage. Puede migrar sus clientes Oracle a PodHeitor mientras mantiene otras cargas de trabajo en Bacula Enterprise hasta que llegue su renovación.
P: ¿El modo mode=replicate (archivelog_apply) ofrece failover en tiempo real como Active Data Guard?
El modo archivelog-apply proporciona replicación casi en tiempo real (RPO medido en minutos, según cdp_poll_interval), pero no ofrece failover automático. Mantiene una base de datos en espera física en estado MOUNT con archivelogs aplicados de forma continua. Para hacer el failover, un DBA emite ALTER DATABASE ACTIVATE STANDBY DATABASE en el host en espera. Esto equivale al procedimiento de failover manual de Oracle — el mismo resultado que el failover manual de Active Data Guard, sin la licencia EE.
P: ¿Puedo hacer backup de bases de datos Oracle en Windows?
No en la versión 1.0.0. El binario backend es solo x86_64-linux-musl; RMAN en Windows utiliza convenciones de API diferentes. El soporte para Oracle en Windows está planificado para una versión futura mediante un objetivo PE compilado en cruce.
P: ¿Qué ocurre si el job Bacula se interrumpe a mitad del backup?
El plugin escribe un checkpoint en /opt/bacula/working/oracle-state/<SID>/checkpoint/<jobid>.json tras cada pieza RMAN transferida con éxito. Cuando Bacula reintenta el job (si así está configurado), el backend detecta el checkpoint y retoma desde la última pieza exitosa. Este es el ADR-014.
P: ¿Es seguro ejecutar el plugin en una base de datos Oracle en producción?
Sí. En mode=rman_sbt y mode=rman, el plugin ejecuta RMAN en modo hot-backup — la base de datos permanece abierta y completamente disponible para las aplicaciones durante todo el backup. El mecanismo de lectura consistente multiversión de RMAN (basado en SCN) garantiza que el conjunto de backup sea autoconsistente, incluso si la base de datos está bajo carga intensa. No se requiere tiempo de inactividad de la aplicación.
P: ¿Cómo sé si mis backups Oracle son realmente restaurables?
Tres mecanismos actúan en combinación:
validate_after=yes(valor por defecto): Tras cada backup, el plugin ejecutaRMAN VALIDATE BACKUPSETpara verificar que todas las piezas de backup pueden leerse y sus sumas de verificación coinciden.verify_after=yesenpluginrestoreconf: Tras cada restauración, DBVERIFY comprueba cada bloque de datos en cada datafile.action=previewenpluginrestoreconf: En cualquier momento, un job de restauración conaction=previewejecutaRESTORE DATABASE PREVIEW— una simulación que muestra exactamente qué piezas de backup se utilizarán — en 4 segundos sin tocar la base de datos.
P: ¿PodHeitor soporta Oracle en Docker / Kubernetes?
El plugin soporta Oracle dondequiera que se ejecute, siempre que el FD Bacula y la instancia Oracle estén en el mismo host (o el FD pueda acceder a Oracle mediante las herramientas de $ORACLE_HOME). Para Oracle en contenedores, despliegue el FD Bacula como un contenedor sidecar que comparte el namespace de procesos Oracle y monte el home de Oracle. El binario musl static-pie no tiene dependencias de biblioteca que entren en conflicto con las imágenes base de contenedores.
P: ¿Cuál es el tamaño máximo de base de datos soportado?
No hay ningún límite impuesto por el plugin. El máximo teórico es lo que RMAN puede procesar — que para Oracle 19c/23ai es efectivamente ilimitado. En la práctica, las bases de datos grandes (múltiples TB) deben usar:
mode=rman_sbt(cero staging — no se requiere disco local para los datos de backup)channels=autoo un número de canales alto ajustado manualmente- BCT (
bct=auto) para incrementales rápidos - Una interfaz de red de backup dedicada para el tráfico entre Bacula FD y SD
P: ¿Puedo monitorear los jobs de backup desde Grafana?
Sí. Establezca metrics_addr=0.0.0.0:9119 en la configuración del plugin y configure Prometheus para recolectar el endpoint. Todos los dashboards estándar de Grafana para Oracle/Bacula pueden adaptarse a los nombres de métricas de PodHeitor. Consulte el Apéndice C para la referencia completa de métricas y un ejemplo de configuración de recolección Prometheus.
Versión del documento: 1.0.0 | Última actualización: 2026-04-27 Copyright © 2026 Heitor Faria — Todos los derechos reservados. Contacto: heitor@opentechs.lat | +1 786 726-1749 | +55 61 98268-4220
Licenciamiento
PodHeitor OracleDB es software propietario, distribuido por suscripción. Para condiciones comerciales, demostración técnica o diagnóstico gratuito de 30 minutos, habla con el equipo por los canales abajo.
¿Listo para evaluar?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Diagnóstico gratuito — 30 min con Heitor Faria
Disponível em:
Português (Portugués, Brasil)
English (Inglés)
Español