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, e restore Bacularis-driven sem SSH no host Oracle.

Documento técnico complementar à página do plugin PodHeitor OracleDB.

1. Problema: Bacula Enterprise Oracle plugin é Perl em volta de RMAN

O plugin Oracle do Bacula Enterprise 18.2.3 é Perl + shell + um libobk.so proprietário em C, com restore dirigido por bs_oracle_restore.pl via SSH + menu shell no host Oracle. Isso traz três problemas:

  • SSH no host Oracle para cada restore — adiciona superfície de ataque, exige acesso operacional fora-de-banda do Bacula, e quebra audit trail.
  • Sem replicação DR nativa — DR via Bacula Enterprise exige licença separada (Active Data Guard).
  • Sem CDP, sem anti-ransomware, sem Prometheus — features modernas ausentes.

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

2. Modelo arquitetural

O FD plugin loader é cdylib Rust pura (sem source AGPLv3 do Bacula linkado estaticamente); o backup engine e o runtime libobk-rs SBT v2 distribuem como binários 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 escreve direto pra 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 removeu o shim C++ legacy. O FD plugin loader é construído a partir do crate plugin-oracle no workspace PodHeitor Rust cdylib e distribui como cdylib Rust pura. Nenhum source AGPLv3 do Bacula é vinculado estaticamente. A string PluginInfo "Bacula AGPLv3" é retida puramente como token de compatibilidade ABI esperado pelo gate de plugin-license do bacula-fd.

3. Cinco modos de backup

Mode Função
mode=dump Oracle Data Pump (expdp) em 12c+, exp legacy em 11g. Schema, tablespace ou full database.
mode=rman RMAN para staging local, depois streamado para Bacula SD. Opção zero-staging FIFO.
mode=rman_sbt RMAN escreve direto para Bacula via libobk-rs.so SBT v2 — sem staging local.
mode=cdp Daemon contínuo de archivelog shipping com tracking de RPO e métricas Prometheus.
mode=replicate Replicação DR via RMAN DUPLICATE FROM ACTIVE DATABASE (EE) ou archivelog-apply (SE2).

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

Oracle SBT (System Backup to Tape) é a interface oficial pela qual RMAN escreve em “media manager” externo. Tradicionalmente isso é uma libobk.so em C, fornecida pelo vendor de backup. PodHeitor reescreve isso em Rust:

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

A partir daí, qualquer comando RMAN do tipo BACKUP DATABASE PLUS ARCHIVELOG; com device type sbt escreve direto no PodHeitor backend via socket PTCOMM, que escreve direto no Bacula SD via FD — sem disco intermediário, sem custom scripting. Multi-channel RMAN (ALLOCATE CHANNEL c1, c2, c3 ...) é mapeado para mpsc multi-producer no backend.

5. Restore Bacula-driven (o diferenciador)

O restore tradicional Bacula Enterprise + Oracle exige SSH no host Oracle e uso do menu bs_oracle_restore.pl. O PodHeitor faz tudo via RestoreObject (form Bacularis) + pluginrestoreconf em 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

Sem SSH para o host Oracle. Sem menu shell. Sem bs_oracle_restore.pl. Audit trail completo no catálogo Bacula.

6. Features avançadas

Feature Bacula Enterprise Oracle 18.2.3 PodHeitor v1.1.0
Linguagem 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 + menu) RestoreObject / pluginrestoreconf
Native DR replication ❌ (licença 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

O canary=on ativa um sampler que computa hashes de blocos amostrais durante o backup. Quando %-changed entre runs subir abruptamente além do baseline (típico de criptografia ransomware), o plugin emite warning PODHEITOR-ORACLE-AUDIT no log do job e (se configurado) aborta o backup — protegendo o backup window de ser usado para sobrescrever o último good backup.

8. Validação live (Phase F1 → F20)

Phase O que foi 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 via 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 no job log live
F14 RPM install em 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

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

9. Configuração 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 no Oracle home (apenas modo rman_sbt)
sudo ln -sf /opt/bacula/lib/libobk-rs.so "$ORACLE_HOME/lib/libobk.so"

# Validação offline
/opt/bacula/bin/podheitor-oracle-backend --dry-run /opt/bacula/etc/podheitor-oracle.conf

# Reload FD
sudo systemctl restart bacula-fd

10. Limitações conhecidas (v1.1.0)

Item Status Razão
F8.b RAC 2-node per-node parallel Code complete, sem live test Requer Oracle Grid Infrastructure + EE RAC
F12.b managed standby apply_loop Code complete, sem live test Requer Oracle EE ou SE + DG option
F19 Oracle 11g XE live test Deferred Oracle XE 11.2 EOL (2020-12-31); requer binário OTN manual
Windows FD Não planejado Linux only

11. License posture

Single-licensed sob PodHeitor-Proprietary (SPDX: LicenseRef-PodHeitor-Proprietary). Todos os componentes distribuídos (cdylib FD, backend Rust, libobk-rs) são implementações originais 100% PodHeitor. Nenhum source AGPLv3 do Bacula é vinculado estaticamente em qualquer artefato deste pacote, e nenhum source do Bacula Enterprise foi usado ou reverse-engineered.

Pronto para avaliar?

Trial gratuito de 30 dias para frotas Oracle DB em produção (11g R2 → 23ai). Garantimos no mínimo 50% de desconto vs Bacula Enterprise, Veeam ou Commvault, com mais funcionalidades inclusas (CDP, replication nativa, anti-ransomware canary).

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

Disponível em: pt-brPortuguêsenEnglish (Inglês)esEspañol (Espanhol)

Deixe um comentário