Backup IBM Informix integrado com ON-Bar. Hot backup, dbspaces individuais, logical log streaming, PITR ao log único, suporte a alta-disponibilidade Continuous Log Restore (CLR).
- ON-Bar nativo — integração direta com o subsistema oficial Informix.
- dbspace-level backup — backup e restore por dbspace, granularidade total.
- Logical log streaming — RPO próximo de zero.
- PITR ao log único — restauração precisa.
- HDR e Enterprise Replication-aware — backup do secondary, zero overhead no primary.
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 →
🔴 AVISO COMERCIAL
Traga seu contrato ou proposta de renovação do Bacula Enterprise, Veeam, Commvault ou Netbackup. Oferecemos pelo menos 50% de desconto com recursos significativamente superiores.
Contato: heitor@opentechs.lat | +1 786 726-1749 | +55 61 98268-4220 (WhatsApp)
Sumário
- Sumário Executivo
- Caso de Negócio e TCO
- Visão Geral da Arquitetura
- Motores de Backup em Profundidade
- Capacidades de Replicação
- Recursos Avançados
- Segurança e Conformidade
- Observabilidade
- Guia de Instalação
- Referência de Configuração
- Procedimentos de Restauração e Casos de Uso
- Relatórios de Desempenho
- Matriz de Compatibilidade
- Guia de Dimensionamento
- Integração com Bacularis
- Migração do TSM/ISP e ON-Bar PSM
- Resolução de Problemas
- Roadmap
- Evidências de Validação (Resultados E2E)
1. Sumário Executivo
O Plugin PodHeitor de Backup, Replicação e Conversão Informix para Bacula é um plugin de nível comercial e pronto para ambientes corporativos para HCL Informix Dynamic Server (IDS) 12.10 a 15.0, construído nativamente para PodHeitor Backup+. Escrito inteiramente em Rust, oferece overhead de execução próximo a zero, segurança de memória e design orientado ao paralelismo — tudo em um único pacote binário assinado que se instala em minutos.
A Lacuna que Preenche
O Bacula Enterprise não possui plugin dedicado para Informix. O catálogo de banco de dados Enterprise inclui DB2, MSSQL, MySQL, Oracle, PostgreSQL, Sybase e Amazon RDS — mas não Informix. As organizações que utilizam IDS hoje são forçadas a escolher entre o caro IBM Spectrum Protect (TSM), scripts manuais de bpipe+ontape sem PITR ou segurança de cadeia, ou o PSM da HCL que gera duplo I/O em disco.
O PodHeitor Informix é o primeiro plugin Informix nativo para Bacula, com suporte a XBSA e baseado em Rust disponível no mercado.
Principais Diferenciais
| Capacidade | Scripts manuais | TSM/PSM + Bacula | PodHeitor Informix |
|---|---|---|---|
| Custo | Gratuito, manutenção pesada | Muito caro | Licença única, sem taxas por banco |
| XBSA nativo | Não | Apenas TSM | Sim — libpodheitor_xbsa.so |
| Paralelismo | Nenhum | Limitado | N stripes × M dbspaces |
| PITR | Manual | Sim | Envio contínuo e automatizado de log lógico |
| Restauração de tabela individual | Nenhuma | archecker manual | Integrado — mode=table_level |
| Conversão entre versões | Arriscada | Não | mode=logical_dbexport de primeira classe |
| Bootstrap HDR/RSS/SDS/ER | Horas de trabalho manual | Horas de trabalho manual | Um comando bconsole |
| Recuperação instantânea | Não | Não | IDS online em < 60 s via FUSE |
| Proteção contra ransomware | Não | Não | ARD hook (IDS 14.10+) |
| Observabilidade | Nenhuma | Dashboard TSM | Prometheus + OTLP |
| Nativo para Bacula | Parcial (bpipe) | Duas camadas | XBSA direto + streaming |
Status de Validação
E2E Lab (2026-04-29): PASS=22 FAIL=0 SKIP=0 TOTAL=22
Testes unitários: PASS=80 FAIL=0
Todos os 22 cenários end-to-end ativos e aprovados em um laboratório de 4 VMs (IDS primário, secundário HDR, secundário RSS, host de snapshot) com IDS 15.0.1.0.3 Developer Edition e PodHeitor Backup.
2. Caso de Negócio e TCO
2.1 Comparação de Custos (Anual, ambiente Informix de 10 TB)
| Solução | Licença | Infraestrutura | Operacional | Total |
|---|---|---|---|---|
| IBM Spectrum Protect | ~US$ 80.000/ano | Servidor TSM separado | DBA + administrador TSM (FTE) | ~US$ 140.000/ano |
| Bacula Enterprise + scripts manuais | ~US$ 30.000/ano | Nenhuma | DBA FTE (scripts) | ~US$ 70.000/ano |
| Veeam Enterprise (módulo DB) | ~US$ 25.000/ano | Nenhuma | Administrador FTE | ~US$ 55.000/ano |
| PodHeitor Informix + PodHeitor Backup | Taxa única | Infraestrutura Bacula existente | Mínimo | < US$ 10.000 no total |
Entre em contato pelo heitor@opentechs.lat para preços. Oferecemos pelo menos 50% de desconto em qualquer renovação concorrente.
2.2 Redução de Riscos
| Risco | Sem PodHeitor | Com PodHeitor |
|---|---|---|
| Corrupção da cadeia de backup | Silenciosa — detectada no momento da restauração | Detectada imediatamente via chain_health_check + archecker |
| Criptografia por ransomware antes do backup | O backup captura dados criptografados | ARD hook aborta o backup em caso de anomalia |
| Lacuna na recuperação point-in-time | Gerenciamento manual de arquivos de log lógico | Daemon de envio contínuo de log lógico, RPO inferior a um minuto |
| Falha no bootstrap do secundário HDR | Horas de trabalho manual + risco de interrupção | Bootstrap automatizado com um único comando |
| Risco na atualização entre versões | dbexport/dbimport manual + downtime | mode=logical_dbexport em streaming, testado em E2E |
| DR de bare-metal (perda total do servidor) | Requer reconstrução manual do onconfig/sqlhosts | RestoreObject captura todos os metadados automaticamente |
2.3 Exemplo de Cálculo de ROI
Uma instituição financeira de médio porte executando Informix 14.10 em 5 servidores, com backups diários e requisito de RTO de 4 horas:
- Licença TSM + infraestrutura: ~US$ 60.000/ano
- Um incidente de recuperação de 4h × 3 DBAs: ~US$ 3.600 por incidente
- Migração para PodHeitor: custo único + PodHeitor Backup (gratuito)
- Período de retorno: < 3 meses
3. Visão Geral da Arquitetura
3.1 Diagrama de Componentes
┌─────────────────────────────────────────────────────────────────────┐
│ Bacula Director 15.0.3 │
│ Job scheduler, catalog, pool management │
└──────────────────────────────┬──────────────────────────────────────┘
│ TCP/TLS PTCOMM
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Bacula File Daemon (bacula-fd) │
│ │
│ Loads: podheitor-informix-fd.so │
│ ├── PLUGIN_PREFIX = "podheitor-informix:" │
│ ├── Namespace = "@informix/" │
│ ├── 64 backup parameters + 33 restore parameters │
│ └── PTCOMM binary protocol (streams D-packets to Director) │
└──────────────────────────────┬──────────────────────────────────────┘
│ Unix socket / stdin-stdout PTCOMM
▼
┌─────────────────────────────────────────────────────────────────────┐
│ podheitor-informix-backend (Rust static binary) │
│ │
│ ┌─── Engine Layer (mode=) ──────────────────────────────────────┐ │
│ │ xbsa onbar_psm ontape logical_dbexport │ │
│ │ (libxbsa.so) (FIFO drain) (STDIO) (dbexport stream) │ │
│ │ snapshot replicate_hdr replicate_rss replicate_er │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── XBSA Library (libpodheitor_xbsa.so) ──────────────────────┐ │
│ │ BSAInit / BSABeginTxn / BSACreateObject / BSASendData │ │
│ │ BSAEndTxn / BSATerminate / BSAGetData / BSAQueryObject │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Daemon de Envio de Log Lógico ─────────────────────────────┐ │
│ │ Consulta sysmaster:syslogs a cada N segundos │ │
│ │ Envia logs fechados via PTCOMM — RPO inferior a um minuto │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Observabilidade ────────────────────────────────────────────┐ │
│ │ Prometheus /metrics OpenTelemetry OTLP traces │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Segurança ──────────────────────────────────────────────────┐ │
│ │ Captura/restauração DBCRYPT ARD ransomware hook Redação │ │
│ └──────────────────────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────────┘
│ XBSA ABI / pipes / sockets / SQL
▼
┌─────────────────────────────────────────────────────────────────────┐
│ HCL Informix Dynamic Server (12.10.FC12+ / 14.10 / 15.0) │
│ + sysmaster (bar_action, bar_object, syslogs, sysshmvals) │
│ + ON-Bar (onbar) + archecker + oncheck │
│ + topologia de replicação HDR / RSS / SDS / ER │
│ + DBCRYPT keystore │
└─────────────────────────────────────────────────────────────────────┘
3.2 Fluxo de Dados — Modo XBSA (Preferencial)
ON-Bar invocado pelo plugin
│
│ dlopen(libpodheitor_xbsa.so)
▼
libpodheitor_xbsa.so ──Unix socket──► podheitor-informix-backend
│ │
│ BSACreateObject(dbspace) │ compressão (zstd/lz4)
│ BSASendData(blocks) │ N streams PTCOMM em stripe
│ │ cálculo SHA-256
│ │ gravação de sidecar manifest
▼ ▼
BSAEndTxn Bacula Storage Daemon
(File, Tape, S3, Dedup)
3.3 Namespace do Volume de Backup
/@informix/<INSTANCE_UUID>/
├── __ph_manifest.json # manifest canônico do job (LSN, SHA256, lista de dbspace)
├── __ph_topology.json # snapshot de topologia HDR/RSS/SDS/ER
├── __ph_dbcrypt.json # referência do keystore criptografado (sem chave em texto plano)
├── __ph_layout.json # mapeamento dbspace → chunk path
├── restoreobjects/
│ ├── onconfig
│ ├── sqlhosts
│ └── ixbar.<servernum> # arquivo de boot de emergência do ON-Bar
├── dbspace/<name>/
│ ├── L0.<jobid>.s<N>.zst # stripe N nível 0 (quadro ZSTD)
│ ├── L1.<jobid>.s<N>.zst
│ └── manifest.<jobid>.json # LSN + SHA256 por dbspace
├── logs/
│ ├── log.<unique_id>.<lsn>.zst
│ └── continuous/<YYYY>/<MM>/<DD>/
└── logical/
├── dbexport.<db>.<jobid>.tar.zst
└── schema.<db>.<jobid>.sql
4. Motores de Backup em Profundidade
4.1 Modo xbsa — XBSA Nativo (Padrão em mode=auto)
O diferencial estratégico. libpodheitor_xbsa.so implementa o ABI C completo do IBM XBSA, construído em Rust com memory-safety nativo. O ON-Bar o carrega via BAR_BSALIB_PATH, tornando o Bacula um gerenciador de armazenamento Informix de primeira classe — sem staging, sem duplo I/O, sem manipulação de FIFO.
Vantagens sobre todas as alternativas:
- O paralelismo nativo do ON-Bar (
BAR_MAX_BACKUP) mapeia 1:1 para streams PTCOMM - Acesso completo ao catálogo do ON-Bar (
sysmaster:bar_action,bar_object) para captura de LSN - Suporte à verificação pós-backup do archecker através do registro padrão do ON-Bar
- Zero bytes gravados no disco local do host FD (diretório de trabalho < 50 MB)
Funções XBSA implementadas: BSAInit, BSABeginTxn, BSACreateObject, BSASendData, BSAEndTxn, BSATerminate, BSAGetData, BSAQueryObject, BSAEndData, BSADeleteObject
4.2 Modo onbar_psm — Fallback PSM
O ON-Bar grava no HCL Primary Storage Manager (PSM) direcionado a um named pipe. O backend drena o pipe → PTCOMM. Utilizado quando a política da organização proíbe o carregamento de bibliotecas XBSA de terceiros.
4.3 Modo ontape — Legado/Simples
ontape -s -t STDIO -L 0|1|2. Apenas servidor completo; sem granularidade por dbspace. Para desenvolvimento, instâncias pequenas ou ambientes sem ON-Bar configurado. Validado em E2E T16.
4.4 Modo logical_dbexport — Conversão Entre Versões
dbexport <db> -ss -X -q transmitido via tar-on-the-fly assíncrono → PTCOMM. A saída é um tar comprimido contendo schema SQL + arquivos de unload por tabela. Restaurável em qualquer versão do IDS com dbimport. Uso principal: migração de versão principal (12.10 → 14.10 → 15.0). Validado em E2E T12.
4.5 Modo snapshot — Quiesce LVM/ZFS
- Checkpoint
onmode -c - Coloca dbspaces em modo de backup (
BAR_BLOCK_BACKUP=1) - LVM
lvcreate --snapshot/ ZFSzfs snapshot - Libera modo de backup — janela de quiesce < 1 segundo
- Transmite blocos do snapshot via PTCOMM (chunking por conteúdo para dedup)
- Captura logs lógicos arquivados via
onbar -b -l
Validado em E2E T13 usando LVM VG com loop-backed (ifxvg/ifxdata).
4.6 Mapeamento de Nível de Backup
| Nível Bacula | Nível ON-Bar | Comportamento do Plugin |
|---|---|---|
| Full | onbar -b -L 0 |
Baseline nível 0 do servidor completo. O manifest captura BAR_VERSION, INSTANCE_UUID, lista completa de dbspace, LSN. |
| Differential | onbar -b -L 1 |
Cumulativo desde L0. Promove automaticamente para Full se chain_health_check detectar cadeia quebrada. |
| Incremental | onbar -b -L 2 OU apenas log lógico |
Padrão: level_incr=logical_log para RPO inferior a um minuto. Envia apenas arquivos de log recém-fechados. |
| VirtualFull | (sintético) | O plugin mescla a cadeia L0+L1+L2 em um novo stream L0 consumido pela consolidação do Bacula. |
5. Capacidades de Replicação
5.1 Bootstrap HDR (High-Availability Data Replication)
Problema: Configurar um secundário HDR hoje requer onmode -d primary, onmode -d secondary manuais, configuração de rede personalizada, frequentemente horas de trabalho do DBA.
Solução PodHeitor: Um único job de restauração com mode=ag_seed ag_target_role=hdr_secondary:
- Restaura a cadeia de backup mais recente no destino com equivalente a
WITH NORECOVERY - Ajusta
DRAUTO/DRINTERVAL/DRTIMEOUTno destino - Executa
onmode -d primary <target_servernum>no primário - Executa
onmode -d secondary <primary_servernum>no destino - Valida se o secundário atinge o estado
On-Line (Sec)
Validado em E2E T10 e T14.
5.2 Bootstrap RSS (Remote Standalone Secondary)
Mesmo fluxo com ag_target_role=rss. Usa onmode -d add RSS <name> no primário + onmode -d RSS <primary_name> no destino. Validado em E2E T11.
5.3 Attach SDS (Shared Disk Secondary)
Valida a topologia de disco compartilhado, anexa novo SDS via onmode -d set SDS PRIMARY <primary_name>.
5.4 Snapshot/Restauração de Topologia Enterprise Replication (ER)
__ph_topology.json captura a malha ER completa: servidores, replicates, grids, assinaturas. Na restauração, cdr define server + cdr define replicate + cdr start replicate reconstitui a topologia. Essencial para DR quando toda a malha ER precisa ser reconstruída.
5.5 Backup a partir do Secundário (Descarga do Primário)
Plugin = "podheitor-informix: prefer_secondary_for_backup=yes hdr_role_check=secondary"
O plugin detecta o par HDR, conecta-se ao secundário e executa o ON-Bar lá. A CPU/I/O do primário permanece completamente sem impacto durante a janela de backup.
6. Recursos Avançados
6.1 Envio Contínuo de Log Lógico (RPO Inferior a Um Minuto)
Quando continuous_log=yes, o backend cria uma thread daemon que:
- Consulta
sysmaster:syslogsa cadacontinuous_log_intervalsegundos (padrão: 60s, mínimo: 5s) - Detecta arquivos de log lógico recém-fechados (status
U → B) - Envia cada log atomicamente via um micro-job PTCOMM com verificação de integridade SHA-256
- Detecta e alerta sobre lacunas na sequência de log lógico
RPO alcançado: < 1 minuto em laboratório; < 5 segundos com continuous_log_interval=5.
Validado em E2E T09-F (base) + T09-I (contínuo).
6.2 Recuperação Point-in-Time (PITR)
podheitor-informix: mode=whole_server stop_at_time="2026-04-28 14:30:00"
point_in_time_tz=America/Sao_Paulo
Opções:
stop_at_lsn=<N>— para a reprodução do log lógico em um LSN específicostop_at_time=<datetime>— para em um timestampstop_before_txn=<txnid>— para antes de uma transação específica (para rollback direcionado)
O plugin reproduz a cadeia de backup L0 → L1 → L2 → logs lógicos até o ponto escolhido, então executa onmode -m para colocar a instância online. Validado em E2E T05.
6.3 Recuperação Instantânea (Montagem FUSE)
podheitor-informix: mode=instant instant_fuse_mount=/var/lib/podheitor-informix/instant
- Restaura cabeçalhos de chunk e página 0 de cada dbspace
- O sistema de arquivos FUSE apresenta arquivos de chunk virtuais respaldados por dados Bacula transmitidos de forma lazy
- O IDS inicializa via
oninit -PHYcontra os chunks montados via FUSE - Instância consultável em < 60 segundos
- Os blocos restantes são transmitidos em lazy em segundo plano enquanto o IDS atende consultas
Caso de uso: continuidade imediata dos negócios enquanto a restauração completa prossegue em segundo plano. Validado em E2E T17 usando /dev/loop-control + /dev/fuse na VM 189.
6.4 Extração de Tabela Individual
podheitor-informix: mode=table_level table=app_db.dbo.orders
sandbox_docker_image=icr.io/informix/informix-developer-database:latest
single_item_export_dir=/tmp/restored
- Inicializa um contêiner Podman/Docker Developer Edition efêmero
- Restaura a cadeia de backup completa no sandbox
- Reproduz até o ponto de tempo solicitado
- Executa
dbexport/unloadpara a tabela de destino - Copia a saída para
single_item_export_dir - Destrói o contêiner sandbox
Resultado: Tabela de destino extraída em < 5 min a partir de um backup de 100 GB, sem impacto na produção. Validado em E2E T07.
6.5 Aplicação da Integridade da Cadeia
Por padrão (chain_health_check=yes), antes de cada Differential ou Incremental:
- O plugin consulta
sysmaster:bar_actionpara o LSN do nível 0 precedente - Valida a cadeia de manifest (SHA-256 de cada sidecar)
- Compara com o histórico de jobs do catálogo Bacula
Se a cadeia estiver quebrada (job ausente, lacuna de LSN, incompatibilidade de SHA), o job aborta antes de gravar qualquer dado, evitando um backup de falsa confiança. Os operadores são notificados com um erro claro explicando a lacuna.
6.6 Virtual Full (Full Sintético)
virtual_full=yes aciona uma mesclagem de cadeia no lado do servidor: o plugin lê os streams L0+L1+L2 do Bacula, mescla-os em um novo stream L0 que o Bacula ingere como um novo backup Full. Elimina cadeias longas de restauração (sem necessidade de aplicar Diff+Incr na restauração) evitando outro backup completo do host IDS.
6.7 Recuperação de Desastre Bare-Metal
Cada backup captura automaticamente um RestoreObject contendo:
onconfig(arquivo ONCONFIG)sqlhosts(definições de conectividade)ixbar.<servernum>(arquivo de boot de emergência do ON-Bar)
Ao restaurar em um host novo sem instalação prévia do IDS:
- O Bacula restaura o RestoreObject primeiro
- O plugin reconstrói a estrutura de diretórios do IDS
- Executa a inicialização padrão do
oninit - Restaura chunks e reproduz logs lógicos
Nenhuma intervenção manual do DBA necessária. Validado em E2E T18.
7. Segurança e Conformidade
7.1 Controles de Segurança
| Superfície | Controle | Padrão |
|---|---|---|
| Configuração do plugin | Caminho do passfile verificado para chmod 600; backend aborta se mais permissivo |
Aplicado |
| Strings de conexão em logs | Redação por regex de segredos em toda a saída do logger PTCOMM | redact_sysuser_passwords=yes |
| DBCRYPT keystore | Apenas blob criptografado (ponteiro de hash) armazenado em __ph_dbcrypt.json; chave em texto plano NUNCA registrada ou armazenada |
dbcrypt_capture=yes |
| Caminho de carga da biblioteca XBSA | Verificado contra /opt/podheitor-informix/lib/; LD_PRELOAD rejeitado |
Aplicado |
| Diretório de trabalho | /var/run/podheitor-informix modo 0700 pertencente ao informix |
Aplicado |
| Contêiner sandbox | Efêmero, root --read-only + tmpfs; excluído após extração |
Aplicado |
| Montagem FUSE | Somente leitura; montado como informix:informix modo 0700 |
Aplicado |
| Códigos de saída do ON-Bar | Código diferente de zero aciona falha no job | chain_health_check=yes |
| IDs de correlação | Todas as mensagens PTCOMM registradas com estrutura com o JobId do Bacula | Sempre |
7.2 Suporte a DBCRYPT
O recurso DBCRYPT do Informix criptografa dados em repouso no nível do mecanismo de armazenamento. O PodHeitor:
- Captura os metadados do keystore (não a chave) em
__ph_dbcrypt.json - Registra o label/alias da chave para invocação do hook na restauração
- Na restauração, invoca o hook de passphrase do DBCRYPT antes do
oninit - Resultado: bancos de dados criptografados em repouso fazem backup e restauração sem gerenciamento manual de chaves
Validado em E2E T15.
7.3 ARD Ransomware Hook
Quando ransomware_hook=yes, o plugin executa onstat -g ARD antes do backup e verifica:
- Anomalias de entropia em blocos de log lógico recentemente gravados
- Aumento repentino nas taxas de UPDATE/DELETE (Active Ransomware Detection, IDS 14.10+)
Se uma anomalia for detectada, o backup aborta com um aviso claro, impedindo que o estado criptografado pelo ransomware sobrescreva um backup limpo.
7.4 Checklist de Endurecimento de Permissões de Arquivo
# Verificar permissões corretas após instalação
ls -la /opt/bacula/plugins/podheitor-informix-fd.so # -rwxr-xr-x root root
ls -la /opt/bacula/plugins/podheitor-informix-backend # -rwxr-x--- root informix
ls -la /opt/podheitor-informix/lib/libpodheitor_xbsa.so # -rwxr-x--- root informix
ls -la /opt/bacula/etc/podheitor-informix.conf # -rw------- informix informix
ls -la /var/run/podheitor-informix/ # drwx------ informix informix
8. Observabilidade
8.1 Métricas Prometheus
Quando metrics_endpoint=localhost:9100 está configurado, o plugin expõe um endpoint padrão Prometheus /metrics.
| Métrica | Tipo | Descrição |
|---|---|---|
podheitor_ifx_job_bytes_total |
Counter | Total de bytes transferidos neste job |
podheitor_ifx_job_throughput_bytes_sec |
Gauge | Taxa de transferência atual |
podheitor_ifx_dbspace_progress_pct |
Gauge | Percentual de conclusão por dbspace |
podheitor_ifx_logship_lag_seconds |
Gauge | Atraso no envio de log lógico (modo continuous_log) |
podheitor_ifx_onbar_exit_code |
Gauge | Código de saída da última invocação do ON-Bar |
podheitor_ifx_archecker_pass |
Gauge | 1=aprovado, 0=falhou (última execução do archecker) |
podheitor_ifx_queue_depth |
Gauge | Profundidade da fila write-ahead do PTCOMM |
podheitor_ifx_active_stripes |
Gauge | Número atual de streams PTCOMM ativos |
podheitor_ifx_xbsa_buffer_pool_used |
Gauge | Utilização do pool de buffers XBSA (bytes) |
Exemplo de query Grafana para throughput:
rate(podheitor_ifx_job_bytes_total[1m])
Exemplo de query Grafana para alerta de atraso no envio de log lógico:
podheitor_ifx_logship_lag_seconds > 300
8.2 Traces OpenTelemetry OTLP
Quando otel_endpoint=http://collector:4317 está configurado, o plugin emite spans estruturados para um coletor compatível com OTLP (Jaeger, Tempo, Honeycomb, etc.).
Hierarquia de spans:
backup.job (job_id=NNNNN, instance=ifxprod)
├── engine.xbsa.init
├── dbspace.rootdbs.backup (level=0)
│ ├── stripe.0.compress
│ └── stripe.0.ptcomm_write
├── dbspace.app_data.backup (level=0)
├── manifest.write
├── archecker.verify
└── topology.snapshot
9. Guia de Instalação
9.1 Pré-requisitos
Host do Bacula File Daemon (co-localizado com IDS):
- SO: OL9/RHEL 8/9/Rocky 8/9/AlmaLinux 8/9, Ubuntu 20.04/22.04/24.04, Debian 11/12, SLES 15
- PodHeitor Backup FD 15.0.3+
- HCL Informix 12.10.FC12+ / 14.10.FCx / 15.0.x instalado
- Usuário/grupo
informixcom privilégios IDS padrão - Para
mode=snapshot: LVM ou ZFS nos dispositivos dbspace,losetup+lvcreatedisponíveis - Para
mode=instant:/dev/fuse+/dev/loop-controlacessíveis - Para
mode=table_level: Podman ou Docker instalado
Bacula Director:
- Director 15.0.x com as definições de FileSet e Job (ver §10)
9.2 Instalação no EL8/EL9 (RPM)
# Baixe o RPM de releases/
rpm -ivh podheitor-informix-plugin-0.1.0-1.el9.x86_64.rpm
# Verificar instalação
ls /opt/bacula/plugins/podheitor-informix-fd.so
ls /opt/bacula/plugins/podheitor-informix-backend
ls /opt/podheitor-informix/lib/libpodheitor_xbsa.so
ls /opt/bacula/etc/podheitor-informix.conf.sample
9.3 Instalação no Ubuntu 22.04 / Debian 12 (DEB)
# Baixe o DEB de releases/
dpkg -i podheitor-informix-plugin_0.1.0-1_amd64.deb
# Verificar
dpkg -L podheitor-informix-plugin
9.4 Configurar o Plugin
# Copiar e editar a configuração de exemplo
cp /opt/bacula/etc/podheitor-informix.conf.sample
/opt/bacula/etc/podheitor-informix.conf
chmod 600 /opt/bacula/etc/podheitor-informix.conf
chown informix:informix /opt/bacula/etc/podheitor-informix.conf
vi /opt/bacula/etc/podheitor-informix.conf
Configurações mínimas necessárias:
[connection]
informixdir = "/opt/ibm/informix"
informixserver = "ifxprod"
onconfig = "onconfig.std"
[engine]
mode = "auto" # xbsa se onbar disponível, caso contrário ontape
compress = "zstd"
compress_level = 3
9.5 Configurar Ambiente BAR
# /etc/sysconfig/podheitor-informix (lido pelo onbar e pelo backend)
cat > /etc/sysconfig/podheitor-informix << 'EOF'
INFORMIXDIR=/opt/ibm/informix
INFORMIXSERVER=ifxprod
ONCONFIG=onconfig.std
INFORMIXSQLHOSTS=/opt/ibm/informix/etc/sqlhosts
PATH=/opt/ibm/informix/bin:$PATH
BAR_BSALIB_PATH=/opt/podheitor-informix/lib/libpodheitor_xbsa.so
BAR_MAX_BACKUP=4
BAR_XFER_BUF_SIZE=1048576
BAR_NB_XPORT_COUNT=10
EOF
chmod 640 /etc/sysconfig/podheitor-informix
chown root:informix /etc/sysconfig/podheitor-informix
9.6 Verificação Preflight
/opt/bacula/plugins/podheitor-informix-backend --dry-run
/opt/bacula/etc/podheitor-informix.conf
Saída esperada:
[INFO] PodHeitor Informix v0.1.0 — preflight check
[INFO] IDS version: 15.0.1.0.3
[INFO] ON-Bar available: yes
[INFO] archecker available: yes
[INFO] XBSA library: /opt/podheitor-informix/lib/libpodheitor_xbsa.so [OK]
[INFO] BAR_BSALIB_PATH configured: yes
[INFO] Working dir: /var/run/podheitor-informix [created, mode 0700]
[INFO] Connectivity: ifxprod@localhost:9088 [OK]
[INFO] DRY-RUN COMPLETE — all checks passed
9.7 Reiniciar o bacula-fd
systemctl restart bacula-fd
journalctl -u bacula-fd -n 50 | grep -i podheitor
# Esperado: "Loaded plugin: podheitor-informix v0.1.0"
10. Referência de Configuração
10.1 Opções de Backup
| # | Parâmetro | Padrão | Tipo | Descrição |
|---|---|---|---|---|
| Conexão | ||||
| 1 | informixdir |
$INFORMIXDIR |
caminho | Diretório de instalação do IDS |
| 2 | informixserver |
$INFORMIXSERVER |
string | Nome do servidor (entrada sqlhosts) |
| 3 | onconfig |
$ONCONFIG |
arquivo | Override do arquivo onconfig |
| 4 | sqlhosts |
$INFORMIXSQLHOSTS |
arquivo | Override do arquivo sqlhosts |
| 5 | user |
informix |
string | Usuário SO para execução |
| 6 | passfile |
— | caminho | Arquivo de credenciais (chmod 600) |
| 7 | kerberos_keytab |
— | caminho | Keytab Kerberos para Trusted Context |
| Motor | ||||
| 8 | mode |
auto |
enum | `auto | xbsa | onbar_psm | ontape | logical_dbexport | snapshot | replicate_hdr | replicate_rss | replicate_sds | replicate_er` |
| Escopo | ||||
| 9 | dbspace |
* |
glob | Quais dbspaces fazer backup |
| 10 | include_dbspace |
— | glob (múltiplo) | Lista de inclusão explícita |
| 11 | exclude_dbspace |
tempdb* |
glob (múltiplo) | Lista de exclusão |
| 12 | database |
— | glob | Filtro de BD no modo lógico |
| 13 | whole_system |
yes |
bool | Servidor completo vs por dbspace |
| 14 | include_blobspace |
yes |
bool | Blobspaces tradicionais |
| 15 | include_sbspace |
yes |
bool | Sbspaces de smart-blob |
| 16 | include_external_dbspace |
no |
bool | Dbspaces externos (somente leitura) |
| 17 | include_temp_dbspace |
no |
bool | Dbspaces temporários |
| Níveis | ||||
| 18 | level_full |
0 |
int | Mapeia Bacula Full → ON-Bar nível 0 |
| 19 | level_diff |
1 |
int | Mapeia Bacula Differential → nível 1 |
| 20 | level_incr |
logical_log |
enum | `2 | logical_log` |
| 21 | force_full_after |
7 |
int | Promoção automática para Full após N incrementais |
| 22 | chain_health_check |
yes |
bool | Verificar cadeia antes de Diff/Incr |
| 23 | simulate_full |
no |
bool | Forçar nível 0 independente da solicitação do Bacula |
| 24 | copy_only |
no |
bool | Backup fora de banda (não perturba a cadeia) |
| Desempenho | ||||
| 25 | bar_max_backup |
# núcleos CPU |
int | Define BAR_MAX_BACKUP (streams ON-Bar paralelos) |
| 26 | stripes |
1 |
int | Striping em N vias por stream (1–32) |
| 27 | parallel_dbspaces |
# núcleos CPU |
int | Backups de dbspace concorrentes |
| 28 | bar_xfer_buf_size |
1048576 |
bytes | Define BAR_XFER_BUF_SIZE |
| 29 | bar_nb_xport_count |
10 |
int | Define BAR_NB_XPORT_COUNT |
| 30 | xbsa_buffer_count |
8 |
int | Profundidade do pool de buffers compartilhados XBSA |
| 31 | xbsa_block_size |
65536 |
bytes | Tamanho de bloco XBSA |
| 32 | compress |
zstd |
enum | `none | zstd | lz4` |
| 33 | compress_level |
3 |
int | Nível de compressão ZSTD (1–22) |
| 34 | lob_chunked_streaming |
yes |
bool | Chunking por conteúdo para LOBs sbspace |
| 35 | max_rate_kbps |
0 |
int | Limitação de largura de banda por job (0=ilimitado) |
| 36 | cpu_quota |
0 |
pct | Cota de CPU cgroup para o processo backend |
| Envio de Log Lógico | ||||
| 37 | continuous_log |
no |
bool | Daemon de envio de log lógico em segundo plano |
| 38 | continuous_log_interval |
60 |
segundos | Intervalo de polling (mínimo 5) |
| 39 | continuous_log_archive_only |
yes |
bool | Para após BAR_RETRY falhas |
| 40 | salvage_logs |
no |
bool | onbar -l -s recuperação após crash |
| Integridade | ||||
| 41 | oncheck_pre_backup |
no |
enum | `no | ce | cI | cD` |
| 42 | oncheck_post_backup |
no |
enum | `no | ce | cI | cD` |
| 43 | archecker_verify |
yes |
bool | Executar archecker após backup |
| 44 | manifest_sha256 |
yes |
bool | SHA256 por stream no manifest |
| 45 | verify_lsn_chain |
yes |
bool | Verificação cruzada de LSNs sysmaster:bar_action |
| Replicação | ||||
| 46 | topology_snapshot |
yes |
bool | Snapshot de topologia HDR/RSS/SDS/ER |
| 47 | er_subscribe_snapshot |
yes |
bool | Captura replicates + grids ER |
| 48 | hdr_role_check |
any |
enum | `primary | secondary | any` |
| 49 | prefer_secondary_for_backup |
no |
bool | Fazer backup a partir do secundário HDR |
| Segurança | ||||
| 50 | dbcrypt_capture |
yes |
bool | Capturar metadados do DBCRYPT keystore |
| 51 | redact_sysuser_passwords |
yes |
bool | Filtrar sysmaster:sysuser das exportações |
| 52 | audit_export |
no |
bool | Incluir trilha de auditoria |
| 53 | ransomware_hook |
no |
bool | Abortar em detecção de anomalia ARD |
| Observabilidade | ||||
| 54 | metrics_endpoint |
— | host:porta | Endpoint Prometheus /metrics |
| 55 | otel_endpoint |
— | URI | Coletor de traces OTLP |
| 56 | progress_report_interval |
30 |
segundos | Cadência do progresso no log do job |
| Operacional | ||||
| 57 | dry_run |
no |
bool | Apenas preflight (sem escrita) |
| 58 | abort_on_chain_break |
yes |
bool | Recusar Diff/Incr se cadeia quebrada |
| 59 | working_dir |
/var/run/podheitor-informix |
caminho | Diretório FIFO + sentinel |
| 60 | config_file |
/opt/bacula/etc/podheitor-informix.conf |
caminho | Config TOML externo |
| 61 | cluster_id |
— | string | Separador de namespace multi-cluster |
| 62 | bar_ixbar_path |
$INFORMIXDIR/etc/ixbar.<servernum> |
caminho | Arquivo de boot de emergência do ON-Bar |
| 63 | restore_object |
yes |
bool | Armazenar onconfig+sqlhosts+ixbar como RestoreObject |
| 64 | virtual_full |
no |
bool | Full sintético a partir da cadeia L0+L1+L2 |
10.2 Opções de Restauração
| # | Parâmetro | Padrão | Descrição |
|---|---|---|---|
| 1 | mode |
auto |
`auto | whole_server | in_place | new_instance | single_dbspace | table_level | instant | ag_seed | logical_import` |
| 2 | informixdir |
$INFORMIXDIR |
Diretório de instalação IDS de destino |
| 3 | informixserver |
(nome da origem) | Novo nome de servidor IDS |
| 4 | onconfig |
$ONCONFIG |
Arquivo onconfig de destino |
| 5 | dbspace_relocation_map |
— | Arquivo JSON para remapeamento lógico→físico de chunk path |
| 6 | target_root_dbspace |
— | Override do chunk path do rootdbs |
| 7 | target_dbspace |
— | Destino no modo single-dbspace |
| 8 | dbspace |
* |
Quais dbspaces restaurar |
| 9 | database |
* |
Filtro de BD no modo lógico |
| 10 | table (múltiplo) |
— | Tabelas de destino para mode=table_level |
| 11 | column_filter |
— | Filtro opcional em nível de coluna (table_level) |
| 12 | recovery |
yes |
WITH RECOVERY (sim) vs NORECOVERY (para seed HDR) |
| 13 | stop_at_lsn |
— | Para a reprodução de log lógico no LSN |
| 14 | stop_at_time |
— | Para a reprodução de log lógico no timestamp |
| 15 | stop_before_txn |
— | Para antes de uma transação específica |
| 16 | point_in_time_tz |
UTC |
Fuso horário para stop_at_time |
| 17 | physical_only |
no |
Restaurar apenas fisicamente (pular reprodução de log lógico) |
| 18 | drop_existing |
no |
`no | yes | only_if_match` |
| 19 | tail_log_before |
yes |
Recuperar logs lógicos atuais antes de restauração destrutiva |
| 20 | verify_post |
archecker |
`no | oncheck | archecker | both` |
| 21 | dry_run |
no |
Preflight (validar manifest + caminhos, sem escrita) |
| 22 | parallel_streams |
(valor do backup) | Streams de restauração concorrentes |
| 23 | stripes |
(valor do backup) | Corresponder stripes do backup |
| 24 | parallel_dbspaces |
# núcleos CPU |
Restaurações de dbspace concorrentes |
| 25 | instant_fuse_mount |
/var/lib/podheitor-informix/instant |
Ponto de montagem FUSE para recuperação instantânea |
| 26 | sandbox_docker_image |
icr.io/informix/informix-developer-database:latest |
Imagem sandbox para table_level |
| 27 | single_item_export_dir |
/var/lib/podheitor-informix/extracted |
Saída para table_level |
| 28 | ag_target_role |
— | `hdr_secondary | rss | sds` |
| 29 | ag_primary_host |
— | Primário para se conectar após seed |
| 30 | dbcrypt_keystore |
— | Override da localização do DBCRYPT keystore |
| 31 | dbcrypt_passphrase_file |
— | Passphrase para keystore selado |
| 32 | progress_report_interval |
30 |
Cadência de progresso |
| 33 | regexwhere |
— | Realocação padrão por regex do Bacula |
10.3 Exemplos de FileSet
Backup básico de servidor completo (XBSA, padrões):
FileSet {
Name = "Informix-Full"
Include {
Options { Signature = SHA256 }
Plugin = "podheitor-informix:"
}
}
Dbspaces específicos, com stripe e verificação:
FileSet {
Name = "Informix-AppData"
Include {
Plugin = "podheitor-informix: include_dbspace=app_data include_dbspace=app_index
exclude_dbspace=tempdb* archecker_verify=yes compress=zstd
stripes=4 parallel_dbspaces=2"
}
}
Envio contínuo de log lógico (RPO inferior a um minuto):
FileSet {
Name = "Informix-LogShip"
Include {
Plugin = "podheitor-informix: continuous_log=yes continuous_log_interval=30"
}
}
Migração entre versões:
FileSet {
Name = "Informix-Export"
Include {
Plugin = "podheitor-informix: mode=logical_dbexport database=app_db"
}
}
Modo snapshot (LVM):
FileSet {
Name = "Informix-Snapshot"
Include {
Plugin = "podheitor-informix: mode=snapshot snapshot_vg=ifxvg snapshot_lv=ifxdata snapshot_size=1G"
}
}
Backup de alto desempenho VLDB (8 stripes, 4 dbspaces paralelos):
FileSet {
Name = "Informix-VLDB"
Include {
Plugin = "podheitor-informix: stripes=8 parallel_dbspaces=4 bar_max_backup=8
bar_xfer_buf_size=4194304 compress=zstd compress_level=3"
}
}
Backup a partir do secundário HDR (descarga do primário):
FileSet {
Name = "Informix-HDR-Secondary"
Include {
Plugin = "podheitor-informix: prefer_secondary_for_backup=yes hdr_role_check=secondary"
}
}
10.4 Definições de Job
Job {
Name = "informix-prod-full"
JobDefs = "DefaultJob"
Type = Backup
Level = Full
FileSet = "Informix-Full"
Schedule = "WeeklyFull"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Full"
}
Job {
Name = "informix-prod-diff"
JobDefs = "DefaultJob"
Type = Backup
Level = Differential
FileSet = "Informix-Full"
Schedule = "DailyDiff"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Diff"
}
Job {
Name = "informix-prod-logship"
JobDefs = "DefaultJob"
Type = Backup
Level = Incremental
FileSet = "Informix-LogShip"
Schedule = "Every5Min"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Logs"
Max Run Time = 10 minutes
}
11. Procedimentos de Restauração e Casos de Uso
11.1 Restauração Completa do Servidor (In-Place)
bconsole> restore client=ifx-prod-fd
[navegar e marcar]
bconsole> mod
Plugin Options: podheitor-informix: mode=in_place drop_existing=only_if_match
tail_log_before=yes verify_post=both
bconsole> yes
11.2 Restauração para Nova Instância (Recuperação de Desastre)
bconsole> restore client=ifx-prod-fd where=/
Plugin Options: podheitor-informix: mode=new_instance informixserver=ifxprod-dr
dbspace_relocation_map=/etc/podheitor-informix/dr-relocation.json
verify_post=archecker
11.3 Recuperação Point-in-Time
Plugin Options: podheitor-informix: mode=whole_server
stop_at_time="2026-04-28 14:30:00"
point_in_time_tz=America/Sao_Paulo
verify_post=both
11.4 Recuperação Instantânea
Plugin Options: podheitor-informix: mode=instant
instant_fuse_mount=/var/lib/podheitor-informix/instant
Linha do tempo esperada:
- 0–15s: restaura cabeçalhos de chunk + página 0
- 15–60s: IDS inicializa contra montagem FUSE
- 60s+: instância online, streaming lazy continua
11.5 Extração de Tabela Individual
Plugin Options: podheitor-informix: mode=table_level
table=app_db.dbo.orders
stop_at_time="2026-04-28 12:00:00"
sandbox_docker_image=icr.io/informix/informix-developer-database:latest
single_item_export_dir=/tmp/orders-restored
11.6 Bootstrap de Secundário HDR
Plugin Options: podheitor-informix: mode=ag_seed
ag_target_role=hdr_secondary
ag_primary_host=ifx-prod:9088
recovery=no
11.7 Migração Entre Versões (12.10 → 15.0)
Passo 1 — backup da origem (12.10):
Plugin = "podheitor-informix: mode=logical_dbexport database=app_db"
Passo 2 — restauração no destino 15.0:
Plugin Options: podheitor-informix: mode=logical_import informixdir=/opt/ibm/informix
informixserver=ifxprod-new database=app_db
12. Relatórios de Desempenho
12.1 Benchmarks de Throughput (Lab — OL9, IDS 15.0.1, rede 1 Gbps)
| Tamanho do BD | Modo | stripes | parallel_dbspaces | Throughput | Tempo total |
|---|---|---|---|---|---|
| 10 GB | xbsa (zstd-3) | 2 | 1 | 250 MB/s | 42 s |
| 10 GB | ontape (zstd-3) | 1 | n/a | 85 MB/s | 2 min |
| 50 GB | xbsa (zstd-3) | 4 | 2 | 420 MB/s | 2 min |
| 100 GB | xbsa (zstd-3) | 4 | 4 | 440 MB/s | 4 min |
| 100 GB | snapshot (zstd-3) | 4 | 4 | 520 MB/s | 3,5 min |
12.2 Comparação de Taxa de Compressão
| Tipo de Dado | zstd-3 | zstd-9 | lz4 | none |
|---|---|---|---|---|
| OLTP (misto) | 2,8× | 3,5× | 2,2× | 1× |
| Texto/documentos | 6,2× | 8,0× | 4,5× | 1× |
| Dbspaces de sistema IDS | 3,1× | 4,0× | 2,4× | 1× |
| BLOBs binários | 1,05× | 1,05× | 1,02× | 1× |
Recomendação: compress=zstd compress_level=3 para a maioria dos ambientes. Use lz4 para hosts com CPU limitada; zstd compress_level=9 para redução de custo de armazenamento de backup.
12.3 Metas de RPO / RTO
| Configuração | RPO | RTO |
|---|---|---|
| Apenas Full diário | 24 h | 1–4 h |
| Full semanal + Diff diário | 24 h | 30 min–2 h |
| Full semanal + Diff diário + envio de log de 5 min | < 5 min | 1–3 h |
| Envio contínuo de log lógico (padrão) | < 1 min | 1–3 h |
| Envio contínuo de log lógico (interval=5) | < 5 s | 1–3 h |
| Secundário HDR + backup noturno | segundos | < 5 min (failover) |
| Recuperação instantânea (FUSE) | como o backup | < 60 s |
| Snapshot + envio de log lógico | < 30 s | 30 min–2 h |
12.4 Consumo de Memória
Configuração padrão: xbsa_buffer_count=8 × xbsa_block_size=64KiB × stripes=1 × parallel_dbspaces=# núcleos
| stripes | parallel_dbspaces | Teto de memória |
|---|---|---|
| 1 | 1 | 0,5 MB |
| 4 | 4 | 8 MB |
| 8 | 8 | 32 MB |
| 32 | 16 | 256 MB |
Consumo de disco no host FD: < 50 MB (FIFOs + sentinels + apenas manifest). Nenhum arquivo de staging é gravado.
13. Matriz de Compatibilidade
13.1 Matriz de Versão IDS × Recurso
| Recurso | IDS 12.10.FC12 | IDS 14.10 | IDS 15.0 |
|---|---|---|---|
mode=xbsa |
✅ | ✅ | ✅ |
mode=ontape |
✅ | ✅ | ✅ |
mode=onbar_psm |
✅ | ✅ | ✅ |
mode=logical_dbexport |
✅ | ✅ | ✅ |
mode=snapshot |
✅ | ✅ | ✅ |
| Envio contínuo de log lógico | ✅ | ✅ | ✅ |
| PITR (stop_at_lsn) | ✅ | ✅ | ✅ |
| Bootstrap HDR | ✅ | ✅ | ✅ |
| Bootstrap RSS | ✅ | ✅ | ✅ |
| ARD ransomware hook | ❌ (< 14.10) | ✅ | ✅ |
| Captura DBCRYPT | ✅ | ✅ | ✅ |
| Virtual Full | ✅ | ✅ | ✅ |
| Recuperação instantânea (FUSE) | ✅ | ✅ | ✅ |
13.2 SO × Disponibilidade de Pacote
| SO | RPM (el9) | DEB | Notas |
|---|---|---|---|
| Oracle Linux 9 | ✅ | — | Alvo GA principal |
| RHEL 9 / Rocky 9 / AlmaLinux 9 | ✅ | — | GA |
| RHEL 8 / Rocky 8 | ✅ | — | GA (RPM el9 compatível) |
| Ubuntu 22.04 LTS | — | ✅ | GA |
| Ubuntu 20.04 LTS | — | ✅ | GA |
| Debian 12 | — | ✅ | GA |
| Debian 11 | — | ✅ | GA |
| SLES 15 | ✅ | — | Via RPM el9 |
| AIX 7.2/7.3 | — | — | Roadmap v0.2.0 |
| Windows Server 2019/2022 | — | — | Roadmap v0.3.0 |
| Linux ARM64 | — | — | Roadmap v0.3.0 |
13.3 Compatibilidade com Bacula
| PodHeitor Backup | Suporte |
|---|---|
| 15.0.3 | ✅ Alvo GA principal |
| 15.0.x | ✅ |
| 14.x | ✅ (PTCOMM compatível) |
| < 14 | ⚠️ Não testado |
14. Guia de Dimensionamento
14.1 Requisitos Mínimos
| Componente | Mínimo | Notas |
|---|---|---|
| RAM do host FD | 1 GB | Pool de buffers XBSA nos padrões ≈ 0,5 MB |
| CPU do host FD | 2 núcleos | Compressão + 1 stream paralelo |
| Disco do host FD | 50 MB | Diretório de trabalho (FIFOs + apenas manifest) |
| Disco SO do host FD | — | Sem staging; nunca grava dados no disco local |
| Rede FD→SD | 100 Mbps | Funcional mínimo |
14.2 Dimensionamento Recomendado para Produção
| Ambiente IDS | RAM FD | CPU FD | Rede | stripes | parallel_dbspaces |
|---|---|---|---|---|---|
| Pequeno (< 100 GB, dbspace único) | 4 GB | 4 núcleos | 1 Gbps | 2 | 1 |
| Médio (100 GB–1 TB, 4–8 dbspaces) | 8 GB | 8 núcleos | 10 Gbps | 4 | 4 |
| Grande (1–10 TB, 10+ dbspaces) | 16 GB | 16 núcleos | 25 Gbps | 8 | 8 |
| VLDB (> 10 TB, muitos dbspaces) | 32 GB | 32 núcleos | 25+ Gbps | 16–32 | 16+ |
14.3 Dimensionamento do Bacula Storage Daemon
| Taxa de mudança diária | Pool de armazenamento | I/O disco SD | Notas |
|---|---|---|---|
| < 50 GB/dia | 4 TB em disco | SAS/SATA | Pools padrão |
| 50–500 GB/dia | 20 TB em disco | SSD recomendado | Habilitar compressão zstd no SD também |
| > 500 GB/dia | NAS/SAN ou fita | Alto throughput | Considerar plugin Bacula Dedup SD |
15. Integração com Bacularis
O Bacularis oferece uma interface web sobre o PodHeitor Backup. O plugin PodHeitor Informix inclui um bacularis/plugin-descriptor.json que:
- Adiciona “Informix” como tipo de recurso de cliente no assistente de backup do Bacularis
- Renderiza todos os 64 parâmetros de backup como campos de formulário com validação
- Exibe o navegador de restauração com visualização em árvore do namespace IDS-aware (
/@informix/) - Exibe os resultados de validação E2E inline
Para ativar o descriptor:
cp /opt/bacula/plugins/bacularis/plugin-descriptor.json
/var/www/bacularis/protected/Common/Modules/PluginConfig/podheitor-informix.json
systemctl restart bacularis
16. Migração do TSM/ISP e ON-Bar PSM
16.1 Migrando do IBM Spectrum Protect (TSM/ISP)
Consulte MIGRATION_FROM_TSM.md para o procedimento completo. Resumo:
- Instale PodHeitor Backup + PodHeitor no host IDS
- Execute backups paralelos (TSM + PodHeitor) por um ciclo completo de backup para validar
- Confirme a integridade da cadeia via archecker + manifest
- Defina
BAR_BSALIB_PATHpara apontar para a biblioteca PodHeitor (substitui a biblioteca TSM) - Desative o cliente TSM
Diferença principal: O BAR_BSALIB_PATH do TSM aponta para sua própria biblioteca. A biblioteca do PodHeitor é uma substituição direta — o ON-Bar não percebe a diferença.
16.2 Migrando de Scripts ON-Bar PSM
Consulte MIGRATION_FROM_PSM.md. Resumo:
- Identifique os valores atuais de
BAR_MAX_BACKUP,BAR_XFER_BUF_SIZEe janelas de backup - Crie um FileSet PodHeitor equivalente com
mode=onbar_psmcomo etapa de transição - Valide um ciclo completo de backup
- Mude para
mode=xbsa(padrão) para streaming direto - Remova scripts PSM e alocação de disco de staging
Economia de armazenamento ao remover o staging: O PSM grava em disco (arquivos .bak) antes de o Bacula buscá-los. O PodHeitor transmite diretamente, eliminando 1× conjunto de backup em espaço em disco.
17. Resolução de Problemas
17.1 Plugin Não Carregado
bacula-fd: error: plugin "podheitor-informix" not found
Causa: .so não está no diretório de plugins do Bacula. Solução: Verifique se /opt/bacula/plugins/podheitor-informix-fd.so existe; verifique se bacula-fd.conf tem Plugin Directory = /opt/bacula/plugins.
17.2 Falha no Carregamento da Biblioteca XBSA
[ERROR] BAR_BSALIB_PATH not set or library not found
Causa: BAR_BSALIB_PATH não está configurado em /etc/sysconfig/podheitor-informix. Solução:
echo "BAR_BSALIB_PATH=/opt/podheitor-informix/lib/libpodheitor_xbsa.so"
>> /etc/sysconfig/podheitor-informix
systemctl restart bacula-fd
17.3 ON-Bar Sai com Código Diferente de Zero
[ERROR] onbar exit code 45 — see /tmp/onbar_<jobid>.log
Causa: Erro do ON-Bar. Verifique o arquivo de log. Solução: Tipicamente: INFORMIXSERVER incorreto, IDS não está rodando, ou sysmaster.bar_action bloqueado.
cat /tmp/onbar_<jobid>.log
onstat -g ses # verificar sessões IDS ativas
17.4 Falha na Verificação de Integridade da Cadeia
[ABORT] Chain broken: L0 JobId=1234 not found in catalog (or SHA mismatch)
Causa: Job Differential/Incremental abortou porque o Full ou Diff precedente está ausente. Solução: Execute um novo backup Full. Se o Full existir e o SHA estiver errado, o volume de backup pode estar corrompido — investigue o dispositivo SD.
17.5 Lacuna no Envio Contínuo de Log Lógico
[WARN] Log gap detected: expected log unique_id=150, got 152
Causa: O arquivo de log lógico 151 nunca foi fechado (bug do IDS) ou já foi sobrescrito. Solução:
onbar -l -s # recuperar logs do disco
# OU definir salvage_logs=yes na configuração
17.6 Comandos de Diagnóstico
# Verificar status do IDS
onstat -
# Verificar histórico de backup ON-Bar
onstat -g bac
# Verificar status do log lógico
onstat -l
# Executar archecker manualmente no último backup
archecker -b -v -f /@informix/<UUID>/__ph_manifest.json
# Verificar runtime do plugin
journalctl -u bacula-fd -n 200 | grep -i podheitor
# Preflight dry-run
/opt/bacula/plugins/podheitor-informix-backend --dry-run
/opt/bacula/etc/podheitor-informix.conf
18. Roadmap
| Versão | Alvo | Principais Recursos |
|---|---|---|
| v0.1.0 GA | 2026-04-29 | Suporte completo Linux x86_64, todos os 22 cenários E2E APROVADOS |
| v0.2.0 | 2026 T3 | Suporte AIX 7.x (ppc64), provedor de snapshot NetApp ONTAP, compatibilidade OneDB 2.x |
| v0.3.0 | 2026 T4 | Windows Server FD, Linux ARM64, restauração ER multi-mesh |
| v0.4.0 | 2027 T1 | Descriptor de formulário de plugin Bacularis UI, FD sidecar Kubernetes |
| v0.5.0 | 2027 T2 | Replicação lógica de aplicação entre versões (12.10 → 14.10 streaming ao vivo) |
| v1.0.0 | 2027 T3 | Suporte completo de plataforma (Linux + AIX + Windows + ARM64) + Bacularis UI |
19. Evidências de Validação (Resultados E2E)
19.1 Ambiente de Laboratório
| Componente | Detalhes |
|---|---|
| Bacula Director | 192.168.15.105, Community 15.0.3, OL9 |
| IDS Primário (VM 186) | 192.168.15.130, ifxprod, IDS 15.0.1.0.3 Developer Edition em Docker |
| IDS Secundário HDR (VM 187) | 192.168.15.131, ifxhdr, IDS 15.0.1.0.3 |
| IDS Secundário RSS (VM 188) | 192.168.15.132, ifxrss, IDS 15.0.1.0.3 |
| Host Snapshot IDS (VM 189) | 192.168.15.133, ifxsnap, OL9 bare-metal + LVM VG com loop-backed (ifxvg) + FUSE3 |
19.2 Resultados E2E — 2026-04-29 (JobIds 6358–6379)
| ID | Cenário | JobId | Nível | Resultado |
|---|---|---|---|---|
| T01 | Backup Full do servidor completo | 6358 | Full | ✅ APROVADO |
| T02-F | Cadeia Full+Diff+Incr — Full | 6359 | Full | ✅ APROVADO |
| T02-D | Cadeia Full+Diff+Incr — Differential | 6360 | Differential | ✅ APROVADO |
| T02-I | Cadeia Full+Diff+Incr — Incremental | 6361 | Incremental | ✅ APROVADO |
| T03 | Restauração in-place (restore_object=yes) | 6362 | Full | ✅ APROVADO |
| T04 | Restauração para nova instância | 6363 | Full | ✅ APROVADO |
| T05-F | Cadeia PITR — baseline Full | 6364 | Full | ✅ APROVADO |
| T05-I | Cadeia PITR — Incremental (log-ship) | 6365 | Incremental | ✅ APROVADO |
| T06 | Dbspace único (apenas rootdbs) | 6366 | Full | ✅ APROVADO |
| T07 | Backup e extração em nível de tabela | 6367 | Full | ✅ APROVADO |
| T08 | Backup paralelo com 4 stripes | 6368 | Full | ✅ APROVADO |
| T09-F | Envio contínuo de log lógico — base | 6369 | Full | ✅ APROVADO |
| T09-I | Envio contínuo de log lógico — Incremental | 6370 | Incremental | ✅ APROVADO |
| T10 | Bootstrap de secundário HDR | 6371 | Full | ✅ APROVADO |
| T11 | Bootstrap de secundário RSS | 6372 | Full | ✅ APROVADO |
| T12 | Exportação lógica (mode=logical_dbexport) | 6373 | Full | ✅ APROVADO |
| T13 | Snapshot LVM (snapshot_vg=ifxvg) | 6374 | Full | ✅ APROVADO |
| T14 | Seeding HDR via transporte Bacula | 6375 | Full | ✅ APROVADO |
| T15 | Sidecar de metadados DBCRYPT | 6376 | Full | ✅ APROVADO |
| T16 | Fallback explícito ontape | 6377 | Full | ✅ APROVADO |
| T17 | Recuperação instantânea (loopdev+FUSE) | 6378 | Full | ✅ APROVADO |
| T18 | DR RestoreObject bare-metal | 6379 | Full | ✅ APROVADO |
APROVADO=22 / REPROVADO=0 / PULADO=0 / TOTAL=22 — 100% de aprovação
Contato e Licenciamento
Licenciamento
PodHeitor Informix é 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
Plugin PodHeitor de Backup, Replicação e Conversão Informix para Bacula — v0.1.0 GA © 2026 Heitor Faria. Todos os direitos reservados.
Disponível em:
Português
English (Inglês)
Español (Espanhol)