VDI no Windows, TDS/FIFO no Linux, BACKUP TO URL para Azure SQL MI, striped parallel I/O até 64-way, três modos nativos de replicação (log shipping / AG bootstrap / fanout), instant recovery e cobertura SSAS/SSRS/SSIS.
Documento técnico complementar à página do plugin PodHeitor MSSQL.
1. Problema: o plugin Bacula Enterprise MSSQL é Windows-only e único-stripe
O plugin MSSQL do Bacula Enterprise existe, mas:
- Apenas Windows com VDI — sem cobertura SQL Server on Linux (oficialmente suportado pela Microsoft desde 2017).
- Sem striped parallel I/O — VLDBs de 1 TB+ sofrem com single-stream throughput.
- Sem awareness Always On AG além do básico — sem auto-seleção de readable secondary, sem reseed AG.
- Sem replicação nativa — log shipping, AG bootstrap e fanout 1→N exigem scripting externo.
- Sem instant recovery, single-item restore, ou cobertura SSAS/SSRS/SSIS.
O PodHeitor MSSQL Plugin entrega tudo isso e mantém compatibilidade drop-in com o namespace Bacula Enterprise mssql-fd — zero rewrites de FileSets em migração.
2. Modelo arquitetural
Padrão PodHeitor: cdylib FD + backend standalone, comunicação PTCOMM. Em Windows o cdylib é DLL (podheitor-mssql-fd.dll); em Linux é .so.
v2.0.0 (maio 2026): o cdylib é construído como cdylib Rust pura a partir do workspace PodHeitor Rust cdylib/crates/plugin-mssql/. Nenhum source AGPLv3 do Bacula é vinculado estaticamente em nenhum lugar do build — o plugin é fully proprietary (LicenseRef-PodHeitor-Proprietary). O shim metaplugin C/C++ v1.0.0 foi arquivado em releases/v1.0.0/src/ apenas como referência histórica, não é mais buildado.
3. Engines selecionáveis via mode=
| Mode | Plataforma | Função |
|---|---|---|
auto (default) |
— | Detecta plataforma; prefere VDI no Windows, TDS/FIFO no Linux |
vdi |
Windows | Virtual Device Interface — API oficial Microsoft, in-memory pipe |
tds_fifo |
Linux/Windows | BACKUP DATABASE TO DISK = ‘<FIFO>’ via TDS, FIFO mkfifo lê stream |
tds_url |
— | BACKUP TO URL para Azure Blob (Azure SQL Managed Instance) |
snapshot |
Windows | VSS Snapshot |
replicate_log_shipping |
— | Replicação via log shipping nativo |
replicate_ag_bootstrap |
— | Bootstrap de Always On AG secondary |
replicate_fanout |
— | Replicação 1→N regiões |
4. Striped parallel I/O
BACKUP DATABASE ... TO DISK = '...stripe-1', DISK = '...stripe-2', ... é a feature SQL Server para multi-target. Bacula Enterprise não a expõe; PodHeitor sim, via parâmetro stripes=N (1–64). Em VLDB de 1 TB com stripes=8, throughput observado é ~4× single-stream. Combine com buffercount=32 e maxtransfersize=4194304 (4 MiB) para saturar I/O do storage.
Plugin = "podheitor-mssql: database=warehouse stripes=8 parallel_dbs=2
compress=native+zstd buffercount=32 maxtransfersize=4194304"
5. Always On AG awareness
Com ag_preference=readable_secondary, o plugin:
- Consulta a topologia AG via
sys.dm_hadr_availability_replica_states. - Seleciona um readable secondary (offload do primary).
- Se o secondary escolhido falhar/rebalancear durante o backup, re-tenta automaticamente em outro replica até
ag_failover_retry=3tentativas. - Topologia é capturada em
__ph_cluster__/ag_topology.jsonpara AG reseed pós-restore.
Outras opções: auto, primary, secondary, readable_secondary.
6. Instant Recovery + Single-Item Restore
| Restore mode | Função |
|---|---|
instant |
DB queryable em minutos enquanto o restore continua em background |
in_place |
Restore over-write no DB original |
new_db |
Restore com novo nome (rename via database=) |
to_disk |
Restore para arquivo .bak (não importa para SQL Server) |
single_item |
Extração de tabela/row via instância sandbox efêmera |
ag_reseed |
Reseed de AG secondary a partir do backup |
single_item spawna uma instância SQL Server sandbox temporária, restaura o DB lá, executa SELECT ou BCP OUT para extrair as linhas pedidas, e descarta a sandbox. Útil quando “preciso da tabela Orders de ontem” não vale o downtime de restore in-place.
7. PITR (Point-in-Time Recovery)
| Parâmetro | Default | Função |
|---|---|---|
stop_at |
— | Datetime PITR (ex.: 2026-04-25 15:30:00) |
stop_at_mark |
— | Log mark PITR |
tail_log_before |
no | Captura tail-log automaticamente antes de derrubar o DB existente |
file_relocation_map |
— | JSON com mapping de paths para restore cross-instance |
tde_restore_cert |
— | Bundle de TDE cert para cross-server |
recovery |
Yes | WITH RECOVERY (final) vs NORECOVERY (chain) |
8. Cobertura BI server
| Servidor | Mecanismo | Parâmetro |
|---|---|---|
| SSAS (Analysis Services) | XMLA backup nativo | include_ssas=<list> |
| SSRS (Reporting Services) | Backup do ReportServer DB + encryption keys | include_ssrs=<host:port> |
| SSIS (Integration Services) | Backup do SSISDB | include_ssis=yes |
9. TDE-aware restore cross-server
TDE (Transparent Data Encryption) precisa do cert master + DPAPI da instância para abrir um DB criptografado. Sem isso, restore cross-server falha com Cannot find server certificate with thumbprint. O PodHeitor com tde_capture=yes exporta o cert + private key (criptografada com password operacional) durante backup; no restore, tde_restore_cert=<file> reinstala o cert antes do restore do DB. Isso destrava restore cross-instance / cross-region sem intervenção manual.
10. Validação GA — v1.0.0
| Métrica | Resultado |
|---|---|
| E2E test suite (T01–T13, 16 tests) | 16 / 16 PASS (3 runs consecutivos) |
| OL9 cargo test | 311 passed, 0 failed |
| Win2025 cargo test | 381 passed, 0 failed |
| SQL Server testado | SQL Server 2022 em Windows Server 2025 |
| AG configuration | 2-node, CLUSTER_TYPE=NONE, SYNCHRONOUS_COMMIT |
| Bacula version | Community 15.0.3 |
| Pacotes | RPM v1.0.0 (OL9) + Win64 zip v1.0.0 |
11. Plataformas suportadas
| OS | Arch | Status |
|---|---|---|
| Windows Server 2012 R2 – 2025 | x86_64 | GA |
| Oracle Linux 9, RHEL 8/9, Rocky/Alma 8/9 | x86_64 | GA |
| Ubuntu 20.04 / 22.04 / 24.04 | x86_64 | GA |
| Debian 11 / 12 | x86_64 | GA |
| Linux ARM64 | aarch64 | Roadmap v1.1 |
| SQL Server | Windows | Linux | Notas |
|---|---|---|---|
| 2012, 2014 | VDI | — | Apenas Windows |
| 2016, 2017 | VDI | TDS/FIFO | — |
| 2019, 2022 | Todos modos | TDS/FIFO | — |
| Azure SQL MI | — | tds_url | BACKUP TO URL |
12. Drop-in Enterprise migration
O namespace Bacula é idêntico ao do mssql-fd.dll Bacula Enterprise:
@mssql/
├── MSSQLSERVER/
│ ├── AdventureWorks/
│ │ ├── data.bak ← Full backup
│ │ ├── data.diff.bak ← Differential
│ │ ├── log-<LSN>.trn ← Transaction log
│ │ ├── layout.dat ← DB layout RestoreObject
│ │ └── data.stripe-N.bak ← Quando stripes > 1
│ └── __ph_instance__/ ← PodHeitor extras (logins, jobs, config)
└── __ph_cluster__/
└── ag_topology.json
Migração de Enterprise para PodHeitor não exige rewrite de FileSets ou jobs Bacula Director — apenas troca do binário.
13. Anti-patterns documentados
- Não rode
stripes=64em DB pequeno. O overhead de coordenação supera o ganho; em DBs < 50 GB usestripes=4ou menos. - Não combine
tail_log_before=yescomdrop_existing=yesdistraído. A ordem importa: tail-log captura ANTES do drop, masdrop_existing=only_if_matché mais seguro em prod. - Não use
compress=noneem redes WAN. Compression nativa SQL Server + zstd reduz dramaticamente bytes-on-wire; o overhead de CPU vale a pena. - Não rode TDS/FIFO no Windows quando VDI está disponível. VDI é a API oficial Microsoft com melhor throughput e integração VSS; TDS/FIFO existe como fallback Linux.
14. License posture
Plugin sob LicenseRef-PodHeitor-Proprietary. Nenhum source AGPLv3 do Bacula é vinculado estaticamente em nenhum lugar do build v2.0.0+. O cdylib é construído a partir do crate puro PodHeitor plugin-mssql.
Pronto para avaliar?
Trial gratuito de 30 dias para frotas SQL Server (Windows + Linux + Azure SQL MI) em produção. Garantimos no mínimo 50% de desconto vs Bacula Enterprise, Veeam ou Commvault, com mais funcionalidades inclusas (3 modos nativos de replicação, instant recovery, single-item restore, cobertura SSAS/SSRS/SSIS).
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página do plugin PodHeitor MSSQL
Disponível em:
Português
English (Inglês)
Español (Espanhol)