Whitepaper técnico — PodHeitor OracleDB para Bacula

Cinco modos de backup (dump / rman / rman_sbt / cdp / replicate), libobk-rs.so SBT v2 puro Rust, Oracle 11g R2 → 23ai, anti-ransomware canary, y restore Bacularis-driven sin SSH en el host Oracle.

Documento técnico complementario a la página del plugin PodHeitor OracleDB.

1. Problema: el plugin Oracle de Bacula Enterprise es Perl envuelto en RMAN

El plugin Oracle de Bacula Enterprise 18.2.3 es Perl + shell + un libobk.so propietario en C, con restore manejado por bs_oracle_restore.pl vía SSH + menú shell en el host Oracle. Esto trae tres problemas:

  • SSH al host Oracle para cada restore — agrega superficie de ataque, exige acceso operacional fuera-de-banda del Bacula, y rompe el audit trail.
  • Sin replicación DR nativa — DR vía Bacula Enterprise requiere licencia separada (Active Data Guard).
  • Sin CDP, sin anti-ransomware, sin Prometheus — features modernas ausentes.

El PodHeitor OracleDB Plugin entrega cinco modos nativos, restore Bacula-driven (RestoreObject + pluginrestoreconf), libobk-rs.so Rust puro, y cobertura Oracle 11g R2 → 23ai.

2. Modelo arquitectural

El FD plugin loader es cdylib Rust pura (sin source AGPLv3 de Bacula linkeado estáticamente); el backup engine y el runtime libobk-rs SBT v2 se distribuyen como binarios Rust PodHeitor-Proprietary.

bacula-fd → podheitor-oracle-fd.so (cdylib Rust)
              │ PTCOMM
              ▼
            podheitor-oracle-backend (Rust)
              ├─ Oracle Data Pump (expdp / exp legacy 11g)
              ├─ RMAN driver (zero-staging FIFO + multi-channel)
              ├─ libobk-rs.so SBT v2 (RMAN escribe directo a Bacula)
              ├─ CDP daemon (continuous archivelog shipping)
              ├─ Replicate driver (DUPLICATE FROM ACTIVE DATABASE / archivelog-apply)
              ├─ TDE wallet handler + ASM topology probe
              └─ Anti-ransomware canary sampler

v1.1.0 removió el shim C++ legacy. El FD plugin loader se construye desde el crate plugin-oracle en el workspace PodHeitor Rust cdylib y se distribuye como cdylib Rust pura. Ningún source AGPLv3 de Bacula se vincula estáticamente. El string PluginInfo "Bacula AGPLv3" se retiene puramente como token de compatibilidad ABI esperado por el gate plugin-license del bacula-fd.

3. Cinco modos de backup

Mode Función
mode=dump Oracle Data Pump (expdp) en 12c+, exp legacy en 11g. Schema, tablespace o full database.
mode=rman RMAN a staging local, luego streamed al Bacula SD. Opción zero-staging FIFO.
mode=rman_sbt RMAN escribe directo a Bacula vía libobk-rs.so SBT v2 — sin staging local.
mode=cdp Daemon continuo de archivelog shipping con tracking de RPO y métricas Prometheus.
mode=replicate Replicación DR vía RMAN DUPLICATE FROM ACTIVE DATABASE (EE) o archivelog-apply (SE2).

4. libobk-rs.so — SBT v2 en Rust puro

Oracle SBT (System Backup to Tape) es la interfaz oficial por la que RMAN escribe a un «media manager» externo. Tradicionalmente esto es una libobk.so en C, suministrada por el vendor de backup. PodHeitor lo reescribe en Rust:

sudo ln -sf /opt/bacula/lib/libobk-rs.so "$ORACLE_HOME/lib/libobk.so"

A partir de ahí, cualquier comando RMAN del tipo BACKUP DATABASE PLUS ARCHIVELOG; con device type sbt escribe directo al backend PodHeitor vía socket PTCOMM, que escribe directo al Bacula SD vía FD — sin disco intermedio, sin custom scripting. Multi-channel RMAN (ALLOCATE CHANNEL c1, c2, c3 ...) mapea a mpsc multi-producer en el backend.

5. Restore Bacula-driven (el diferenciador)

El restore tradicional Bacula Enterprise + Oracle exige SSH al host Oracle y uso del menú bs_oracle_restore.pl. PodHeitor lo hace todo vía RestoreObject (form Bacularis) + pluginrestoreconf en bconsole:

* restore client=oracle-fd
… (select jobs, mark, done) …
Plugin Restore Options:
  action          = pitr
  target_time     = 2026-04-25_15:30:00
  preview_first   = yes
  verify_after    = yes
* yes

Sin SSH al host Oracle. Sin menú shell. Sin bs_oracle_restore.pl. Audit trail completo en el catálogo Bacula.

6. Features avanzadas

Feature Bacula Enterprise Oracle 18.2.3 PodHeitor v1.1.0
Lenguaje Perl + shell + C libobk.so Pure Rust (cdylib + musl static-pie)
Oracle versions 11g R2 → 21c 11g R2 → 23ai
libobk implementation Proprietary, bconsole callback libobk-rs.so Rust cdylib
Backup modes dump, rman, rman_sbt dump, rman, rman_sbt, cdp, replicate
Restore automation bs_oracle_restore.pl (SSH + menú) RestoreObject / pluginrestoreconf
DR replication nativa ❌ (licencia separada) mode=replicate
CDP / continuous archivelog ✅ daemon mode=cdp
Anti-ransomware canary ✅ block-hash mass-change detector
Prometheus observability /metrics HTTP endpoint
cgroups v2 I/O throttle
SBOM + CVE audit make audit + make sbom

7. Anti-ransomware canary

El flag canary=on activa un sampler que computa hashes de bloques de muestra durante el backup. Cuando %-changed entre runs sube abruptamente arriba del baseline (típico de encriptación ransomware), el plugin emite warning PODHEITOR-ORACLE-AUDIT al log del job y (si está configurado) aborta el backup — protegiendo la backup window de ser usada para sobrescribir el último good backup.

8. Validación live (Phase F1 → F20)

Phase Lo validado Resultado
F1 Topology discovery (version, CDB/PDB, DG role, RAC detection) 7/7 checks
F2 Data Pump expdp — schema PHTEST 416 KB 1m27s
F3 RMAN non-SBT 2-channel — 9 pieces / 451 MB 43 s
F4 RMAN SBT vía libobk-rs — PTCOMM socket + multi-channel mpsc live
F5 BCT auto-enable + SCN chain validation live
F6 RESTORE PREVIEW 4 s, SCN 2090220–2090264 live
F8 Data Guard role gate (prefer_standby=no proceeds, =yes skips) live
F10 VALIDATE DATABASE 16,8 s zero corrupt; DBVERIFY 131k pages 0 fail live
F11 CDP daemon + Prometheus /metrics + cgroups v2 throttle live
F12 archivelog_apply T1 PASS; duplicate_active T2 PASS live (parcial)
F13 Canary sampler + PODHEITOR-ORACLE-AUDIT en el job log live
F14 RPM install en OL9.6, full backup job 4989 — T OK 26m10s live
F16–F18 bacula-fd integration, full restore PITR (job 4956: 477 MB / 19 s) live
F20 cargo audit 0 CVEs; cargo deny all-pass; DEB 568 KB + SHA256SUMS OK

Entorno: Oracle 23ai FREE, VM oracle-23ai-lab, Bacula FD 15.0.3, 523 cargo tests green.

9. Configuración mínima

# /opt/bacula/etc/podheitor-oracle.conf
sid          = ORCL
mode         = rman_sbt
oracle_home  = /u01/app/oracle/product/19c/dbhome_1
oracle_user  = oracle
auth         = os
channels     = auto
compress     = zstd:3
bct          = auto
archivelog   = include
# Symlink libobk-rs en Oracle home (sólo modo rman_sbt)
sudo ln -sf /opt/bacula/lib/libobk-rs.so "$ORACLE_HOME/lib/libobk.so"

# Validación offline
/opt/bacula/bin/podheitor-oracle-backend --dry-run /opt/bacula/etc/podheitor-oracle.conf

# Reload FD
sudo systemctl restart bacula-fd

10. Limitaciones conocidas (v1.1.0)

Item Status Razón
F8.b RAC 2-node per-node parallel Code complete, sin live test Requiere Oracle Grid Infrastructure + EE RAC
F12.b managed standby apply_loop Code complete, sin live test Requiere Oracle EE o SE + DG option
F19 Oracle 11g XE live test Deferred Oracle XE 11.2 EOL (2020-12-31); requiere binario OTN manual
Windows FD No planeado Linux only

11. Postura de licencia

Single-licensed bajo PodHeitor-Proprietary (SPDX: LicenseRef-PodHeitor-Proprietary). Todos los componentes distribuidos (cdylib FD, backend Rust, libobk-rs) son implementaciones originales 100% PodHeitor. Ningún source AGPLv3 de Bacula se vincula estáticamente en ningún artefacto de este paquete, y ningún source de Bacula Enterprise se ha usado o sometido a reverse-engineering.

¿Listo para evaluar?

Trial gratuito de 30 días para flotas Oracle DB en producción (11g R2 → 23ai). Garantizamos al menos 50% de descuento vs Bacula Enterprise, Veeam o Commvault, con más funcionalidades incluidas (CDP, replication nativa, anti-ransomware canary).

Heitor Faria — Fundador, PodHeitor International
[email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página del plugin PodHeitor OracleDB

Disponível em: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta