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