Whitepaper técnico — PodHeitor MSSQL para Bacula

VDI en Windows, TDS/FIFO en Linux, BACKUP TO URL para Azure SQL MI, striped parallel I/O hasta 64-way, tres modos nativos de replicación (log shipping / AG bootstrap / fanout), instant recovery y cobertura SSAS/SSRS/SSIS.

Documento técnico complementario a la página del plugin PodHeitor MSSQL.

1. Problema: el plugin Bacula Enterprise MSSQL es Windows-only y single-stripe

El plugin MSSQL de Bacula Enterprise existe, pero:

  • Sólo Windows con VDI — sin cobertura SQL Server on Linux (oficialmente soportado por Microsoft desde 2017).
  • Sin striped parallel I/O — VLDBs de 1 TB+ sufren con throughput single-stream.
  • Sin awareness Always On AG más allá de lo básico — sin auto-selección de readable secondary, sin reseed AG.
  • Sin replicación nativa — log shipping, AG bootstrap y fanout 1→N requieren scripting externo.
  • Sin instant recovery, single-item restore, o cobertura SSAS/SSRS/SSIS.

El PodHeitor MSSQL Plugin entrega todo esto y mantiene compatibilidad drop-in con el namespace Bacula Enterprise mssql-fd — cero rewrites de FileSets en migración.

2. Modelo arquitectural

Patrón PodHeitor: cdylib FD + backend standalone, comunicación PTCOMM. En Windows el cdylib es DLL (podheitor-mssql-fd.dll); en Linux es .so.

v2.0.0 (mayo 2026): el cdylib se construye como cdylib Rust pura desde el workspace PodHeitor Rust cdylib/crates/plugin-mssql/. Ningún source AGPLv3 de Bacula se vincula estáticamente en ninguna parte del build — el plugin es fully proprietary (LicenseRef-PodHeitor-Proprietary). El shim metaplugin C/C++ v1.0.0 fue archivado en releases/v1.0.0/src/ sólo como referencia histórica, ya no se buildea.

3. Engines seleccionables vía mode=

Mode Plataforma Función
auto (default) Detecta plataforma; prefiere VDI en Windows, TDS/FIFO en Linux
vdi Windows Virtual Device Interface — API oficial Microsoft, in-memory pipe
tds_fifo Linux/Windows BACKUP DATABASE TO DISK = ‘<FIFO>’ vía TDS, FIFO mkfifo lee el stream
tds_url BACKUP TO URL a Azure Blob (Azure SQL Managed Instance)
snapshot Windows VSS Snapshot
replicate_log_shipping Replicación vía log shipping nativo
replicate_ag_bootstrap Bootstrap de Always On AG secondary
replicate_fanout Replicación 1→N regiones

4. Striped parallel I/O

BACKUP DATABASE ... TO DISK = '...stripe-1', DISK = '...stripe-2', ... es la feature SQL Server para multi-target. Bacula Enterprise no la expone; PodHeitor sí, vía el parámetro stripes=N (1–64). En VLDB de 1 TB con stripes=8, throughput observado es ~4× single-stream. Combina con buffercount=32 y maxtransfersize=4194304 (4 MiB) para saturar I/O del storage.

Plugin = "podheitor-mssql: database=warehouse stripes=8 parallel_dbs=2 
          compress=native+zstd buffercount=32 maxtransfersize=4194304"

5. Always On AG awareness

Con ag_preference=readable_secondary, el plugin:

  1. Consulta la topología AG vía sys.dm_hadr_availability_replica_states.
  2. Selecciona un readable secondary (offload del primary).
  3. Si el secondary elegido falla/rebalancea durante el backup, reintenta automáticamente en otro replica hasta ag_failover_retry=3 intentos.
  4. La topología es capturada en __ph_cluster__/ag_topology.json para AG reseed post-restore.

Otras opciones: auto, primary, secondary, readable_secondary.

6. Instant Recovery + Single-Item Restore

Restore mode Función
instant DB queryable en minutos mientras el restore continúa en background
in_place Restore over-write en el DB original
new_db Restore con nuevo nombre (rename vía database=)
to_disk Restore a archivo .bak (sin import a SQL Server)
single_item Extracción de tabla/row vía instancia sandbox efímera
ag_reseed Reseed de AG secondary desde el backup

single_item spawnea una instancia SQL Server sandbox temporal, restaura el DB ahí, ejecuta SELECT o BCP OUT para extraer las filas pedidas, y descarta la sandbox. Útil cuando «necesito la tabla Orders de ayer» no vale el downtime de restore in-place.

7. PITR (Point-in-Time Recovery)

Parámetro Default Función
stop_at Datetime PITR (ej.: 2026-04-25 15:30:00)
stop_at_mark Log mark PITR
tail_log_before no Captura tail-log automáticamente antes de tear-down del DB existente
file_relocation_map JSON con 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 del ReportServer DB + encryption keys include_ssrs=&#x3C;host:port&#x3E;
SSIS (Integration Services) Backup del SSISDB include_ssis=yes

9. Restore TDE-aware cross-server

TDE (Transparent Data Encryption) necesita el cert master + DPAPI de la instancia para abrir un DB encriptado. Sin esto, restore cross-server falla con Cannot find server certificate with thumbprint. El PodHeitor con tde_capture=yes exporta el cert + private key (encriptada con password operacional) durante el backup; en el restore, tde_restore_cert=&#x3C;file&#x3E; reinstala el cert antes del restore del DB. Esto destraba restore cross-instance / cross-region sin intervención manual.

10. Validación 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 probado SQL Server 2022 en Windows Server 2025
AG configuration 2-node, CLUSTER_TYPE=NONE, SYNCHRONOUS_COMMIT
Bacula version Community 15.0.3
Paquetes RPM v1.0.0 (OL9) + Win64 zip v1.0.0

11. Plataformas soportadas

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 Sólo Windows
2016, 2017 VDI TDS/FIFO
2019, 2022 Todos los modos TDS/FIFO
Azure SQL MI tds_url BACKUP TO URL

12. Drop-in Enterprise migration

El namespace Bacula es idéntico al del mssql-fd.dll de 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  ← Cuando stripes &#x3E; 1
│   └── __ph_instance__/       ← PodHeitor extras (logins, jobs, config)
└── __ph_cluster__/
    └── ag_topology.json

Migrar de Enterprise a PodHeitor no requiere reescribir FileSets ni jobs Bacula Director — sólo intercambiar el binario.

13. Anti-patterns documentados

  • No corras stripes=64 en DB pequeño. El overhead de coordinación supera la ganancia; en DBs < 50 GB usa stripes=4 o menos.
  • No combines tail_log_before=yes con un drop_existing=yes distraído. El orden importa: tail-log captura ANTES del drop, pero drop_existing=only_if_match es más seguro en prod.
  • No uses compress=none en redes WAN. Compression nativa SQL Server + zstd reduce dramáticamente bytes-on-wire; el overhead de CPU vale la pena.
  • No corras TDS/FIFO en Windows cuando VDI está disponible. VDI es la API oficial Microsoft con mejor throughput e integración VSS; TDS/FIFO existe como fallback Linux.

14. Postura de licencia

Plugin bajo LicenseRef-PodHeitor-Proprietary. Ningún source AGPLv3 de Bacula se vincula estáticamente en ninguna parte del build v2.0.0+. El cdylib se construye desde el crate puro PodHeitor plugin-mssql.

¿Listo para evaluar?

Trial gratuito de 30 días para flotas SQL Server (Windows + Linux + Azure SQL MI) en producción. Garantizamos al menos 50% de descuento vs Bacula Enterprise, Veeam o Commvault, con más funcionalidades incluidas (3 modos nativos de replicación, 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 del plugin PodHeitor MSSQL

Disponível em: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta