Backup lógico paralelo, físico hot vía xtrabackup/mariabackup con cadena LSN incremental, MySQL 8.0.17+ CLONE INSTANCE agent-less, transportable tablespaces y provisioning DR de réplica nativo.
Documento técnico complementario a la página del plugin PodHeitor MySQL.
1. ¿Por qué no el plugin Bacula Enterprise MySQL?
El plugin Enterprise es Perl glue propietario alrededor de mysqldump / xtrabackup. Funciona, pero:
- Requiere Perl runtime en cada host FD.
- Jobs secuenciales per-database (sin paralelismo dentro de un job).
- Documentadamente incompatible con la encriptación AES de volumen de Bacula al usar
xtrabackup --prepare. - Sin provisioning DR de réplica, sin automatización TDE, sin CDP sidecar.
- Closed source — no puedes auditar ni parchear lo que protege tu DB.
- Pricing para budgets Fortune-500.
PodHeitor entrega el mismo feature set — y más — como un único binario Rust musl static-pie de ~540 KB, sin Perl, sin Python runtime.
2. Modelo arquitectural
Patrón PodHeitor: cdylib FD podheitor-mysql-fd.so (Rust puro, sin source AGPLv3 de Bacula linkeado) + backend standalone, comunicación PTCOMM en stdin/stdout.
Desde v2.0.0, el cdylib se construye desde ../PodHeitor Rust cdylib/crates/plugin-mysql/. Ningún source AGPLv3 de Bacula, headers, ni object files se vinculan estáticamente. El shim C++ legacy fue removido.
3. Modos de backup
| Mode | Función | Engine usada |
|---|---|---|
dump |
Logical dump per-DB con paralelismo (parallel_dbs) |
mysqldump / mariadb-dump |
xtrabackup |
Physical hot backup con cadena LSN incremental | xtrabackup (Percona) |
mariabackup |
Physical hot backup MariaDB | mariabackup |
clone |
MySQL 8.0.17+ CLONE INSTANCE agent-less |
SQL nativo |
replicate |
Provisioning DR — restore + setup automático de réplica | SQL + CHANGE REPLICATION SOURCE |
4. Topology awareness y safety gates
El plugin auto-detecta la topología MySQL y aplica safety gates configurables:
| Topología detectada | Detección | Comportamiento |
|---|---|---|
| Standalone | — | Backup directo |
| Async-Replica | SHOW REPLICA STATUS |
Backup del replica (offload del primary) |
| Group Replication | performance_schema.replication_group_members |
Backup de miembro secundario; verifica lag |
| Galera | wsrep_local_state |
Auto-desync donor con RAII guard |
4.1 require_replica=true — safety gate
Bacula stock + xtrabackup típicamente hace backup del primary (porque es el nodo «default»). En una flota MySQL seria, eso es exactamente lo que no quieres — el primary ya está ocupado sirviendo writes. Setear require_replica=true hace que el plugin rechace el backup si el nodo conectado es primary. Combina con max_replica_lag=60 para evitar backup de réplicas atrasadas.
4.2 Galera donor RAII guard
En Galera, un nodo sacado para backup debe ser desincronizado del cluster (SET GLOBAL wsrep_desync=ON) para evitar que flow control afecte al cluster entero. El plugin lo hace con guard RAII: el flag es seteado antes del backup y garantizadamente removido incluso en panic/crash del backend, vía Drop trait.
5. Provisioning DR de réplica (modo replicate)
Validado en producción (JobId 3592). En el restore al host DR, el plugin ejecuta automáticamente:
STOP REPLICA;
RESET REPLICA ALL;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.15.131',
SOURCE_PORT=3306,
SOURCE_USER='repl_user',
SOURCE_PASSWORD='<from repl_password_file>',
SOURCE_AUTO_POSITION=1;
START REPLICA;
Después verifica que ambas threads (Replica_IO_Running y Replica_SQL_Running) estén healthy antes de retornar success. Sin esto, «DR» significa restaurar el dump y operacionalmente recordar de configurar replicación — frecuentemente olvidado hasta el próximo incidente.
6. Features adicionales
| Feature | Status |
|---|---|
Transportable tablespaces — single-table restore vía IMPORT TABLESPACE |
Production |
| TDE keyring export + re-install on restore | Production |
CDP binlog streamer sidecar — mysqlbinlog --stop-never --raw + systemd unit |
Production |
| Prometheus textfile-collector metrics | Production |
Post-restore verify (basic/checksum/deep) |
Production |
| Streaming PTCOMM — cero staging area, compatibilidad con encryption nativa Bacula | Production |
El documento docs/ENTERPRISE_PARITY.md mapea 48 de 48 features del Bacula Enterprise MySQL Plugin 18.2.3 que están atendidas o superadas.
7. Matriz de soporte validada
| Engine | Versiones | Mode coverage |
|---|---|---|
| MySQL Community / Enterprise | 5.7 EOL · 8.0 ≥ 8.0.17 · 8.4 LTS | dump, xtrabackup, clone, replicate |
| Percona Server | 8.0.x | dump, xtrabackup, clone, replicate (+ TDE keyring) |
| MariaDB | 10.5 · 10.6 LTS · 10.11 LTS · 11.4 LTS | dump, mariabackup, replicate |
OS: Oracle Linux 9 / RHEL 9 / Rocky 9 / AlmaLinux 9, EL8 (rebuild), Debian 12, Ubuntu 22.04/24.04. Bacula: Community 15.0.3.
8. Anti-patterns documentados
- No combines la encriptación AES de volumen Bacula con
xtrabackup --preparesin probar restore end-to-end. La documentación Enterprise reconoce la incompatibilidad; PodHeitor sintetiza el prepare durante el restore para evitar este modo problemático. - No corras
require_replica=falseen producción sin entender que esto permite backup del primary — puede ser intencional, pero es la fuente más común de «el backup se puso lento y borró mi p99 latency». - No confíes en
parallel_dbsalto sin ajustar I/O del host. 4 dumps paralelos de DBs grandes saturan disco antes que CPU. Comienza en 4, monitoreaiostat.
9. Postura de licencia
Plugin bajo LicenseRef-PodHeitor-Proprietary. Source AGPLv3 de Bacula no se vincula estáticamente desde v2.0.0. El shim C++ legacy src/podheitor-mysql-fd.{c,h} fue removido. Bindings vía crate bacula-fd-abi independiente.
¿Listo para evaluar?
Trial comercial de 30 días para flotas MySQL/MariaDB/Percona en producción. Garantizamos al menos 50% de descuento vs Bacula Enterprise, Veeam o Commvault, con más funcionalidades incluidas.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página del plugin PodHeitor MySQL
Disponível em:
Português (Portugués, Brasil)
English (Inglés)
Español