Backup Oracle Database integrado com RMAN. Hot backup, archive log streaming, PITR ao SCN, suporte a Data Guard primário/standby, RAC e PDB multi-tenant.
- Integração RMAN nativa — controle de catálogo, validação BLOCKRECOVER automática.
- Archive log streaming contínuo — RPO próximo de zero.
- PITR ao SCN — restauração precisa por número de transação Oracle.
- Data Guard-aware — backup do standby, zero overhead no primário.
- RAC e Multi-tenant (PDB) — backup individual de PDB, restore para CDB diferente.
Comece em 30 dias, no mínimo 50% mais barato. Trial gratuito, RPMs e DEBs assinados, suporte direto com Heitor Faria. Substitua sua licença Veeam, Commvault ou Bacula Enterprise sem quebrar a janela noturna.
Solicitar trial gratuito de 30 dias →
OFERTA COMERCIAL — LEIA PRIMEIRO
Migrando do Bacula Enterprise, Veeam, Commvault ou NetBackup? Traga sua proposta de renovação ou contrato vigente e garantimos no mínimo 50% de desconto — com significativamente mais recursos incluídos.
| Canal | Contato | |———|———| | E-mail | heitor@opentechs.lat | | Telefone / WhatsApp (internacional) | +1 786 726-1749 | | Telefone / WhatsApp (Brasil) | +55 61 98268-4220 |
Índice
- Sumário Executivo
- O Problema
- Visão Geral da Solução
- Arquitetura
- Tabela Comparativa de Recursos
- Referência de Opções de Backup
- Referência de Opções de Restauração
- Exemplos de Configuração de FileSet
- Exemplos de Job de Restauração
- Guia de Instalação e Dimensionamento
- Matriz de Compatibilidade
- Relatório de Desempenho
- Segurança e Conformidade
- Suporte e Termos Comerciais
- Apêndice A — Registros de Decisão de Arquitetura
- Apêndice B — Glossário
1. Sumário Executivo
O Que É?
O PodHeitor OracleDB Backup and Replication Plugin for PodHeitor Backup é um plugin de nível produção para o Bacula File Daemon que oferece proteção abrangente para bancos de dados Oracle — desde backups a quente via RMAN SBT v2 até proteção contínua de dados (CDP) e replicação nativa para recuperação de desastres — a uma fração do custo das alternativas proprietárias.
Escrito inteiramente em Rust (construído em Rust com segurança de memória nativa e zero dependências de runtime), o plugin é distribuído como um único pacote RPM ou DEB (menos de 700 KB instalado) e não requer bibliotecas de terceiros específicas para Oracle, implementações proprietárias de SBT nem scripts shell externos ao Bacula.
Valor de Negócio em Três Pontos
- Redução de Custo de 50% ou Mais. O backup de bancos de dados Oracle é um dos itens mais caros no orçamento de TI de qualquer empresa. O Bacula Enterprise cobra taxas de licenciamento por cliente ou por agente que se acumulam a cada instância Oracle protegida. Veeam, Commvault e NetBackup somam licenças de agente, módulos adicionais e manutenção anual. O PodHeitor entrega todas as capacidades dessas plataformas — e várias que elas não possuem — sob PodHeitor-Proprietary, eliminando completamente a cobrança por socket ou por TB.
- Mais Recursos, Não Menos. Esta não é uma alternativa open-source limitada. O plugin supera o Bacula Enterprise 18.2.3 em proteção contínua de dados (modo daemon CDP), replicação nativa de DR para Standard Edition 2 (archivelog-apply), observabilidade Prometheus/OpenTelemetry, detecção de canário anti-ransomware, validação automatizada pós-restauração com DBVERIFY e integridade da cadeia de suprimentos via CycloneDX SBOM. O Bacula Enterprise não possui nenhum desses recursos.
- Automação de Restauração Nativa no Bacula. Os produtos concorrentes exigem que o operador acesse via SSH o host Oracle e invoque um script Perl (
bs_oracle_restore.pl) ou equivalente fora de qualquer trilha de auditoria. O PodHeitor utiliza o mecanismo nativo RestoreObject do Bacula: um documentopluginrestoreconfembutido em cada backup dispara uma restauração totalmente automatizada e catalogada diretamente a partir dobconsoleou do console web Bacularis. Não é necessário acesso SSH ao host Oracle.
Para Quem É Este Documento
- DBAs Oracle avaliando estratégias de backup para cargas de trabalho das versões 11g a 23ai.
- Administradores Bacula que desejam substituir um plugin Oracle comercial sem reformular sua infraestrutura.
- Arquitetos de Infraestrutura projetando pipelines de recuperação de desastres e replicação de dados para ambientes Oracle Standard Edition 2 ou Enterprise Edition.
- Equipes de Compras de TI comparando custos de licença e paridade de recursos com Bacula Enterprise, Veeam for Oracle, Commvault IntelliSnap Oracle e NetBackup for Oracle.
2. O Problema
O Backup Oracle É Excepcionalmente Complexo
O backup do Oracle Database é diferente de fazer backup de um sistema de arquivos ou de um banco de dados relacional simples. Um backup Oracle correto deve considerar:
- Consistência de SCN — backups que abrangem múltiplos datafiles devem ser consistentes no mesmo System Change Number, caso contrário produzem um conjunto irrecuperável.
- Integridade da cadeia de archivelog — a recuperação pontual (point-in-time) exige uma sequência ininterrupta de redo logs arquivados desde o último backup Full até o momento-alvo.
- Controlfile e SPFILE — o banco de dados não pode ser montado sem eles; devem ser copiados atomicamente junto com cada backup de datafile.
- Multitenant (CDB/PDB) — o Oracle 12c e versões posteriores permitem centenas de bancos de dados plugáveis dentro de um contêiner; a estratégia de backup deve tratar tanto o contêiner raiz quanto os PDBs individuais de forma independente.
- Criptografia TDE — os wallets de Transparent Data Encryption devem ser copiados e rotacionados de forma coordenada, caso contrário a restauração torna-se impossível.
- ASM e RAC — a Grid Infrastructure adiciona abstração de armazenamento (ASM) e paralelismo de cluster (RAC) que ferramentas de backup genéricas não conseguem enxergar.
O RMAN (Recovery Manager) é o mecanismo de backup nativo do Oracle e a única ferramenta que atende completamente a todos esses requisitos. Qualquer solução de backup Oracle séria deve se integrar ao RMAN em profundidade — não executando rman target / e arquivando os arquivos de saída como se fossem objetos arbitrários do sistema de arquivos.
O Problema de Custo
| Produto | Custo Típico de Backup Oracle | Observações |
|---|---|---|
| Bacula Enterprise | US$ 3.000–US$ 8.000 / ano por host Oracle | Módulo Oracle adicional sobre a licença base do FD |
| Veeam for Oracle | US$ 2.500–US$ 6.000 / ano por socket | Requer Veeam Backup & Replication Enterprise Plus |
| Commvault IntelliSnap Oracle | US$ 5.000–US$ 15.000 / ano por host | Licença de agente + IntelliSnap |
| NetBackup for Oracle | US$ 4.000–US$ 12.000 / ano por host | Licença NBU Client + DB Agent |
| PodHeitor | Taxa fixa por organização (sem custo por host) | Suporte comercial disponível com o autor |
Os valores indicados são baseados em preços de tabela publicamente disponíveis e relatos da comunidade até 2026. Os preços negociados reais variam. O fato permanece: para uma organização que protege 10 hosts Oracle, a economia anual em comparação com qualquer solução proprietária varia de US$ 25.000 a US$ 150.000.
O Problema de Restauração — O Custo Oculto
O custo das ferramentas proprietárias de backup Oracle não se resume à taxa de licença. O custo oculto está na complexidade da restauração.
O Bacula Enterprise 18.2.3 inclui um script Perl chamado bs_oracle_restore.pl. Para realizar uma recuperação pontual, o DBA deve:
- Acessar via SSH o host Oracle (requer acesso ao sistema operacional, VPN e gerenciamento de chaves).
- Localizar a versão correta do
bs_oracle_restore.pl(que muda entre versões do Bacula). - Executar o script com os parâmetros corretos — uma dúzia de flags sem validação interativa.
- Torcer para que o script gere os comandos RMAN corretos para o timestamp-alvo.
- Monitorar o progresso diretamente no host Oracle — sem entrada no catálogo Bacula para a operação de restauração.
- Abrir manualmente o banco de dados com RESETLOGS caso o script não o faça automaticamente.
Esse fluxo de trabalho é propenso a erros, impossível de auditar e requer acesso no nível do sistema operacional que a maioria das políticas de segurança proíbe conceder a DBAs da camada de aplicação.
O PodHeitor elimina tudo isso. Todo o fluxo de restauração — incluindo PITR, baseado em SCN, recuperação em nível de tabela, clone e ações de validação — é conduzido a partir do bconsole ou do formulário web Bacularis, com trilha de auditoria completa no catálogo Bacula, sem nenhum acesso SSH ao host Oracle.
A Lacuna em Replicação e CDP
Nenhum dos quatro principais produtos concorrentes (Bacula Enterprise, Veeam, Commvault, NetBackup) inclui proteção contínua de dados (CDP) nativa ou replicação para recuperação de desastres em Oracle Standard Edition 2 no nível do banco de dados, sem licenciamento Oracle adicional (o Active Data Guard requer Oracle Enterprise Edition).
O PodHeitor inclui:
mode=cdp— um daemon que envia continuamente archivelogs para o armazenamento Bacula, entregando RPO em minutos em vez de horas.mode=replicatecomreplicate_method=archivelog_apply— um canal de replicação de DR que funciona com Oracle Standard Edition 2, Oracle Express Edition e Oracle 23ai FREE, sem necessidade de licença Active Data Guard.
3. Visão Geral da Solução
O Que o Plugin Oferece
O PodHeitor OracleDB Backup Plugin integra o PodHeitor Backup ao Oracle RMAN por meio de uma implementação clean-room da API Oracle SBT v2 (libobk-rs.so), entregando cinco modos distintos de backup, restauração totalmente automatizada e replicação nativa de DR — tudo em um único pacote RPM de 622 KB.
Cinco Modos de Backup
| Modo | Descrição | Requisito Oracle | Staging Necessário |
|---|---|---|---|
rman_sbt |
RMAN via SBT v2 sem staging (libobk-rs). Recomendado para produção. |
11g R2+ | Nenhum — transmite diretamente |
rman |
RMAN grava em staging local; backend transmite para o Bacula. | 11g R2+ | Sim — disco temporário |
dump |
Backup lógico via Oracle Data Pump (expdp / impdp). |
11g R2+ (exp no 11g) |
Sim — disco temporário |
cdp |
Daemon de archivelog contínuo. Proteção com baixo RPO. | 11g R2+ | Nenhum |
replicate |
Replicação de DR via Active DG duplicate ou archivelog-apply. | SE2 ou EE | Opcional |
Visão Geral da Arquitetura
┌─────────────────────────────────────────────────────────────┐
│ 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) │
└─────────────────────────┘
Automação de Restauração via RestoreObject
Cada backup incorpora um RestoreObject pluginrestoreconf no catálogo Bacula. No momento da restauração, o operador seleciona uma ação no bconsole ou no formulário web Bacularis — não é necessário acesso SSH ao host Oracle. O plugin valida a configuração, gera o script RMAN apropriado, opcionalmente executa um RESTORE PREVIEW, realiza a restauração e registra um manifesto pós-restauração no catálogo.
Replicação de DR — Nativa
mode=replicate com replicate_method=archivelog_apply cria um banco de dados standby ao:
- Executar RMAN DUPLICATE para criar a cópia standby inicial.
- Enviar e aplicar continuamente archivelogs ao host standby.
Isso fornece proteção equivalente ao Active Data Guard sem licenciamento Oracle Enterprise Edition — uma capacidade ausente em todos os produtos concorrentes listados neste whitepaper.
4. Arquitetura
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 Fluxo de Dados mode=rman_sbt (Zero-Staging, Recomendado)
No modo rman_sbt, o RMAN transmite dados diretamente para o Bacula Storage via canal interno otimizado — sem disco temporário necessário. O backend gerencia os canais RMAN em paralelo, com compressão integrada antes da transmissão.
4.3 mode=cdp — Loop do Daemon de Proteção Contínua de Dados
4.4 Fluxo de Restauração — RestoreObject → RMAN
4.5 Escolhas Tecnológicas
| Componente | Tecnologia | Justificativa |
|---|---|---|
| Binário backend | Rust 2021, musl static-pie | Segurança de memória, zero dependências em tempo de execução, implantação em arquivo único |
| Shim do FD | C++ (Bacula Plugin API) | O Bacula exige um ABI de plugin C/C++ |
| Protocolo IPC | PTCOMM (binário, fork+pipe) | Sem overhead de socket de rede; enquadramento determinístico |
| Implementação SBT | libobk-rs (Rust plugin nativo clean-room) |
Proprietário; reimplementação clean-room da API SBT Oracle |
| IPC SBT ↔ backend | UNIX socket /var/run/podheitor-oracle/<SID>.sock |
Baixa latência, mesmo host, isolamento por SID |
| Persistência de estado | Arquivos JSON, /opt/bacula/working/oracle-state/<SID>/ |
Legível por humanos, gravação atômica com rename |
| Observabilidade | Formato texto Prometheus, TCP stdlib | Endpoint nativo, sem dependências externas |
| Throttle de I/O | cgroups v2 io.max |
Imposto pelo kernel, sem estimativas de taxa RMAN |
| Licença | PodHeitor-Proprietary | Copyright © Heitor Faria — All rights reserved |
5. Tabela Comparativa de Recursos
A tabela a seguir compara o PodHeitor v1.0.0 com Bacula Enterprise 18.2.3, Veeam Backup & Replication for Oracle, Commvault IntelliSnap Oracle e NetBackup for Oracle.
Legenda: S = Sim/Suportado | N = Não/Não suportado | M = Manual/Requer etapas extras | P = Parcial | EE = Requer Oracle Enterprise Edition
5.1 Modos de Backup
| Recurso | Bacula Enterprise 18.2.3 | Veeam | Commvault | NetBackup | PodHeitor 1.0.0 |
|---|---|---|---|---|---|
| RMAN SBT v2 (zero-staging) | S (libobk.so proprietário) | N | N | S (nbora) | S (libobk-rs.so clean-room, Proprietary) |
| RMAN sem SBT (staging) | S | N | P | P | S + opção FIFO zero-staging |
Data Pump (expdp) |
P (via dump_pump_opt) | N | N | N | S (padrão no 12c+) |
| exp legado (11g) | S | N | N | N | S |
| Archivelog contínuo (CDP) | N | N | N | N | S (modo daemon, mode=cdp) |
| Replicação de DR (compat. SE2) | N | N | N | N | S (archivelog_apply) |
| Active DG duplicate | N (licença separada) | N | N | EE | S (duplicate_active, sem licença extra) |
5.2 Backup Incremental e Avançado
| Recurso | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Incremental Nível 0/1 RMAN | S | S | S | S | S |
| Incremental FROM SCN | S | N | N | P | S + detector de gap de SCN + retomada |
| Block Change Tracking | S (manual) | S | S | S | S (habilitação automática + verificação de sanidade) |
| Backup de archivelog | S | S | S | S | S |
| Autobackup de controlfile | S | S | S | S | S |
| Backup de SPFILE / pfile / orapw | S | N | N | P | S |
| Multicanal paralelo | S (ALLOCATE manual) | S | S | S | S (ajuste automático por cores de CPU/IOPS) |
| Checkpoint / retomada | N | N | N | N | S (ADR-014, cadeia SCN) |
| Política de exclusão de archivelog | N | N | N | N | S (archivelog_keep_backed_up=N) |
| Snapshot AWR ao final do Full | N | N | N | N | S (awr_snapshot=yes) |
5.3 Topologia e Multitenant
| Recurso | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Oracle 11g R2 | S | N | P | S | S |
| Oracle 12c / 18c / 19c / 21c | S | S | S | S | S |
| Oracle 23ai | P | P | N | P | S (validado em produção) |
| RAC auto-discovery | M | N | S | S | S (automático + paralelo por nó) |
| Multitenant CDB/PDB | S (implícito) | S | S | S | S (paralelo por PDB + seletivo) |
| Controle de papel Data Guard | S (implícito) | N | P | S | S (prefer_standby=no/yes/auto) |
| Tratamento de caminho ASM | S | S | S | S | S (resolução asmcmd + filtro dbv) |
| Restauração cross-endian (Solaris→Linux) | M (manual) | N | N | P | S (RMAN CONVERT DATAFILE automático) |
| Backup de wallet TDE | S | P | P | P | S (ciente de rotação de master-key) |
5.4 Automação de Restauração
| Recurso | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Restauração sem SSH ao host Oracle | N | N | N | N | S (somente bconsole) |
| Trilha de auditoria no catálogo Bacula | N | N | N | N | S (JobLog completo + manifesto) |
| PITR (recuperação pontual) | M (script perl) | M | M | M | S (1 passo, action=pitr) |
| Restauração baseada em SCN | M | N | N | M | S (1 passo, action=scn) |
| Recuperação em nível de tabela (12c+) | M | N | N | M | S (1 passo, action=table) |
| Clone para host/SID diferente | M (beta) | M | M | M | S (action=clone) |
| RESTORE PREVIEW antes da execução | N | N | N | N | S (preview_first=yes) |
| VALIDATE DATABASE após restauração | N | N | N | N | S (verify_after=yes) |
| Modo dry-run | N | N | N | N | S (dry_run=yes) |
| Flashback Database | N | N | N | N | S (action=flashback) |
| Formulário web Bacularis para restauração | N | N/A | N/A | N/A | S (integração nativa Bacularis) |
5.5 Compressão e Throttle
| Recurso | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| RMAN BASIC/MEDIUM/HIGH | S | S | S | S | S |
| pipe zstd / lz4 pré-SBT | N | N | N | N | S (opção de dupla compressão) |
| Throttle RMAN RATE | S | S | S | S | S |
| Throttle I/O cgroups v2 | N | N | N | N | S (cgroup_write_bps=) |
5.6 Observabilidade e Cadeia de Suprimentos
| Recurso | Bacula Enterprise | Veeam | Commvault | NetBackup | PodHeitor |
|---|---|---|---|---|---|
| Endpoint Prometheus /metrics | N | N | N | N | S (metrics_addr=host:port) |
| Canário anti-ransomware | N | S (separado) | S (separado) | S (separado) | S (integrado, amostrador de hash de bloco) |
| Redação de credenciais no log de auditoria | N | N | N | N | S (senhas/chaves nunca nos logs) |
| DBVERIFY pós-restauração | N | N | N | N | S (automatizado) |
| Preflight em modo dry-run | N | N | N | N | S (flag –dry-run) |
| Builds reproduzíveis | N (proprietário) | N | N | N | S (musl static-pie, Cargo.lock) |
| SBOM (CycloneDX) | N | N | N | N | S (make sbom) |
| Auditoria de CVE (cargo-audit + cargo-deny) | N | N | N | N | S (0 CVEs conhecidos) |
6. Referência de Opções de Backup
Todos os parâmetros são especificados na diretiva Plugin = do Bacula dentro de um bloco FileSet. Os parâmetros também podem ser colocados no arquivo de configuração (padrão: /opt/bacula/etc/podheitor-oracle.conf) como linhas chave=valor — parâmetros passados na linha do plugin sempre sobrepõem os valores do arquivo de configuração.
6.1 Conexão e Identidade
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | ||
|---|---|---|---|---|---|---|
sid |
string | * (todos detectados) |
Oracle SID (nome da instância). Use * para detectar automaticamente todas as instâncias em execução. |
1.0.0 | ||
oracle_home |
caminho | auto |
Caminho do $ORACLE_HOME. auto lê de /etc/oratab ou oraenv. |
1.0.0 | ||
oracle_user |
string | / as sysdba |
Usuário do SO para conexão. Defina como oracle para autenticação pelo SO. |
1.0.0 | ||
unix_user |
string | oracle |
Conta do SO para a qual o backend muda antes de iniciar o RMAN/sqlplus. | 1.0.0 | ||
use_sudo |
bool | no |
Prefixar comandos oracle com sudo -u <unix_user> em vez de setuid. |
1.0.0 | ||
auth |
os |
pwfile:<path> |
walletconn:<alias> |
os |
Método de autenticação. os = / as sysdba. pwfile: = arquivo de senha. walletconn: = alias TNS do Oracle Wallet. |
1.0.0 |
config_file |
caminho | /opt/bacula/etc/podheitor-oracle.conf |
Caminho alternativo para o arquivo de configuração. | 1.0.0 | ||
instance |
string | * |
Filtro de instância RAC. * = todas as instâncias. |
1.0.0 | ||
verbose |
0–3 | 0 |
Nível de verbosidade no log de job do Bacula. | 1.0.0 | ||
debug |
0–9 | 0 |
Nível de depuração; ≥5 habilita dumps de frames PTCOMM. | 1.0.0 | ||
trace |
caminho | “ | Grava log de rastreamento em arquivo (além do log de job do Bacula). | 1.0.0 |
6.2 Modo de Backup
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | ||||
|---|---|---|---|---|---|---|---|---|
mode |
rman_sbt |
rman |
dump |
cdp |
replicate |
dump |
Modo de backup. rman_sbt é recomendado para produção. |
1.0.0 |
6.3 Opções RMAN (aplicáveis a mode=rman e mode=rman_sbt)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | ||
|---|---|---|---|---|---|---|
channels |
auto |
1–64 | auto |
Número de canais de backup RMAN. auto ajusta ao número de cores da CPU. |
1.0.0 | |
auto_tune_channels |
bool | yes |
Quando channels=auto, ajusta dinamicamente a contagem de canais com base nos cores disponíveis. |
1.0.0 | ||
bct |
auto |
on |
off |
auto |
Block Change Tracking. auto habilita se ainda não estiver habilitado. |
1.0.0 |
archivelog |
include |
exclude |
only |
include |
Tratamento de archivelog. include = fazer backup após os datafiles. only = backup somente de archivelog. |
1.0.0 |
archivelog_keep_backed_up |
0–99 | 0 |
Excluir archivelogs da FRA após N cópias de backup. 0 = desabilitado. | 1.0.0 | ||
max_rate_mb |
0–99999 | 0 (ilimitado) |
Limite de taxa por canal RMAN em MB/s. 0 = sem limite (use cgroup_write_bps para throttle via cgroups). |
1.0.0 | ||
ctrlfile |
caminho | /tmp/oracle |
Prefixo de caminho de staging para autobackup do controlfile. | 1.0.0 | ||
hooks_dir |
caminho | /opt/bacula/etc |
Diretório verificado em busca de scripts de hook oracle_before_*.rman / oracle_after_*.rman. |
1.0.0 |
6.4 Compressão
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
compress |
none |
zstd |
lz4 |
gzip |
rman_basic |
rman_medium |
rman_high |
zstd |
Algoritmo de compressão. rman_* usa a compressão nativa RMAN dentro do bloco RMAN. zstd/lz4/gzip aplica compressão em nível de pipe antes de enviar ao Bacula. |
1.0.0 |
compress_level |
1–22 (zstd), 1–9 (gzip) | 3 |
Nível de compressão (aplica-se apenas a zstd e gzip). | 1.0.0 |
6.5 Canais e Paralelismo
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | ||
|---|---|---|---|---|---|---|
parallel_dbs |
1–64 | 4 |
Máximo de bancos de dados para backup em paralelo (quando sid=*). |
1.0.0 | ||
parallel_pdbs |
1–64 | 4 |
Máximo de PDBs para backup em paralelo dentro de um CDB. | 1.0.0 | ||
parallel_nodes |
0–64 | 0 (todos) |
Máximo de nós RAC a usar simultaneamente. 0 = todos os descobertos. | 1.0.0 | ||
prefer_standby |
no |
yes |
auto |
no |
Controle de papel Data Guard. no = backup somente no PRIMARY. yes = exigir standby físico. auto = executar em qualquer papel físico-capaz. |
1.0.0 |
6.6 Multitenant (CDB/PDB)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | |
|---|---|---|---|---|---|
pdbs |
* |
nomes separados por vírgula | * |
Filtro de nome de PDB. * = todos os PDBs. Exemplo: pdbs=PDB1,PDB2. |
1.0.0 |
pdb_skip_seed |
bool | yes |
Ignorar PDB$SEED (o PDB seed somente leitura) nos backups multitenant. |
1.0.0 | |
exclude_tablespace |
nomes separados por vírgula | “ | Nomes de tablespace a excluir do backup. | 1.0.0 | |
exclude_pdb |
nomes separados por vírgula | “ | Nomes de PDB a excluir do backup. | 1.0.0 |
6.7 Wallet TDE
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | |
|---|---|---|---|---|---|
wallet_backup |
bool | yes |
Incluir backup do wallet TDE no job. | 1.0.0 | |
wallet_path |
caminho | auto |
auto |
Caminho para o diretório do Oracle Wallet. auto lê do sqlnet.ora. |
1.0.0 |
wallet_passphrase_file |
caminho | “ | Arquivo contendo a frase-senha de abertura do wallet. As permissões devem ser 600. | 1.0.0 |
6.8 Data Pump (mode=dump)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | |
|---|---|---|---|---|---|
dump_format |
expdp |
exp |
expdp |
Usar Data Pump (expdp) ou exportação legada (exp). Forçado para exp no 11g. |
1.0.0 |
dump_opt |
string | CONSISTENT=Y GRANTS=y |
Opções extras anexadas à linha de comando exp. |
1.0.0 | |
dump_pump_opt |
string | “ | Opções extras anexadas ao parfile do expdp (ex.: EXCLUDE=STATISTICS). |
1.0.0 | |
schema |
* |
separados por vírgula | * |
Filtro de schema (owner) para exportação Data Pump. * = todos os schemas. |
1.0.0 |
6.9 Proteção Contínua de Dados (mode=cdp)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde |
|---|---|---|---|---|
cdp_poll_interval |
1–3600 (segundos) | 5 |
Frequência (em segundos) com que o daemon CDP consulta v$archived_log em busca de novos logs. |
1.0.0 |
cdp_max_lag |
1–86400 (segundos) | 300 |
Limiar de alarme de RPO em segundos. Dispara PODHEITOR-ORACLE-AUDIT kind=cdp_lag_exceeded quando excedido. |
1.0.0 |
6.10 Replicação (mode=replicate)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | |
|---|---|---|---|---|---|
replicate_method |
duplicate_active |
archivelog_apply |
duplicate_active |
duplicate_active = RMAN DUPLICATE FROM ACTIVE DATABASE (EE). archivelog_apply = bootstrap + aplicação contínua de logs (compatível com SE2). |
1.0.0 |
target_sid |
string | “ | SID do banco de dados standby (obrigatório no modo replicate). | 1.0.0 | |
target_host |
string | “ | FQDN ou IP do host standby. | 1.0.0 | |
target_oracle_home |
caminho | “ | $ORACLE_HOME no host standby. |
1.0.0 |
6.11 Validação (verificação de integridade pós-backup)
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde |
|---|---|---|---|---|
validate_after |
bool | yes |
Executar RMAN VALIDATE BACKUPSET após cada job de backup. |
1.0.0 |
6.12 Canário Anti-Ransomware
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde |
|---|---|---|---|---|
canary |
bool | no |
Habilitar canário de amostragem de hash de bloco. Detecta alterações em massa nos datafiles entre execuções de backup. | 1.0.0 |
canary_blocks |
1–4096 | 64 |
Número de blocos aleatórios amostrados por datafile em cada verificação de canário. | 1.0.0 |
canary_threshold_pct |
1–100 | 25 |
Percentual de blocos alterados que dispara uma mensagem PODHEITOR-ORACLE-CANARY-ALERT. |
1.0.0 |
6.13 Observabilidade
| Parâmetro | Tipo / Valores Válidos | Padrão | Descrição | Desde | |
|---|---|---|---|---|---|
metrics_addr |
host:port |
0 |
0 (desabilitado) |
Endereço de bind para o endpoint HTTP Prometheus /metrics. Exemplo: 0.0.0.0:9119. |
1.0.0 |
cgroup_write_bps |
0–(uint64) | 0 (desabilitado) |
Throttle de escrita I/O cgroups v2 em bytes/s. Requer que o processo backend esteja em uma hierarquia cgroup v2. | 1.0.0 | |
awr_snapshot |
bool | no |
Criar um snapshot AWR ao final de cada backup Full e gravar relatório de desempenho HTML no diretório de estado. Não é fatal no XE/SE2. | 1.0.0 | |
goldengate_aware |
bool | no |
Detectar processos GoldenGate ativos e emitir o checkpoint SCN deles antes de cada backup. | 1.0.0 |
6.14 Hooks
Os arquivos de hook são colocados em hooks_dir (padrão /opt/bacula/etc). O backend verifica arquivos que correspondam a esses padrões antes e após a execução do RMAN:
| Arquivo de Hook | Gatilho | Observações |
|---|---|---|
oracle_before_full_backup.rman |
Antes do backup Full RMAN | Nomenclatura compatível com o Enterprise |
oracle_after_full_backup.rman |
Após o backup Full RMAN | Extensão: after-hooks são exclusivos do PodHeitor |
oracle_before_incremental_backup.rman |
Antes do backup Incremental | |
oracle_after_incremental_backup.rman |
Após o backup Incremental | |
oracle_before_full_backup_<SID>.rman |
Antes do Full — específico por SID | Tem prioridade sobre o hook genérico |
oracle_after_full_backup_<SID>.rman |
Após o Full — específico por SID |
As opções de restauração são fornecidas via o RestoreObject pluginrestoreconf, que é incorporado em cada backup e renderizado como prompts interativos no bconsole ou como um formulário no Bacularis. As chaves seguem a sintaxe INI chave = valor com comentários #.
7.1 Campos Principais (todas as ações)
| Chave | Tipo / Valores Válidos | Padrão | Descrição | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
action |
pitr |
scn |
table |
clone |
full |
preview |
validate |
flashback |
preview |
Ação de restauração a executar. Obrigatório. |
auto_open_resetlogs |
bool | yes |
Emite automaticamente ALTER DATABASE OPEN RESETLOGS após RECOVER DATABASE. |
|||||||
shutdown_if_open |
bool | yes |
Emite SHUTDOWN IMMEDIATE antes da restauração se o banco de dados estiver aberto. |
|||||||
parallelism |
auto |
1–64 | auto |
Número de canais de restauração RMAN. auto corresponde à contagem de canais do backup original. |
||||||
verify_after |
bool | yes |
Executa RMAN VALIDATE DATABASE CHECK LOGICAL + DBVERIFY após a restauração. |
|||||||
preview_first |
bool | no |
Executa RESTORE DATABASE PREVIEW antes de iniciar a restauração. Gera um plano sem modificar o banco de dados. |
|||||||
require_explicit_confirmation |
bool | yes |
Para ações destrutivas, solicita que o operador digite yes no bconsole antes de prosseguir. |
|||||||
dry_run |
bool | no |
Analisa e valida a configuração, gera o script RMAN, imprime-o no log do job, mas não o executa. |
7.2 action=pitr — Recuperação Pontual (Point-in-Time Recovery)
| Chave | Tipo / Valores Válidos | Padrão | Descrição |
|---|---|---|---|
target_time |
YYYY-MM-DD_HH:MM:SS |
— | Obrigatório. Timestamp alvo da recuperação. Exemplo: 2026-04-25_15:30:00. |
Bloco RMAN gerado:
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;
}
Exemplo 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 — Recuperação Baseada em SCN
| Chave | Tipo / Valores Válidos | Padrão | Descrição |
|---|---|---|---|
target_scn |
inteiro positivo | — | Obrigatório. System Change Number alvo. Exemplo: 2090264. |
Bloco RMAN gerado:
RUN {
SET UNTIL SCN 2090264;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
Exemplo de pluginrestoreconf:
action = scn
target_scn = 2090264
dry_run = no
7.4 action=table — Recuperação em Nível de Tabela (Oracle 12c+)
| Chave | Tipo / Valores Válidos | Padrão | Descrição |
|---|---|---|---|
table_owner |
string | — | Obrigatório. Schema (proprietário) da tabela. Exemplo: SCOTT. |
table_name |
string | — | Obrigatório. Nome da tabela a recuperar. Exemplo: EMP. |
auxiliary_destination |
caminho | — | Obrigatório. Caminho temporário no sistema de arquivos para a instância auxiliar usada por RECOVER TABLE. |
Bloco RMAN gerado:
RECOVER TABLE SCOTT.EMP
UNTIL TIME "TO_DATE('...')"
AUXILIARY DESTINATION '/u01/aux';
Exemplo 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 para Host ou SID Diferente
| Chave | Tipo / Valores Válidos | Padrão | Descrição |
|---|---|---|---|
target_db_name |
string | — | Obrigatório. Novo nome de banco de dados (SID) para o clone. |
target_host |
FQDN ou IP | — | Host de destino para o clone. Deixar em branco para clone no mesmo host. |
target_oracle_home |
caminho | — | $ORACLE_HOME no host de destino. |
db_file_name_convert |
'/src/','/dst/' |
— | Pares DB_FILE_NAME_CONVERT do RMAN para tradução do caminho dos datafiles. |
Exemplo 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 — Restauração Completa (Backup Mais Recente Disponível)
Nenhuma chave adicional obrigatória. Restaura para o conjunto de backup consistente mais recente.
Exemplo de pluginrestoreconf:
action = full
preview_first = yes
verify_after = yes
shutdown_if_open = yes
7.7 action=preview — Visualização Somente Leitura
Executa RESTORE DATABASE PREVIEW SUMMARY e gera o plano no log do job Bacula. Não modifica o banco de dados.
Exemplo de pluginrestoreconf:
action = preview
7.8 action=validate — Validação do Banco de Dados (Somente Leitura)
Executa VALIDATE DATABASE CHECK LOGICAL e DBVERIFY em todos os datafiles. Sem nenhuma modificação; indicado como verificação de integridade programada.
Exemplo de pluginrestoreconf:
action = validate
7.9 action=flashback — Flashback Database
| Chave | Tipo / Valores Válidos | Padrão | Descrição |
|---|---|---|---|
target_scn |
inteiro positivo | — | Obrigatório. SCN alvo para FLASHBACK DATABASE TO SCN. Destrutivo: o banco de dados é revertido de forma irreversível. |
Exemplo de pluginrestoreconf:
action = flashback
target_scn = 2090000
require_explicit_confirmation = yes
dry_run = no
8. Exemplos de Configuração de FileSet
8.1 mode=rman_sbt — Mínimo (Ponto 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 — Configuração Completa de Produção com Validação e 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 — Não-SBT com 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 — Proteção Contínua de Archivelog
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"
}
}
Emparelhe este FileSet com um Job Bacula de longa duração (Type=Backup, Level=Full). O daemon CDP é executado até o término do Job Bacula. Use Schedule com um RunWindow muito longo ou um job dedicado sempre ativo.
8.6 mode=replicate — Archivelog-Apply 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 — Active Data Guard Duplicate (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 Seletivo 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 Legado (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. Exemplos de Job de Restauração
9.1 Restauração Completa do Banco de Dados — Backup Mais Recente
* 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 — Recuperação Pontual Passo a Passo
* 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 Restauração Baseada em SCN
Plugin Restore Options:
action: scn
target_scn: 2090264
shutdown_if_open: yes
preview_first: no
verify_after: yes
dry_run: no
Gera: SET UNTIL SCN 2090264; RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS;
9.4 Recuperação em Nível de Tabela (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
O plugin gera um bloco RMAN RECOVER TABLE SCOTT.EMP UNTIL TIME ... AUXILIARY DESTINATION '/u01/aux', restaura a tabela a partir do backup e a importa de volta para o banco de dados ativo via Data Pump — tudo sem acesso SSH do operador.
9.5 Clonar Banco de Dados para 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
O plugin gera um bloco RMAN DUPLICATE TARGET DATABASE TO ORCL_DEV com as cláusulas apropriadas DB_FILE_NAME_CONVERT e LOG_FILE_NAME_CONVERT, cria um novo init.ora no host de destino e inicia o banco de dados clone — a partir de uma única sessão de restauração no bconsole.
10. Guia de Instalação e Dimensionamento
10.1 Pré-requisitos
Host Oracle (também o Host Bacula FD)
| Componente | Versão Mínima | Observações |
|---|---|---|
| Bacula File Daemon | 15.0.3 | Pacote Community padrão |
| Oracle Database | 11g R2 (11.2.0.4) | Testado até 23ai FREE |
sqlplus |
Compatível com a versão do BD | Oracle Client completo obrigatório — Instant Client insuficiente |
rman |
Compatível com a versão do BD | Obrigatório para todos os modos exceto dump |
dbv (DBVERIFY) |
Compatível com a versão do BD | Obrigatório para validate_after=yes |
expdp / impdp |
Compatível com a versão do BD | Obrigatório para mode=dump com dump_format=expdp |
exp |
Compatível com a versão do BD | Obrigatório para mode=dump no Oracle 11g |
| Kernel Linux | 4.18+ | cgroups v2 requer 4.15+; mínimo EL8 é 4.18 |
| Disco — diretório de estado | ~100 MB | /opt/bacula/working/oracle-state/ por SID |
| Disco — staging | 1× tamanho do BD | Obrigatório apenas para mode=rman (não-SBT) e mode=dump |
Host Bacula Director
| Componente | Versão Mínima | Observações |
|---|---|---|
bacula-director |
15.0.3 | Nenhuma configuração específica de Oracle necessária |
| BD de Catálogo | PostgreSQL 14+ ou MySQL 8+ | Requisito padrão do Bacula |
10.2 Guia de Dimensionamento
| Ambiente | Tamanho do BD | Canais Recomendados | Disco (staging) | RAM (backend) | Observações |
|---|---|---|---|---|---|
| Pequeno (Dev/Teste) | < 100 GB | 2–4 | 50 GB | 256 MB | Instância única, mode=rman_sbt |
| Médio (Produção) | 100 GB – 1 TB | 4–8 | 500 GB | 512 MB | channels=auto, BCT habilitado |
| Grande (Empresarial) | 1 TB – 10 TB | 8–16 | 2 × tamanho do BD | 1 GB | RAC, CDB/PDB, CDP |
| Escala Corporativa | > 10 TB | 16–32 | SAN externo | 2 GB | SBT multicanal, ASM, DG |
Para mode=rman_sbt (recomendado), nenhum disco de staging é necessário — os dados fluem diretamente do RMAN via libobk-rs e PTCOMM para o Bacula Storage.
10.3 Instalação via RPM (EL8 / EL9 / Rocky / Alma / OL)
# Passo 1: Instalar o pacote
sudo dnf install ./podheitor-oracle-plugin-1.0.0-1.el9.x86_64.rpm
# Passo 2: Copiar e editar o arquivo de configuração
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
# Passo 3: Definir a configuração mínima (editar estes valores)
# 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
# Passo 4: Verificar instalação
/opt/bacula/bin/podheitor-oracle-backend --version
# Passo 5: Validação dry-run (Oracle deve estar em execução)
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
10.4 Instalação via DEB (Debian 12 / Ubuntu 24.04)
# Passo 1: Instalar o pacote
sudo apt install ./podheitor-oracle-plugin_1.0.0-2_amd64.deb
# Passo 2: Configurar (igual ao RPM passos 2–3 acima)
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
# Passo 3: Validação dry-run
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
10.5 Instalação via Tarball (Qualquer Linux 64-bit)
# Extrair
tar xzf podheitor-oracle-plugin-1.0.0-x86_64-linux-musl.tar.gz
cd podheitor-oracle-plugin-1.0.0
# Instalar (PREFIX padrão=/opt/bacula)
sudo make install
# Ou com prefixo personalizado
sudo make install PREFIX=/usr/local
# Verificar
/opt/bacula/bin/podheitor-oracle-backend --version
10.6 Validação Pós-Instalação
A flag --dry-run valida toda a configuração sem conectar ao 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
Se a saída contiver qualquer linha com ERROR:, resolva-a antes de executar jobs reais.
10.7 Configuração do Symlink libobk (somente mode=rman_sbt)
O RMAN deve ser capaz de carregar libobk-rs.so como sua biblioteca SBT. Crie o symlink uma vez por Oracle Home:
sudo ln -sf /opt/bacula/lib/libobk-rs.so
"$ORACLE_HOME/lib/libobk.so"
# Verificar se o RMAN consegue carregá-la
rman target / <<< "show all;" 2>&1 | grep -i sbt
Importante: Este symlink deve ser recriado após cada PSU (Patch Set Update) ou RU (Release Update) do Oracle que reinstale $ORACLE_HOME/lib/. O script %post do RPM e o script postinst do DEB emitem um aviso caso o symlink esteja ausente no momento da instalação.
10.8 Configuração do Director
FileSet (consulte a Seção 8 para exemplos 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 Restauração
Job {
Name = "RestoreOracle-FREE"
Type = Restore
Client = oracle-23ai-fd
FileSet = "Oracle-RMAN-SBT"
Storage = File
Pool = OracleDaily
Messages = Standard
Where = /
Priority = 10
}
Exemplo 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
}
Recarregar o Director
sudo bconsole <<< "reload"
11. Matriz de Compatibilidade
11.1 Versões Oracle × Recursos
| Versão Oracle | rman_sbt | rman | dump | cdp | replicate | Recuperação de Tabela | CDB/PDB | TDE |
|---|---|---|---|---|---|---|---|---|
| 11g R2 (11.2.0.4) | Sim | Sim | exp | Sim | Sim (log-apply) | Não | Não | Não |
| 12c R1 (12.1) | Sim | Sim | expdp | Sim | Sim | Sim | Sim | Sim |
| 12c R2 (12.2) | Sim | Sim | expdp | Sim | Sim | Sim | Sim | Sim |
| 18c | Sim | Sim | expdp | Sim | Sim | Sim | Sim | Sim |
| 19c (LTS) | Sim | Sim | expdp | Sim | Sim | Sim | Sim | Sim |
| 21c | Sim | Sim | expdp | Sim | Sim | Sim | Sim | Sim |
| 23ai FREE | Sim (live) | Sim (live) | Sim (live) | Sim (live) | Sim (parcial) | Sim | Sim | Sim |
Observações:
- 11g:
dump_formatforçado paraexp; sem CDB/PDB, sem TDE, semRECOVER TABLE - 23ai FREE:
replicate_method=duplicate_activerequer Oracle EE ou licença adicional;archivelog_applyfunciona na edição FREE - Live-validated = testado contra uma instância de banco de dados real em execução
11.2 Suporte a Distribuições Linux
| Distribuição | RPM | DEB | Tarball | Status | Observações |
|---|---|---|---|---|---|
| RHEL 9 / Rocky 9 / Alma 9 / OL 9 | Sim | — | Sim | Validado em produção | Job 4989 T OK no OL 9.6 |
| RHEL 8 / Rocky 8 / Alma 8 / OL 8 | Sim | — | Sim | Spec disponível; instalação em produção pendente | Mesmo spec do EL9 |
| Debian 12 (bookworm) | — | Sim | Sim | Configurado; make deb em produção pendente |
|
| Ubuntu 24.04 LTS (noble) | — | Sim | Sim | Configurado | |
| Ubuntu 22.04 LTS (jammy) | — | Sim | Sim | Testado em container | |
| SLES 15 SP5+ | — | — | Sim | Somente tarball static-pie | Sem empacotamento; linkado estaticamente |
11.3 Versões do Bacula
| Versão do Bacula | Status | Observações |
|---|---|---|
| 15.0.3 | Validado em produção | Target de build de referência (BACULA_SRC) |
| 15.0.x (anteriores) | Não testado | API de plugin estável; provavelmente compatível |
| 14.x | Não testado | ABI do plugin pode diferir; não suportado |
11.4 Arquiteturas
| Arquitetura | Status | Observações |
|---|---|---|
| x86_64 (linux-musl static-pie) | Validado em produção | Build de produção; CI no phweb-ci |
| x86_64 (linux-gnu) | Build de desenvolvimento | Build de desenvolvimento |
| aarch64 (linux-musl static-pie) | Configurado | Disponível via tarballaarch64-linux-gnu-gcc |
11.5 Edições Oracle × Recursos
| Recurso | Oracle XE | Oracle SE2 | Oracle EE |
|---|---|---|---|
mode=rman_sbt |
Sim | Sim | Sim |
mode=rman |
Sim | Sim | Sim |
mode=dump |
Sim | Sim | Sim |
mode=cdp |
Sim | Sim | Sim |
mode=replicate (archivelog_apply) |
Sim | Sim | Sim |
mode=replicate (duplicate_active) |
Não* | Não* | Sim |
| BCT (Block Change Tracking) | Não | Sim | Sim |
| RAC | Não | Não | Sim |
| TDE Wallet | Não | Não | Sim |
| Recuperação em nível de tabela | Limitado | Sim (12c+) | Sim (12c+) |
| Snapshot AWR | Não | Não | Sim |
*duplicate_active tecnicamente executa no SE2 como recurso RMAN, mas o Active Data Guard (standby gerenciado) requer Oracle EE. Para DR em SE2, utilize archivelog_apply.
12. Relatório de Desempenho
Todos os resultados são de execuções de validação ao vivo no ambiente de laboratório de produção: 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/build.
12.1 Desempenho de Backup
| Job | Modo | Banco de Dados | Tamanho | Duração | Throughput | Status | Observações |
|---|---|---|---|---|---|---|---|
| 4860 | rman_sbt | Oracle 23ai FREE (SID=FREE) | 477 MB | 14m 39s | ~543 KB/s | T OK | Primeira validação RMAN SBT ao vivo; baseline de canal único |
| 4956 | restauração | Oracle 23ai FREE | 477 MB | 19 s | ~25 MB/s | T OK | 6 peças restauradas do armazenamento Bacula |
| 4989 | rman_sbt | Oracle 23ai FREE (SID=FREE) | ~499 MB | 26m 10s | ~319 KB/s | T OK | Backup completo do pacote instalado via RPM (F14.b); files=1, 0 erros |
| F2.b | dump (expdp) | Schema PHTEST | 416 KB | 1m 27s | ~4,8 KB/s | OK | Exportação lógica Data Pump, somente schema PHTEST |
| F3.b | rman (não-SBT) | Oracle 23ai FREE | 451 MB | 43 s | ~10,5 MB/s | OK | 2 canais RMAN, 9 peças, staging local |
| F6.b | preview | Oracle 23ai FREE | — | 4 s | — | OK | RESTORE PREVIEW SUMMARY; intervalo SCN 2090220–2090264 |
| F10.b | validação | Oracle 23ai FREE | — | 16,8 s | — | OK | RMAN VALIDATE DATABASE CHECK LOGICAL; 0 blocos corrompidos |
| F10.b | dbverify | Oracle 23ai FREE | — | 2,45 s | — | OK | 131.072 páginas verificadas; 0 falhas |
12.2 Análise de Throughput
Os números de throughput acima refletem um ambiente de laboratório de VM única com armazenamento compartilhado (sem SAN dedicada) e um único canal RMAN. Implantações em produção com:
- Múltiplos canais RMAN (4–16, ajuste automático)
- Rede de armazenamento de backup dedicada
- BCT (Block Change Tracking) para jobs incrementais
tipicamente atingem throughput agregado de 50–200 MB/s, dependendo da camada de armazenamento.
Throughput da restauração do Job 4956 (25 MB/s para 477 MB em 19 segundos) demonstra a eficiência do caminho de stream mode=rman_sbt — o Bacula recupera as 6 peças de backup do armazenamento e o backend as alimenta diretamente no canal de restauração do RMAN, ignorando qualquer diretório de staging.
Comparação Job 4989 vs Job 4860: A duração maior no Job 4989 (26m10s vs 14m39s do original) reflete um estado de banco de dados ligeiramente maior (mais archivelogs acumulados) no momento do teste de instalação via RPM, e não uma regressão de desempenho.
12.3 Desempenho de Validação
| Operação | Duração | Resultado | Cobertura |
|---|---|---|---|
| RMAN VALIDATE DATABASE CHECK LOGICAL | 16,8 s | 0 blocos corrompidos | Todos os datafiles + archivelogs |
| DBVERIFY (dbv) pós-restauração | 2,45 s | 0 falhas | 131.072 páginas em todos os datafiles |
| RESTORE DATABASE PREVIEW SUMMARY | 4 s | Plano gerado | 6 peças necessárias, intervalo SCN confirmado |
12.4 Cobertura do Conjunto de Testes
| Conjunto | Qtd. | Escopo |
|---|---|---|
| Testes unitários backend | 523 | Geradores de script, parsers, chain/verify/canary/ASM/topology/wallet, métricas, cgroups |
| Testes unitários libobk-rs | 18 | Codec de pacotes SBT v2 |
| Integração Live-DB (VM 131) | F2.b a F18 | Fim a fim completo no Oracle 23ai FREE |
13. Segurança e Conformidade
13.1 Redação de Credenciais
O subsistema de log de auditoria do plugin aplica regras de redação a cada evento de log antes de emiti-lo para o log do job Bacula ou para o arquivo de rastreamento:
- Padrões correspondentes a
IDENTIFIED BY <password>são substituídos porIDENTIFIED BY [REDACTED]. - Strings de conexão Oracle
user/password@hostsão substituídas poruser/[REDACTED]@host. - O conteúdo do arquivo de senha do Wallet nunca é registrado — apenas o caminho do arquivo é registrado.
- Strings
SBT_PARMScontendoSBT_ORACLE_HOME_USERou credenciais semelhantes são mascaradas.
O resultado é que nenhuma senha Oracle, frase secreta TDE ou credencial de autenticação jamais aparece no log do job Bacula, log de auditoria ou arquivo de rastreamento, independentemente do nível de verbose ou debug.
13.2 Canário Anti-Ransomware
Quando canary=on é definido no FileSet, o plugin amostra um número configurável de blocos de dados Oracle aleatórios de cada datafile no início de cada job de backup e calcula um hash BLAKE3 progressivo. Entre os jobs, ele compara a amostra de hash atual com a amostra do job anterior:
- Se a fração de blocos alterados exceder
canary_threshold_pct(padrão 25%), o plugin emite uma mensagemPODHEITOR-ORACLE-CANARY-ALERTpara o log do job Bacula. - O backup continua — o alerta é um aviso, não uma falha — mas o operador é notificado de uma possível criptografia em massa por ransomware.
- O estado de hash por job é gravado em
/opt/bacula/working/oracle-state/<SID>/wallet_hash.
O canário não garante a detecção de ransomware, mas fornece uma camada de alerta precoce sem o Oracle Audit Vault ou ferramentas licenciadas adicionais.
13.3 Reconhecimento de Wallet TDE
Quando wallet_backup=yes (padrão), o plugin:
- Lê o caminho do wallet a partir do
sqlnet.ora(wallet_path=auto) ou do caminho configurado. - Transmite o diretório do wallet para o Bacula como parte do job de backup.
- Detecta a rotação da chave mestra entre jobs comparando o hash atual de
v$encryption_keyscom owallet_hashpersistido no diretório de estado. Se uma rotação for detectada, o plugin promove automaticamente o próximo job para o nível Full (independentemente da diretiva de nível do Bacula) para garantir um backup consistente com o novo material de chave.
13.4 Integridade da Cadeia de Suprimentos
| Verificação | Ferramenta | Resultado (v1.0.0) |
|---|---|---|
| Auditoria de CVE | cargo-audit |
0 CVEs conhecidos |
| Conformidade de licença | cargo-deny (deny.toml) |
Todas as verificações aprovadas: licence, ban, advisory, source |
| Build reproduzível | build estático e reproduzível | Determinístico; hash do binário reproduzível entre execuções de CI |
| SBOM | CycloneDX v1.4 | Disponível sob contrato |
Execute verificações de segurança localmente:
13.5 Superfície de Ataque de Rede
O processo do plugin abre exatamente um socket de rede opcional: o endpoint HTTP /metrics do Prometheus em metrics_addr. Se metrics_addr=0 (padrão), nenhuma porta de rede é aberta. O socket UNIX em /var/run/podheitor-oracle/<SID>.sock é local apenas, criado com permissões 0600 e de propriedade do usuário OS oracle.
O canal PTCOMM entre o shim do Bacula FD e o backend Rust usa um mecanismo fork()+pipe() — sem socket de rede, sem memória compartilhada IPC, sem named pipe acessível de fora do grupo de processos.
13.6 libobk-rs clean-room
libobk-rs.so é uma reimplementação clean-room da API Oracle SBT v2 (sbt2.h). A API SBT está documentada no Oracle MOS (My Oracle Support) Nota 67422.1 e na Referência de Backup & Recovery do RMAN. A implementação foi escrita sem acesso ao código-fonte ou binário proprietário da Oracle libobk.so, usando apenas a especificação de API publicada.
O status clean-room significa:
- Nenhum código proprietário Oracle no binário distribuído.
- Nenhuma licença Oracle necessária para distribuir
libobk-rs.so. - Single-licensed sob PodHeitor-Proprietary (Copyright © Heitor Faria).
14. Suporte e Termos Comerciais
14.1 Migrando de um Produto Concorrente?
Traga sua proposta de renovação ou contrato ativo do Bacula Enterprise, Veeam, Commvault ou NetBackup. Garantimos um desconto mínimo de 50% no suporte comercial — com mais recursos, pacote menor e sem taxas de licença por socket ou por host.
O plugin PodHeitor substitui:
- Bacula Enterprise 18.2.3 Oracle Module
- Veeam Agent for Oracle (com Veeam Backup & Replication)
- Commvault IntelliSnap Oracle iDataAgent
- NetBackup for Oracle (DB Agent)
…a uma fração do custo, com automação de restauração superior, CDP nativo e replicação de DR integrada para Standard Edition 2.
14.2 Níveis de Suporte
| Nível | SLA | Inclui | Contato |
|---|---|---|---|
| Comunidade | Melhor esforço | documentação | heitor@opentechs.lat |
| Standard | Próximo dia útil | Suporte por e-mail, prioridade em patches, revisão de configuração | heitor@opentechs.lat |
| Premium | Resposta em 4 horas | Canal Slack dedicado, sessões ao vivo, ajuste personalizado de FileSet, assistência em upgrades | heitor@opentechs.lat |
| Enterprise | Resposta em 1 hora + plantão | Plantão 24/7, opções presenciais, desenvolvimento de funcionalidades personalizadas | +1 786 726-1749 |
14.3 Treinamento e Serviços Profissionais
Treinamento e serviços profissionais estão disponíveis para equipes migrando de ferramentas proprietárias de backup Oracle ou construindo nova infraestrutura Bacula/Oracle:
- Workshop: Backup Oracle com Bacula (1 dia) — design de FileSet, ajuste de RMAN, automação de restauração.
- Workshop: Replicação de DR para Oracle SE2 (meio dia) —
mode=replicate, configuração de archivelog-apply, teste de failover. - Consultoria: Migração do Bacula Enterprise — tradução de configuração, migração de RunScript, revisão de ENTERPRISE_PARITY.
- Consultoria: Implantação de CDP — configuração de CDP em produção, monitoramento de RPO, dashboards Prometheus.
14.4 Contato
| Canal | Detalhes |
|---|---|
| heitor@opentechs.lat | |
| WhatsApp / Telefone (internacional) | +1 786 726-1749 |
| WhatsApp / Telefone (Brasil) | +55 61 98268-4220 |
| Autor | Heitor Faria |
Apêndice A — Architecture Decision Records (ADR)
Um conjunto completo de 14 ADRs rege as decisões técnicas neste plugin. Cada ADR está armazenado em docs/adr/. As principais decisões estão resumidas abaixo.
ADR-001 — Rust para o Binário do Backend A lógica central de backup/restauração é implementada em Rust com target x86_64-unknown-linux-musl (static-pie). Essa escolha oferece segurança de memória sem pausas de coleta de lixo, comportamento de desligamento determinístico (crítico para a limpeza de canais RMAN) e uma implantação em arquivo único sem dependências de biblioteca em tempo de execução. O target musl static-pie garante que o binário funcione em qualquer kernel Linux 2.6.32+ independentemente da versão da glibc.
ADR-002 — libobk-rs SBT v2 Clean-Room A interface RMAN SBT da Oracle requer uma biblioteca compartilhada (libobk.so) em conformidade com a API SBT v2 (sbt2.h). Em vez de depender da libobk.so proprietária do Bacula Enterprise (que requer uma assinatura ativa do Bacula Enterprise), o plugin distribui libobk-rs.so: uma implementação Rust clean-room da mesma especificação de API pública. Isso torna o plugin totalmente autocontido sob Proprietário; reimplementação clean-room da API SBT Oracle ou Bacula.
ADR-003 — Manifesto de Backup como Arquivo e RestoreObject Cada job de backup grava um _manifest.json no diretório de estado E o incorpora como um RestoreObject Bacula no catálogo. O manifesto possui hash BLAKE3, carimbado com SCN e inclui DBID, incarnação e metadados de chain. Essa gravação dupla garante que os metadados de restauração estejam disponíveis mesmo que o diretório de estado seja perdido, e que o Bacularis possa exibir detalhes de backup em sua interface web.
ADR-004 — Protocolo Binário PTCOMM via fork+pipe A API do plugin do Bacula FD requer uma biblioteca compartilhada com ABI C. O carregador de plugins FD exporta a ABI C esperada pelo Bacula e se comunica com o backend via protocolo PTCOMM. O limite fork+pipe mantém o backend livre para usar concorrência nativa do Rust e semântica de panic, enquanto entrega a mesma experiência de processo único ao Bacula. (A v1.0.0 usava um shim C++ fino para a mesma função; o shim foi removido na v1.1.0 para produzir um artefato com licença única e copyright limpo)
ADR-005 — Socket UNIX para Comunicação SBT ↔ Backend libobk-rs.so é carregado pelo RMAN em processo, enquanto o backend é um processo separado. Para transferir dados de backup dos canais RMAN para o stream PTCOMM do Bacula, libobk-rs se conecta a um socket de domínio UNIX (/var/run/podheitor-oracle/<SID>.sock) gerenciado pelo backend. Isso evita a complexidade de memória compartilhada e fornece isolamento natural por SID.
ADR-006 — Diretório de Estado por SID Todo o estado persistente (cursor SCN, cursor de archivelog, hash de canário, hash de wallet, manifestos de checkpoint) é gravado em /opt/bacula/working/oracle-state/<SID>/. O uso de um diretório por SID permite que múltiplas instâncias coexistam no mesmo host, sobrevive à reinstalação do pacote (o RPM %postun preserva o diretório) e é apagado apenas em DEB --purge explícito ou remoção manual.
ADR-007 — Data Pump como Padrão no 12c+ No Oracle 12c e posterior, o mode=dump usa por padrão expdp (Data Pump) em vez do legado exp. O Data Pump é paralelo, reiniciável e produz dumps significativamente menores para schemas grandes. No 11g, o plugin retorna automaticamente para exp porque o formato de saída do expdp mudou no 12c de formas que complicam a importação entre versões.
ADR-008 — Ajuste Automático de Contagem de Canais Quando channels=auto (o padrão), o backend consulta a contagem de núcleos de CPU disponíveis do host e ajusta a contagem de canais RMAN de acordo, limitada ao valor em v$parameter para db_files. Isso elimina a necessidade de ajuste manual por host e fornece paralelismo quase ótimo sem configuração adicional.
ADR-009 — Sem Callback bconsole da libobk-rs A libobk.so do Bacula Enterprise requer um callback bconsole do RMAN para o Bacula para entregar dados de backup (a chamada arquitetura “SBT callback”). Isso cria uma dependência do Director estar acessível a partir do host Oracle durante o backup, o que falha em ambientes NAT e VPN. A libobk-rs do PodHeitor se conecta ao processo de backend diretamente via socket UNIX — sem callback do Director, sem dependência de bconsole.
ADR-010 — Métricas Prometheus via TCP stdlib O endpoint /metrics do Prometheus é servido por um servidor HTTP mínimo implementado nativamente. Isso mantém o binário pequeno, elimina uma superfície de ataque significativa e mantém a propriedade de zero dependência de runtime externo.
ADR-011 — Automação de Restauração via RestoreObject pluginrestoreconf A configuração de restauração é entregue como um documento INI pluginrestoreconf incorporado no mecanismo RestoreObject do Bacula — não como parâmetros de linha de comando para um script externo. Isso significa que todas as ações de restauração (PITR, SCN, tabela, clone, flashback) são iniciadas a partir do bconsole ou Bacularis, são registradas no JobLog do catálogo Bacula e não requerem acesso SSH ao host Oracle. Este é o diferencial mais significativo em relação à abordagem do bs_oracle_restore.pl do Bacula Enterprise.
ADR-012 — Throttle de I/O via cgroups v2 Em vez de depender do parâmetro RATE do RMAN (que é por canal e aproximado), o plugin grava o throttle io.max do cgroups v2 para o nó folha do cgroup do backend. Isso impõe um limite de taxa de escrita em nível de kernel em todo o I/O emitido pelo processo de backup, independente da contagem de canais RMAN. O recurso é não fatal: se o host não usar uma hierarquia unificada cgroups v2 ou se CAP_SYS_ADMIN estiver ausente, o plugin registra um aviso e continua.
ADR-013 — Canário Anti-Ransomware via Amostragem DBVERIFY O canário usa dbv (Oracle DBVERIFY) para amostrar blocos aleatórios dos datafiles e calcula hashes BLAKE3. Isso reutiliza uma ferramenta Oracle existente disponível em toda instalação Oracle, evita exigir acesso direto a dispositivos raw e produz assinaturas de conteúdo em nível de bloco sem ler o datafile inteiro. O canário dispara quando a fração de blocos alterados excede o threshold configurável entre jobs de backup consecutivos.
ADR-014 — Retomada de Checkpoint por Chain de SCN Quando um job Bacula é interrompido (crash do FD, reinicialização do Director, timeout de rede), o plugin grava um checkpoint/<jobid>.json no diretório de estado contendo o último intervalo SCN transferido com sucesso. Na próxima execução do job (que o Bacula tentará novamente no mesmo Nível), o backend detecta o checkpoint e retoma a partir do último SCN bem-sucedido em vez de reiniciar do zero. Isso transforma falhas de incrementais em bancos de dados grandes de uma re-execução de várias horas em uma retomada de segundos.
Apêndice B — Glossário
| Termo | Definição |
|---|---|
| ADR | Architecture Decision Record — um documento que registra uma decisão arquitetural significativa, seu contexto e a justificativa para a escolha feita. |
| PodHeitor-Proprietary | GNU Affero General Public License versão 3. A licença de código aberto sob a qual o PodHeitor é distribuído. |
| archivelog | Arquivo de redo log Oracle que foi arquivado (copiado do redo log online para um destino). Necessário para recuperação pontual. |
| ASM | Oracle Automatic Storage Management — um gerenciador de volumes e sistema de arquivos para arquivos de banco de dados Oracle, integrado ao Oracle Clusterware. |
| BCT | Block Change Tracking — um recurso Oracle que registra quais blocos do banco de dados foram alterados desde o último backup, acelerando drasticamente os backups incrementais ao eliminar a necessidade de varrer blocos inalterados. |
| Bacularis | Uma interface web moderna para o PodHeitor Backup que fornece gerenciamento de jobs via navegador, formulários de restauração e relatórios. Renderiza nativamente formulários pluginrestoreconf. |
| BLAKE3 | Uma função de hash criptográfico usada pelo PodHeitor para computação de hash de canário em nível de bloco. Mais rápida que SHA-256 mantendo resistência a colisões. |
| CDB | Container Database — um contêiner de banco de dados Oracle multitenant que contém um ou mais Pluggable Databases (PDBs). Introduzido no Oracle 12c. |
| CDP | Continuous Data Protection — um paradigma de backup que captura continuamente alterações (neste plugin, archivelogs) em vez de fazer snapshots periódicos. Entrega RPO medido em minutos. |
| controlfile | Um arquivo binário Oracle que registra a estrutura física do banco de dados (datafiles, redo logs, metadados de backup). Necessário para montar o banco de dados. |
| CycloneDX | Um padrão aberto para Software Bill of Materials (SBOM) — um inventário legível por máquina de todos os componentes de software e suas licenças. |
| Data Guard (DG) | Oracle Data Guard — a solução de HA/DR nativa da Oracle que mantém bancos de dados standby em sincronia com o primário via envio de redo log. Requer Oracle Enterprise Edition para recursos de standby gerenciado. |
| dbv / DBVERIFY | Utilitário de verificação em nível de bloco da Oracle (dbv). Lê blocos de dados Oracle e verifica seus checksums e consistência interna sem precisar de uma conexão aberta com o banco de dados. |
| expdp / impdp | Utilitários Oracle Data Pump Export e Import (expdp/impdp). O substituto moderno para exp/imp, com suporte a exportação paralela, compressão e exportação incremental. |
| FD | File Daemon — o componente Bacula instalado no host cliente que executa jobs de backup e restauração sob direção do Director. |
| FRA | Fast Recovery Area — um local de disco gerenciado pela Oracle para arquivos relacionados à recuperação, incluindo archivelogs, autobackups de controlfile e backup sets do RMAN. |
| GoldenGate | Oracle GoldenGate — uma ferramenta de replicação e integração de dados em tempo real. O goldengate_aware=yes do PodHeitor detecta processos GoldenGate ativos e registra seu checkpoint SCN antes do backup. |
| libobk / libobk-rs | A biblioteca compartilhada que implementa a API SBT (System Backup to Tape) v2 da Oracle. O Oracle RMAN carrega libobk.so (tipicamente localizado em $ORACLE_HOME/lib/) para transmitir dados de backup para uma camada de gerenciamento de mídia. libobk-rs é a implementação Rust clean-room desta API pelo PodHeitor. |
| PITR | Point-In-Time Recovery — uma operação de restauração que retorna o banco de dados a um timestamp específico, descartando todas as alterações posteriores a esse ponto. Requer archivelogs do último backup Full até o momento alvo. |
| PDB | Pluggable Database — um banco de dados Oracle autocontido que reside dentro de um CDB. Cada PDB tem seus próprios schemas, tablespaces e pode ser gerenciado independentemente. |
| PTCOMM | Protocolo de enquadramento binário interno do PodHeitor usado para comunicação entre o shim C++ do FD e o processo do backend Rust via fork()+pipe(). Transporta nomes de arquivos, metadados de arquivos, blocos de dados e mensagens de controle. |
| RAC | Real Application Clusters — a solução de clustering de banco de dados multi-nó com disco compartilhado da Oracle. Requer Oracle Enterprise Edition e Oracle Grid Infrastructure. |
| RMAN | Recovery Manager — a ferramenta nativa de backup e recuperação da Oracle. O RMAN entende a estrutura interna de blocos Oracle, gerencia backup sets e image copies e é a única ferramenta capaz de produzir backups consistentes em nível de bloco de um banco de dados Oracle em execução sem quiescing da aplicação. |
| RPO | Recovery Point Objective — a quantidade máxima aceitável de perda de dados, medida como um intervalo de tempo. O modo CDP visa um RPO de minutos. |
| RTO | Recovery Time Objective — o tempo máximo aceitável para restaurar o serviço após uma interrupção. |
| SBOM | Software Bill of Materials — um inventário formal e legível por máquina de todos os componentes de software, versões e licenças que compõem um produto de software. |
| SCN | System Change Number — um timestamp interno Oracle monotonicamente crescente que identifica unicamente um estado consistente do banco de dados. Cada transação confirmada incrementa o SCN. Os SCNs são usados para definir pontos precisos de backup e recuperação. |
| SBT | System Backup to Tape — a camada de abstração da Oracle para integração de gerenciamento de mídia com o RMAN. Apesar do nome, o SBT v2 funciona com qualquer destino de backup, incluindo disco e armazenamento em nuvem. |
| SE2 | Oracle Standard Edition 2 — a edição intermediária do Oracle Database. Não possui Active Data Guard, RAC, particionamento avançado e vários outros recursos exclusivos da EE. O modo de replicação archivelog_apply do PodHeitor é explicitamente projetado para ambientes SE2. |
| SPFILE | Server Parameter File — um arquivo de parâmetros Oracle binário armazenado na área do banco de dados (ou ASM). Deve ser incluído em backup em cada job RMAN. |
| TDE | Transparent Data Encryption — um recurso Oracle que criptografa datafiles, tablespaces ou colunas em repouso sem alterações na aplicação. Requer um Oracle Wallet para armazenar a chave de criptografia mestra. |
| static-pie | Executável Position-Independent compilado com uma biblioteca C estática (musl). Funciona em qualquer versão de kernel ≥ 2.6.32 sem dependências de biblioteca compartilhada. O binário do backend do PodHeitor é static-pie musl para máxima portabilidade. |
| RestoreObject | Um mecanismo do catálogo Bacula para armazenar dados arbitrários (texto ou binário) associados a um job de backup. Usado pelo PodHeitor para armazenar o documento INI pluginrestoreconf e o manifesto de backup. Renderizado como prompts interativos no bconsole e como formulário HTML no Bacularis. |
| pluginrestoreconf | O tipo específico de RestoreObject usado pelo PodHeitor para entregar a configuração de restauração (ação, horário alvo, SCN, nome da tabela etc.) do operador para o plugin no momento da restauração. |
| socket UNIX | Um endpoint de comunicação entre processos (AF_UNIX) que existe apenas no kernel — sem interface de rede, sem número de porta. O PodHeitor usa /var/run/podheitor-oracle/<SID>.sock para conectar libobk-rs (carregado pelo RMAN) ao processo do backend. |
Apêndice C — Referência de Métricas Prometheus
Quando metrics_addr estiver definido (ex.: metrics_addr=0.0.0.0:9119), o backend expõe um endpoint /metrics compatível com Prometheus. As métricas são emitidas no formato de texto padrão do Prometheus e podem ser coletadas por qualquer sistema compatível (servidor Prometheus, Grafana Agent, OpenTelemetry Collector).
C.1 Métricas de Contador
| Nome da Métrica | Labels | Descrição |
|---|---|---|
podheitor_oracle_backup_jobs_total |
sid, mode |
Total de jobs de backup iniciados. |
podheitor_oracle_backup_failed_total |
sid, mode |
Total de jobs de backup encerrados com erro. |
podheitor_oracle_restore_jobs_total |
sid, action |
Total de jobs de restauração iniciados. |
podheitor_oracle_restore_failed_total |
sid, action |
Total de jobs de restauração encerrados com erro. |
podheitor_oracle_bytes_backed_up_total |
sid, mode |
Total de bytes transferidos para o Bacula Storage em todos os jobs de backup. |
podheitor_oracle_bytes_restored_total |
sid |
Total de bytes recebidos do Bacula Storage em todos os jobs de restauração. |
podheitor_oracle_archivelogs_shipped_total |
sid |
Total de arquivos archivelog enviados ao Bacula Storage (modos CDP e archivelog-include). |
podheitor_oracle_verify_blocks_checked_total |
sid |
Total de blocos de dados Oracle verificados pelo DBVERIFY em todos os jobs. |
podheitor_oracle_verify_blocks_bad_total |
sid |
Total de blocos corrompidos detectados pelo DBVERIFY. Deve ser sempre 0. |
podheitor_oracle_canary_alerts_total |
sid |
Número de vezes que o canário anti-ransomware disparou um alerta de alteração em massa. |
podheitor_oracle_tde_rotation_detected_total |
sid |
Número de rotações de chave mestra TDE detectadas (dispara promoção automática para Full). |
C.2 Métricas de Gauge
| Nome da Métrica | Labels | Descrição |
|---|---|---|
podheitor_oracle_rman_channels_active |
sid |
Número de canais de backup RMAN ativos no momento. |
podheitor_oracle_cdp_lag_seconds |
sid |
Segundos desde o último archivelog enviado no modo CDP. Threshold de alerta: cdp_max_lag. |
podheitor_oracle_last_backup_size_bytes |
sid, mode |
Tamanho em bytes do job de backup concluído mais recentemente. |
podheitor_oracle_last_backup_duration_seconds |
sid, mode |
Duração em segundos do job de backup concluído mais recentemente. |
podheitor_oracle_last_scn |
sid |
SCN mais alto observado no backup concluído mais recentemente. |
C.3 Exemplo de Configuração de Scrape do 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 Exemplo de Regra de Alerta Grafana (Lag CDP)
groups:
- name: podheitor_oracle_cdp
rules:
- alert: OracleCdpLagExceeded
expr: podheitor_oracle_cdp_lag_seconds > 300
for: 2m
labels:
severity: warning
annotations:
summary: "Lag CDP Oracle excedeu 5 minutos em {{ $labels.sid }}"
description: "Lag de envio de archivelog CDP é {{ $value }}s para SID {{ $labels.sid }}"
- alert: OracleCanaryAlert
expr: increase(podheitor_oracle_canary_alerts_total[5m]) > 0
labels:
severity: critical
annotations:
summary: "Canário anti-ransomware disparado em {{ $labels.sid }}"
description: "Alteração em massa de hash de blocos detectada. Possível atividade de ransomware."
- alert: OracleBackupFailed
expr: increase(podheitor_oracle_backup_failed_total[1h]) > 0
labels:
severity: warning
annotations:
summary: "Job de backup Oracle falhou para SID {{ $labels.sid }}"
Apêndice D — Referência do Diretório de Estado
O plugin mantém um diretório de estado por SID em /opt/bacula/working/oracle-state/<SID>/. Todos os arquivos são gravados atomicamente (write-to-temp + rename). O diretório é preservado na desinstalação do pacote e apagado apenas em DEB --purge ou remoção manual.
D.1 Estrutura do Diretório de Estado
/opt/bacula/working/oracle-state/<SID>/
├── last_scn.json # Último intervalo SCN copiado com sucesso
├── backup_manifest.json # Manifesto do job mais recente (hash BLAKE3)
├── last_archivelog_seq # Cursor CDP: última sequência de archivelog enviada
├── wallet_hash # SHA-256 do material de chave mestra TDE (detecta rotação)
├── checkpoint/
│ └── <jobid>.json # Checkpoint por job para retomada (ADR-014)
└── restore/
└── <jobid>_report.json # Relatório de validação pós-restauração
D.2 Referência de Conteúdo dos Arquivos
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 — Guia de Solução de Problemas
E.1 Erros Comuns e Soluções
Binário do plugin não encontrado
bEventBackupCommand: plugin podheitor-oracle not found
Causa: O arquivo podheitor-oracle-fd.so não está no diretório de plugins do Bacula ou a configuração do FD não inclui o diretório de plugins.
Solução:
ls -la /opt/bacula/lib/bacula/podheitor-oracle-fd.so
# Se ausente, reinstale o pacote ou verifique PREFIX na instalação via tarball.
# Verificar diretório de plugins do FD:
grep -i plugindirectory /opt/bacula/etc/bacula-fd.conf
# Deve conter: Plugin Directory = /opt/bacula/lib/bacula
sudo systemctl restart bacula-fd
libobk-rs.so não encontrado pelo 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: O symlink $ORACLE_HOME/lib/libobk.so → /opt/bacula/lib/libobk-rs.so está ausente ou quebrado.
Solução:
# Verificar symlink
ls -la $ORACLE_HOME/lib/libobk.so
# Recriar
sudo ln -sf /opt/bacula/lib/libobk-rs.so $ORACLE_HOME/lib/libobk.so
# Verificar se o RMAN consegue carregá-lo (sem RMAN-03009 na execução do backup)
Permissão negada no socket UNIX
PODHEITOR-ORACLE: cannot connect to UNIX socket
/var/run/podheitor-oracle/FREE.sock: Permission denied
Causa: O processo libobk-rs.so (executando como o usuário OS do RMAN) não tem permissão de escrita em /var/run/podheitor-oracle/.
Solução:
# Criar diretório com propriedade correta
sudo mkdir -p /var/run/podheitor-oracle
sudo chown oracle:oinstall /var/run/podheitor-oracle
sudo chmod 750 /var/run/podheitor-oracle
Falha de autenticação Oracle
PODHEITOR-ORACLE-AUDIT kind=connect_failed sid=ORCL
error: ORA-01031: insufficient privileges
Causa: O oracle_user ou unix_user não tem privilégio SYSDBA, ou a associação ao grupo de autenticação OS (dba) está ausente.
Solução:
# Verificar se o usuário OS está no grupo dba
id oracle
# Deve conter: groups=...,dba,...
# Verificar se a autenticação OS funciona
sudo -u oracle sqlplus / as sysdba <<< "SELECT INSTANCE_NAME FROM V$INSTANCE;"
Diretório de estado cheio
PODHEITOR-ORACLE: cannot write checkpoint: No space left on device
path: /opt/bacula/working/oracle-state/ORCL/checkpoint/4990.json
Causa: O sistema de arquivos que hospeda /opt/bacula/working/ está cheio.
Solução:
df -h /opt/bacula/working/
# Limpar arquivos de checkpoint antigos:
find /opt/bacula/working/oracle-state/ -name "*.json" -mtime +30 -delete
# Ou expandir o sistema de arquivos.
Wallet TDE fechado no momento do backup
PODHEITOR-ORACLE-AUDIT kind=wallet_check_failed sid=ORCL
error: ORA-28365: wallet is not open
Causa: O Oracle Wallet não está aberto. Isso pode ocorrer após uma reinicialização do banco de dados se a abertura automática do WALLET_ROOT não estiver configurada.
Solução:
-- Abrir o wallet antes do backup:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "wallet_password";
-- Ou configurar abertura automática:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED EXTERNALLY AS 'wallet_password'
FORCE KEYSTORE;
Alternativamente, defina wallet_passphrase_file= na configuração do plugin para automatizar a abertura do wallet no início do backup.
Job de backup travado — canais RMAN não conectam
PODHEITOR-ORACLE: waiting for RMAN channel connections (timeout in 120s)
connected: 0/4 channels
Causa: O RMAN não consegue carregar libobk-rs.so ou não consegue se conectar ao socket UNIX. Frequentemente causado por um arquivo de socket obsoleto de um job que travou anteriormente.
Solução:
# Remover socket obsoleto
sudo rm -f /var/run/podheitor-oracle/FREE.sock
# Reiniciar o FD para limpar processos de backend órfãos
sudo systemctl restart bacula-fd
E.2 Comandos de Diagnóstico
# Verificar versão do plugin
/opt/bacula/bin/podheitor-oracle-backend --version
# Dry-run offline (sem conexão Oracle necessária)
/opt/bacula/bin/podheitor-oracle-backend --dry-run
/opt/bacula/etc/podheitor-oracle.conf
# Verificar log do Bacula FD para eventos do plugin
journalctl -u bacula-fd -n 100 | grep -i podheitor
# Listar todos os eventos PODHEITOR-ORACLE-AUDIT para um job específico
bconsole <<< "messages" | grep -i "PODHEITOR-ORACLE-AUDIT"
# Verificar catálogo de backup RMAN para o último backup
rman target / <<EOF
LIST BACKUP SUMMARY;
EOF
# Verificar integridade do backup manualmente
rman target / <<EOF
VALIDATE BACKUPSET ALL;
EOF
# Executar DBVERIFY em todos os datafiles
dbv file=$(sqlplus -S / as sysdba <<< "SET PAGESIZE 0 FEEDBACK OFF;
SELECT name FROM v$datafile;" | tr 'n' ' ')
Apêndice F — Guia de Upgrade e Migração
F.1 Fazendo Upgrade do Plugin Oracle do Bacula Enterprise
O PodHeitor foi projetado para ser um substituto direto do Bacula Enterprise Oracle Module sem necessidade de migração de dados. Os jobs, pools, volumes e entradas de catálogo existentes do Bacula permanecem válidos.
Checklist pré-migração:
| Tarefa | Observações |
|---|---|
Documentar as linhas atuais Plugin = do FileSet |
A nomenclatura dos parâmetros é amplamente compatível; consulte a tabela de tradução abaixo |
Anotar scripts de hook RunBeforeJob / RunAfterJob |
Traduzir para a convenção hooks_dir |
Documentar opções de linha de comando do bs_oracle_restore.pl |
Traduzir para chaves de pluginrestoreconf |
| Verificar versão do Bacula FD ≥ 15.0.3 | O PodHeitor requer 15.0.3 para suporte a RestoreObject |
| Fazer backup do catálogo Bacula | Precaução padrão antes de qualquer alteração de plugin |
Tabela de tradução de parâmetros (Enterprise → PodHeitor):
| Parâmetro Bacula Enterprise | Equivalente PodHeitor | Observações |
|---|---|---|
Oracle_SID=ORCL |
sid=ORCL |
Tradução direta |
Oracle_Home=/u01/app/… |
oracle_home=/u01/app/… |
Tradução direta |
Oracle_User=oracle |
unix_user=oracle |
Usuário OS, não usuário de banco de dados |
Backup_Mode=RMAN_SBT |
mode=rman_sbt |
Tradução direta |
Backup_Mode=RMAN |
mode=rman |
Tradução direta |
Backup_Mode=DATA_PUMP |
mode=dump |
|
Num_Channels=4 |
channels=4 |
Ou channels=auto |
Compress_Algorithm=MED |
compress=rman_medium |
|
Backup_Archivelogs=YES |
archivelog=include |
|
Validate_After_Backup=YES |
validate_after=yes |
|
| (sem equivalente) | canary=on |
Novo: canário anti-ransomware |
| (sem equivalente) | metrics_addr=0.0.0.0:9119 |
Novo: métricas Prometheus |
Etapas pós-migração:
- Desinstalar o RPM/DEB do Bacula Enterprise Oracle Module (não desinstalar o
bacula-enterprise-fd). - Instalar
podheitor-oracle-plugin-1.0.0-1.el9.x86_64.rpm. - Criar
/opt/bacula/etc/podheitor-oracle.confcom os parâmetros traduzidos. - Atualizar os FileSets para usar a nova sintaxe de
Plugin =. - Criar o symlink
libobk-rs.sose estiver usandomode=rman_sbt. - Executar
--dry-runpara validar. - Executar um job de backup Full e verificar se ele é concluído.
- Verificar que as peças de backup antigas do Bacula Enterprise ainda são restauráveis (elas usam o mesmo catálogo RMAN — sem necessidade de migração).
F.2 Fazendo Upgrade de Versões do PodHeitor
Upgrades de versão menor (1.0.x → 1.0.y) são upgrades in-place via RPM/DEB:
# 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
O diretório de estado em /opt/bacula/working/oracle-state/<SID>/ é preservado entre upgrades. O formato do manifesto é retrocompatível: versões mais novas conseguem ler manifestos gravados por versões mais antigas.
O symlink libobk-rs.so deve ser verificado novamente após cada upgrade caso $ORACLE_HOME/lib/ tenha sido modificado por um patch Oracle.
Apêndice G — Perguntas Frequentes
P: O PodHeitor exige uma licença Oracle além do que já tenho?
Não. O plugin usa RMAN, sqlplus, dbv e expdp — todas ferramentas incluídas com sua licença Oracle Database. libobk-rs.so é uma implementação clean-room de uma API pública publicada; não é derivada de código proprietário Oracle e não requer uma licença Oracle Backup Module.
P: O Bacula Enterprise ainda é necessário se eu usar o PodHeitor?
Não. O PodHeitor funciona inteiramente no PodHeitor Backup (a versão gratuita e de código aberto). Nenhuma assinatura Bacula Enterprise é necessária.
P: Posso usar o PodHeitor junto com o Bacula Enterprise para outros agentes?
Sim. O PodHeitor substitui apenas o plugin de backup Oracle (podheitor-oracle-fd.so). Outros plugins Bacula Enterprise (VMware, Windows etc.) podem coexistir no mesmo Director e Storage. Você pode migrar seus clientes Oracle para o PodHeitor enquanto mantém outras cargas de trabalho no Bacula Enterprise até que sua renovação ocorra.
P: O mode=replicate (archivelog_apply) fornece failover em tempo real como o Active Data Guard?
O archivelog-apply fornece replicação quase em tempo real (RPO medido em minutos, dependendo do cdp_poll_interval), mas não fornece failover automático. Ele mantém um banco de dados standby físico em estado MOUNT com archivelogs continuamente aplicados. Para fazer failover, um DBA emite ALTER DATABASE ACTIVATE STANDBY DATABASE no host standby. Isso equivale ao procedimento de failover manual da Oracle — o mesmo resultado que o failover manual do Active Data Guard, sem a licença EE.
P: Posso fazer backup de bancos de dados Oracle no Windows?
Não na versão 1.0.0. O binário do backend é apenas x86_64-linux-musl; o RMAN no Windows usa convenções de API diferentes. O suporte ao Oracle no Windows está planejado para uma versão futura via target PE compilado de forma cruzada.
P: O que acontece se o job Bacula for interrompido no meio do backup?
O plugin grava um checkpoint em /opt/bacula/working/oracle-state/<SID>/checkpoint/<jobid>.json após cada peça RMAN transferida com sucesso. Quando o Bacula tentar novamente o job (o que fará se configurado para isso), o backend detecta o checkpoint e retoma a partir da última peça bem-sucedida. Este é o ADR-014.
P: O plugin é seguro para executar em um banco de dados Oracle de produção?
Sim. Nos modos mode=rman_sbt e mode=rman, o plugin executa o RMAN em modo hot-backup — o banco de dados permanece aberto e totalmente disponível para as aplicações durante todo o backup. O mecanismo de leitura consistente multiversão do RMAN (baseado em SCN) garante que o backup set seja autocoerente mesmo que o banco de dados esteja muito carregado. Nenhuma interrupção de aplicação é necessária.
P: Como sei se meus backups Oracle são realmente restauráveis?
Três mecanismos funcionam em combinação:
validate_after=yes(padrão): Após cada backup, o plugin executaRMAN VALIDATE BACKUPSETpara verificar que todas as peças de backup podem ser lidas e seus checksums correspondem.verify_after=yesempluginrestoreconf: Após cada restauração, o DBVERIFY verifica cada bloco de dados em cada datafile.action=previewempluginrestoreconf: A qualquer momento, um job de restauração comaction=previewexecutaRESTORE DATABASE PREVIEW— um dry-run que mostra exatamente quais peças de backup serão usadas — em 4 segundos sem tocar no banco de dados.
P: O PodHeitor suporta Oracle em Docker / Kubernetes?
O plugin suporta Oracle onde quer que ele execute, desde que o Bacula FD e a instância Oracle estejam no mesmo host (ou o FD consiga acessar o Oracle via ferramentas do $ORACLE_HOME). Para Oracle em contêineres, implante o Bacula FD como um contêiner sidecar compartilhando o namespace de processos Oracle e monte o Oracle home. O binário musl static-pie não tem dependências de biblioteca que conflitem com imagens base de contêiner.
P: Qual é o tamanho máximo de banco de dados suportado?
Não há limite imposto pelo plugin. O máximo teórico é o que o RMAN consegue processar — que para o Oracle 19c/23ai é efetivamente ilimitado. Na prática, bancos de dados grandes (múltiplos TB) devem usar:
mode=rman_sbt(zero staging — nenhum disco local necessário para dados de backup)channels=autoou uma contagem alta de canais ajustada manualmente- BCT (
bct=auto) para incrementais rápidos - Uma interface de rede de backup dedicada para o tráfego Bacula FD ↔ SD
P: Posso monitorar os jobs de backup pelo Grafana?
Sim. Defina metrics_addr=0.0.0.0:9119 na configuração do plugin e configure o Prometheus para coletar o endpoint. Todos os dashboards Grafana padrão para Oracle/Bacula podem ser adaptados aos nomes de métricas do PodHeitor. Consulte o Apêndice C para a referência completa de métricas e um exemplo de configuração de scrape do Prometheus.
Versão do documento: 1.0.0 | Última atualização: 2026-04-27 Copyright © 2026 Heitor Faria — Todos os direitos reservados. Contato: heitor@opentechs.lat | +1 786 726-1749 | +55 61 98268-4220
Licenciamento
PodHeitor OracleDB é software proprietário, distribuído por assinatura. Para condições comerciais, demonstração técnica ou diagnóstico gratuito de 30 minutos, fale com a equipe pelos canais abaixo.
Pronto para avaliar?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Diagnóstico gratuito — 30 min com Heitor Faria
Disponível em:
Português
English (Inglês)
Español (Espanhol)