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:
Português (Portugués, Brasil)
English (Inglés)
Español