Whitepaper técnico — PodHeitor MSSQL para Bacula

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:

  1. Consulta a topologia AG via sys.dm_hadr_availability_replica_states.
  2. Seleciona um readable secondary (offload do primary).
  3. Se o secondary escolhido falhar/rebalancear durante o backup, re-tenta automaticamente em outro replica até ag_failover_retry=3 tentativas.
  4. Topologia é capturada em __ph_cluster__/ag_topology.json para 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=&#x3C;list&#x3E;
SSRS (Reporting Services) Backup do ReportServer DB + encryption keys include_ssrs=&#x3C;host:port&#x3E;
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=&#x3C;file&#x3E; 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-&#x3C;LSN&#x3E;.trn      ← Transaction log
│   │   ├── layout.dat         ← DB layout RestoreObject
│   │   └── data.stripe-N.bak  ← Quando stripes &#x3E; 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=64 em DB pequeno. O overhead de coordenação supera o ganho; em DBs < 50 GB use stripes=4 ou menos.
  • Não combine tail_log_before=yes com drop_existing=yes distraído. A ordem importa: tail-log captura ANTES do drop, mas drop_existing=only_if_match é mais seguro em prod.
  • Não use compress=none em 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: pt-brPortuguêsenEnglish (Inglês)esEspañol (Espanhol)

Deixe um comentário