Plugin commercial-grade Rust para Firebird 3/4/5 sobre Bacula Community 15.0.3+, fechando uma lacuna real: Bacula Enterprise não ships um plugin Firebird. Três modos (gbak dump, nbackup chain L0..LN, FB ≥4 replication-log shipping), cross-version migration, FB 5 parallel workers (gbak -par), encryption-at-rest passthrough.
Documento técnico complementar à página do plugin PodHeitor Firebird.
1. O white space — Firebird sem plugin nativo
Bacula Enterprise 18.2.3 ships plugins para PostgreSQL e MySQL, mas não ships um plugin Firebird. Em mercados como Brasil/LatAm, isso é uma lacuna concreta: Firebird ainda domina ERPs legacy (TOTVS Protheus, sistemas de gestão pública), EMR/HIS, e aplicações embedded. Sem plugin, o caminho de backup atual é:
gbakad-hoc para arquivo + Bacula backup do arquivo (duas etapas, sem coordenação).nbackupmanual sem chain management — o Bacula não sabe correlacionar levels.- FS-level snapshot do
.fdb(corre risco de DB inconsistente se o lock file não for respeitado).
O PodHeitor Firebird Plugin é o primeiro plugin nativo, e o único na família PodHeitor que cobre o gap completamente — três modos cobrindo todos os tradeoffs de janela vs granularidade vs RPO.
2. Arquitetura — cdylib + standalone backend, padrão PodHeitor
┌──────────────────────────────────────────────────────────────┐
│ Bacula File Daemon (FD) — bacula-fd 15.0.3+ │
│ loads /opt/bacula/plugins/podheitor-firebird-fd.so │
│ (Rust cdylib, ~600 KB) │
└──────────────────────────────┬───────────────────────────────┘
│ fork+exec (PTCOMM via stdin/stdout)
▼
┌──────────────────────────────────────────────────────────────┐
│ /opt/bacula/bin/podheitor-firebird-backend (Rust binary) │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ DumpEngine │ │ NbackupEngine │ │
│ │ (gbak, FB5 -par) │ │ (chain L0..LN) │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ ReplayEngine │ │ RestoreEngine │ │
│ │ (FB4 log shipping) │ │ (in-place chain) │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ FirebirdAdapter — services API + libfbclient │ │
│ │ Local: spawn gbak/nbackup Remote: TCP │ │
│ └─────────────────────────────────────────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Parallel │ │ Compress │ │ Throttle / │ │
│ │ Executor │ │ (zstd…) │ │ BW shaper │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────────────┘
Mesmo padrão dos plugins podheitor-postgresql / podheitor-mssql / podheitor-oracle: cdylib Rust dlopen-ado pelo bacula-fd, fork+exec do backend standalone, comunicação PTCOMM (length-tagged framing em stdin/stdout). Crash isolation; AGPLv3 license firewall; nenhum source do Bacula vinculado estaticamente.
3. Três modos — mapeamento natural ao Firebird
| Mode | Quando escolher | Mecânica |
|---|---|---|
dump |
DB ≤ 50 GB; granularidade de tabela desejada; cross-version migration | gbak -b streaming; FB 5 com gbak -par N (parallel workers nativos) |
nbackup |
DB ≥ 50 GB; janela de backup curta | Chain L0..LN page-level; restore in-place (zero staging) |
replay |
RPO ≈ minutos; multi-site DR; FB ≥4 | Replication log shipping nativo do FB ≥4 (substrate de CDP) |
3.1 Mapping para Bacula levels
| Mode | Bacula Full | Bacula Incremental | Bacula Differential | Footprint |
|---|---|---|---|---|
dump |
gbak -b streaming |
sempre Full | sempre Full | zero staging |
nbackup |
nbackup -B 0 (L0) |
nbackup -B N (vs último Incr) |
nbackup -B 1 (delta vs L0) |
só delta cruza o link |
replay |
gbak -b baseline + start log shipping |
continuous log archive | snapshot + new log baseline | log queue em disco |
4. Versões Firebird suportadas
| Firebird | Status | Features notáveis |
|---|---|---|
| 2.5 | Out of scope | (gbak-only, sem nbackup chain N>1, sem replication — forçaria fallback throughout) |
| 3.0 | Full support | nbackup chain L0..LN, encryption-at-rest, SuperServer threading |
| 4.0 | Full support + mode=replay |
Native replication log (substrate CDP), gbak -se services-mode |
| 5.0 | Full support + parallel backup | gbak -par N parallel workers, profiler API, faster nbackup |
4.1 Detecção de versão
- Probe via
isql -z -q -i /dev/null(imprime version line) ougbak -z. - Connect-time: query
MON$DATABASE.MON$SERVER_VERSION. - Auto-enable
gbak -parquando FB ≥5 detectado. - Auto-enable
mode=replayapenas quando FB ≥4 detectado. - Recusa start em FB ≤2.x com mensagem clara apontando à matrix.
5. Architecture awareness — SuperServer / Classic / SuperClassic
Firebird tem três architectures distintas com características operacionais opostas:
| Arch | Modelo | Implicação para backup |
|---|---|---|
| SuperServer | Single multi-threaded process, shared cache | Default desde FB 3; mais throughput de backup que Classic |
| Classic | Process por connection | Pool exhaustion é real; o plugin throttle-a |
| SuperClassic | Multi-threaded, per-attachment cache | Misto; o plugin trata como SuperServer |
Detecção via MON$ATTACHMENTS.MON$SERVER_PID cardinality + firebird.conf::ServerMode. Em Classic, o plugin auto-throttle conexões para evitar exhaustar o connection pool em DBs com muitos clients ativos.
6. Cross-version migration
O plugin suporta upgrade ODS (On-Disk Structure) durante restore: backup feito em FB 3 pode ser restaurado em FB 4 ou FB 5. Caminho típico:
- Backup
mode=dumpem FB 3 (ODS 12.0). - Cliente migra para FB 5 (ODS 13.1).
- Restore
mode=dumpaponta para servidor FB 5. gbak -rreconhece a ODS source e upgrade-a in-flight.
Não suportado: downgrade (FB 5 → FB 3 perderia features).
7. Embedded Firebird — backup sem servidor rodando
Para aplicações que usam Firebird embedded (single-file .fdb, sem daemon Firebird rodando), mode=dump com embedded=true usa libfbembed para abrir o arquivo direto. Caso de uso típico: aplicações desktop, ERPs de pequeno porte, dispositivos embarcados.
8. Verificação de integridade
O backend roda gfix -v antes e depois de cada backup, e smoke-query a RDB$RELATIONS. Em DBs corruptos, o gfix -v reporta páginas inconsistentes — o plugin marca o job como “warning” no Bacula (não fatal), gera relatório, e segue.
9. Observabilidade — Prometheus opcional
Sidecar Prometheus expõe métricas:
firebird_backup_duration_seconds{mode, db}firebird_backup_bytes_total{mode, db}firebird_nbackup_chain_depth{db}(gauge — alerte se > 30)firebird_replay_lag_seconds{db}(gauge — RPO observado)firebird_gfix_warnings_total{db}
10. Anti-patterns documentados
- Não rode
mode=nbackupem DB < 50 GB. O overhead de chain management (lock file, level tracking) supera o ganho. Usedump. - Não deixe a chain nbackup ficar profunda demais. Restore in-place precisa replay todos os levels. Faça Full (L0) novo a cada N=7-14 dias.
- Não rode
mode=replayem FB 3. Replication log é FB ≥4. O plugin recusa em runtime. - Não rode parallel workers (
gbak -par) em hardware sem cores ociosos. O FB 5 parallel acelera proporcional a CPU livre; saturar CPU degrada DB live ops. - Não confunda crash-consistent com application-consistent. FS snapshot do
.fdbé crash-consistent — válido mas pode exigirgfix -vno restore. Para application-consistent, use os modes dump/nbackup comgbak/nbackupque falam com o engine.
11. License posture
Plugin distribui sob LicenseRef-PodHeitor-Proprietary. O cdylib runtime declara license = "Bacula AGPLv3" apenas para satisfazer o gate ABI do FD loader; nenhum source do Bacula é vinculado estaticamente. Backend é binário Rust standalone, não toca ABI do Bacula.
Pronto para avaliar?
Trial gratuito de 30 dias para servidores Firebird 3/4/5. Garantimos no mínimo 50% de desconto vs alternativas comerciais (Bacula Enterprise não cobre Firebird, Veeam não cobre Firebird, Commvault tem suporte limitado). Suporte exclusivo para o ecossistema Firebird brasileiro.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página do plugin PodHeitor Firebird
Disponível em:
Português
English (Inglês)
Español (Espanhol)