Backup lógico paralelo, físico hot via xtrabackup/mariabackup com cadeia LSN incremental, MySQL 8.0.17+ CLONE INSTANCE agent-less, transportable tablespaces e provisioning DR de réplica nativo.
Documento técnico complementar à página do plugin PodHeitor MySQL.
1. Por que não o Bacula Enterprise MySQL plugin?
O Enterprise plugin é Perl glue proprietário em volta de mysqldump / xtrabackup. Funciona, mas:
- Requer Perl runtime em cada host FD.
- Jobs sequenciais per-database (sem paralelismo dentro de um job).
- Documentadamente incompatível com a criptografia AES de volume Bacula quando se usa
xtrabackup --prepare. - Sem provisioning DR de réplica, sem automação TDE, sem CDP sidecar.
- Closed source — você não pode auditar nem patchar o que protege seu DB.
- Pricing para budgets Fortune-500.
O PodHeitor entrega o mesmo feature set — e mais — como um único binário Rust musl static-pie de ~540 KB, sem Perl, sem Python runtime.
2. Modelo arquitetural
Padrão PodHeitor: cdylib FD podheitor-mysql-fd.so (Rust puro, sem source AGPLv3 do Bacula linkado) + backend standalone, comunicação PTCOMM em stdin/stdout.
Desde v2.0.0, o cdylib é construído a partir de ../PodHeitor Rust cdylib/crates/plugin-mysql/. Nenhum source AGPLv3 do Bacula, headers, ou object files são vinculados estaticamente. O shim C++ legacy foi removido.
3. Modos de backup
| Mode | Função | Engine usada |
|---|---|---|
dump |
Logical dump per-DB com paralelismo (parallel_dbs) |
mysqldump / mariadb-dump |
xtrabackup |
Physical hot backup com cadeia 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 e safety gates
O plugin detecta automaticamente a topologia MySQL e aplica safety gates configuráveis:
| Topologia detectada | Detecção | Comportamento |
|---|---|---|
| Standalone | — | Backup direto |
| Async-Replica | SHOW REPLICA STATUS |
Backup do replica (offload do primary) |
| Group Replication | performance_schema.replication_group_members |
Backup de membro secundário; verifica lag |
| Galera | wsrep_local_state |
Auto-desync donor com RAII guard |
4.1 require_replica=true — safety gate
Bacula stock + xtrabackup tipicamente faz backup do primary (porque é o nó “default”). Em frota MySQL séria, isso é exatamente o que você não quer — o primary já está ocupado servindo writes. Setar require_replica=true faz o plugin recusar backup se o nó conectado for primary. Combine com max_replica_lag=60 para evitar backup de replica atrasado.
4.2 Galera donor RAII guard
Em Galera, um nó tirado para backup deve ser dessincronizado do cluster (SET GLOBAL wsrep_desync=ON) para evitar flow control afetar o cluster inteiro. O plugin faz isso com guard RAII: o flag é setado antes do backup e garantidamente removido mesmo em panic/crash do backend, via Drop trait.
5. Provisioning DR de réplica (modo replicate)
Validado em produção (JobId 3592). No restore para o host DR, o plugin executa automaticamente:
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;
Depois verifica que ambas as threads (Replica_IO_Running e Replica_SQL_Running) estão healthy antes de retornar success. Sem isso, “DR” significa restaurar o dump e depois operacionalmente lembrar de configurar replicação — frequentemente esquecido até o próximo incidente.
6. Features adicionais
| Feature | Status |
|---|---|
Transportable tablespaces — single-table restore via 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 — zero staging area, compatibilidade com encryption nativa Bacula | Production |
Documento docs/ENTERPRISE_PARITY.md mapeia 48 de 48 features do Bacula Enterprise MySQL Plugin 18.2.3 que estão atendidas ou superadas.
7. Validated support matrix
| Engine | Versões | 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
- Não combine encryption AES de volume Bacula com
xtrabackup --preparesem testar restore end-to-end. A documentação Enterprise reconhece incompatibilidade; o PodHeitor sintetiza prepare durante o restore para evitar este modo problemático. - Não rode
require_replica=falseem produção sem entender que isso permite backup do primary — pode ser intencional, mas é a fonte mais comum de “backup ficou lento e apagou minha latência p99”. - Não confie em
parallel_dbsalto sem ajustar I/O do host. 4 dumps paralelos de DBs grandes saturam disco antes que CPU. Comece em 4, monitoreiostat.
9. License posture
Plugin sob LicenseRef-PodHeitor-Proprietary. Source AGPLv3 do Bacula não é vinculado estaticamente desde v2.0.0. O shim C++ legacy src/podheitor-mysql-fd.{c,h} foi removido. Bindings via crate bacula-fd-abi independente.
Pronto para avaliar?
Trial comercial de 30 dias para frotas MySQL/MariaDB/Percona em produção. Garantimos no mínimo 50% de desconto vs Bacula Enterprise, Veeam ou Commvault, com mais funcionalidades inclusas.
Heitor Faria — Fundador, PodHeitor International
✉ [email protected]
☎ +1 (789) 726-1749 · +55 (61) 98268-4220 (WhatsApp)
🔗 Página do plugin PodHeitor MySQL
Disponível em:
Português
English (Inglês)
Español (Espanhol)