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:
- Consulta la topología AG vía
sys.dm_hadr_availability_replica_states. - Selecciona un readable secondary (offload del primary).
- Si el secondary elegido falla/rebalancea durante el backup, reintenta automáticamente en otro replica hasta
ag_failover_retry=3intentos. - La topología es capturada en
__ph_cluster__/ag_topology.jsonpara 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=<list> |
| SSRS (Reporting Services) | Backup del ReportServer DB + encryption keys | include_ssrs=<host:port> |
| 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=<file> 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-<LSN>.trn ← Transaction log
│ │ ├── layout.dat ← DB layout RestoreObject
│ │ └── data.stripe-N.bak ← Cuando stripes > 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=64en DB pequeño. El overhead de coordinación supera la ganancia; en DBs < 50 GB usastripes=4o menos. - No combines
tail_log_before=yescon undrop_existing=yesdistraído. El orden importa: tail-log captura ANTES del drop, perodrop_existing=only_if_matches más seguro en prod. - No uses
compress=noneen 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:
Português (Portugués, Brasil)
English (Inglés)
Español