Tools: Essential Guide: Como Configurar Dedup Paralela no Bacula Enterprise (Setup Side-by-Side)

Tools: Essential Guide: Como Configurar Dedup Paralela no Bacula Enterprise (Setup Side-by-Side)

🎯 O que Você Vai Conseguir

⚠️ Riscos e Cuidados

📋 Checklist Pré-Migração

🏗️ 1. Definição de Nomenclatura

📦 Passo 1: Preparação Física (Linux)

🔧 Passo 2: Configuração no BWeb (Storage Daemon)

A) Criar o Dedup Engine (Motor)

B) Criar os Devices (Múltiplos Dispositivos)

C) Criar o Autochanger (Robô)

⚙️ Passo 3: Configuração no BWeb (Director)

A) Criar o Storage (O Ponteiro)

B) Criar as Pools (Espelhamento de Produção)

✅ Passo 4: Finalização e Validação

1. Aplicar Configurações

2. Comandos de Validação (Terminal)

🚀 Passo 5: Automação da Migração (Script Definitivo)

Script: migrar_producao.sh

📊 Como Executar o Script

⚠️ Pontos Críticos de Atenção

Posso rodar o ambiente antigo e novo simultaneamente?

O que acontece se eu usar o mesmo Media Type?

Preciso parar todos os Jobs para aplicar?

📚 Veja Também (Tutoriais Bacula Enterprise)

🔗 Recursos Relacionados A configuração de dedup paralela bacula (Deduplicação Global) permite otimizar drasticamente o armazenamento e a velocidade dos seus backups corporativos. Este guia técnico detalha o procedimento para construção de um ambiente de deduplicação paralelo e isolado (Side-by-Side) no Bacula Enterprise. O objetivo é permitir a migração segura dos dados sem impactar o ambiente legado. Para mais informações, consulte a documentação oficial Bacula. Antes de começar, confirme: Esta tabela define o padrão "De/Para" utilizado em todo o projeto. O isolamento é garantido pelo uso de diretórios e Media Types exclusivos. Componente

Configuração ANTIGA (Legado)Configuração NOVA (Produção) Diretórios (Linux)/backup | /index/backup/dedup_novo | /index/dedup_novo Dedup EngineDedup2DedupEngine_NOVO Devices (Storage Daemon)Dedup01-01, -02...Device_Dedup_NOVO_01Device_Dedup_NOVO_02Device_Dedup_NOVO_03 Media Typededup1DedupType_NOVO ⚠️ CRÍTICO: Deve ser único AutochangerDedup01Dedup_Autochanger_NOVO Storage (Director)Dedup01Storage_Dedup_NOVO PoolsDiskBackup365d, etc.DiskBackup365d_NOVO (Sufixo _NOVO) ⚠️ ATENÇÃO: A parada do serviço Storage Daemon é obrigatória. Criar pastas com o serviço rodando pode causar problemas de permissão ou travamento de processos filhos.

Acesse o servidor via SSH como root e execute: Nesta etapa, criamos os "Hardwares Virtuais" no arquivo bacula-sd.conf. Caminho: Configuration » Storage Daemon (bacula01-sd) Criamos múltiplos devices para permitir concorrência (vários jobs rodando ao mesmo tempo). Nota: Todos devem ter o mesmo Media Type e apontar para o mesmo Engine. Nesta etapa, criamos a lógica de controle no arquivo bacula-dir.conf. Caminho: Configuration » Director » Storage Devemos criar uma versão "NOVA" para cada Pool que existe hoje e usa deduplicação. Este script realiza a migração em massa, alterando Jobs, JobDefs e Schedules. Ele suporta mapeamento de múltiplas pools e regras de agendamento (FullPool/IncPool). Copie o código abaixo, salve no servidor, dê permissão de execução (chmod +x) e execute. Sim! Esse é o objetivo do setup Side-by-Side. Você migra Jobs gradualmente enquanto o legado continua funcionando. O Bacula vai tentar usar Volumes do ambiente antigo, causando erros de montagem e possivelmente corrupção de dados. Não. Após criar a estrutura nova, você migra Jobs individualmente. O ambiente antigo continua operacional. Última atualização: Janeiro de 2026 | Testado no Bacula Enterprise 18.2.1 Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Code Block

Copy

- ✅ **Migração sem downtime:** Ambiente antigo e novo rodando lado a lado - ✅ **Rollback seguro:** Se algo der errado, volta para o legado em segundos - ✅ **Testes em produção:** Valide o novo storage com Jobs reais antes de migrar tudo - ✅ **Migração sem downtime:** Ambiente antigo e novo rodando lado a lado - ✅ **Rollback seguro:** Se algo der errado, volta para o legado em segundos - ✅ **Testes em produção:** Valide o novo storage com Jobs reais antes de migrar tudo - ✅ **Migração sem downtime:** Ambiente antigo e novo rodando lado a lado - ✅ **Rollback seguro:** Se algo der errado, volta para o legado em segundos - ✅ **Testes em produção:** Valide o novo storage com Jobs reais antes de migrar tudo - 🚨 **Media Type duplicado:** Se usar o mesmo Media Type do legado, o Bacula vai tentar montar Volumes errados (pode corromper dados) - ⚠️ **Espaço em disco:** Você precisará de espaço para **ambos** os ambientes durante a migração - 🚨 **Media Type duplicado:** Se usar o mesmo Media Type do legado, o Bacula vai tentar montar Volumes errados (pode corromper dados) - ⚠️ **Espaço em disco:** Você precisará de espaço para **ambos** os ambientes durante a migração - 🚨 **Media Type duplicado:** Se usar o mesmo Media Type do legado, o Bacula vai tentar montar Volumes errados (pode corromper dados) - ⚠️ **Espaço em disco:** Você precisará de espaço para **ambos** os ambientes durante a migração - ✅ Backup do catálogo atual (make_catalog_backup.pl) - ✅ Espaço em disco suficiente em /backup e /index - ✅ Janela de manutenção agendada (para restart do Storage Daemon) - ✅ Documentação da estrutura atual (pools, jobs, schedules) - ✅ Backup do catálogo atual (make_catalog_backup.pl) - ✅ Espaço em disco suficiente em /backup e /index - ✅ Janela de manutenção agendada (para restart do Storage Daemon) - ✅ Documentação da estrutura atual (pools, jobs, schedules) - ✅ Backup do catálogo atual (make_catalog_backup.pl) - ✅ Espaço em disco suficiente em /backup e /index - ✅ Janela de manutenção agendada (para restart do Storage Daemon) - ✅ Documentação da estrutura atual (pools, jobs, schedules) # 1. Parar o serviço para segurança systemctl stop bacula-sd # 2. Criar a estrutura de diretórios isolada mkdir -p /backup/dedup_novo mkdir -p /index/dedup_novo # 3. Aplicar permissões (Usuário do Bacula deve ser dono) chown -R bacula:tape /backup/dedup_novo /index/dedup_novo chmod 775 /backup/dedup_novo /index/dedup_novo # 4. Verificar se foi criado corretamente ls -ld /backup/dedup_novo /index/dedup_novo # 1. Parar o serviço para segurança systemctl stop bacula-sd # 2. Criar a estrutura de diretórios isolada mkdir -p /backup/dedup_novo mkdir -p /index/dedup_novo # 3. Aplicar permissões (Usuário do Bacula deve ser dono) chown -R bacula:tape /backup/dedup_novo /index/dedup_novo chmod 775 /backup/dedup_novo /index/dedup_novo # 4. Verificar se foi criado corretamente ls -ld /backup/dedup_novo /index/dedup_novo # 1. Parar o serviço para segurança systemctl stop bacula-sd # 2. Criar a estrutura de diretórios isolada mkdir -p /backup/dedup_novo mkdir -p /index/dedup_novo # 3. Aplicar permissões (Usuário do Bacula deve ser dono) chown -R bacula:tape /backup/dedup_novo /index/dedup_novo chmod 775 /backup/dedup_novo /index/dedup_novo # 4. Verificar se foi criado corretamente ls -ld /backup/dedup_novo /index/dedup_novo - Vá na aba **Dedupengines**. - Selecione o motor existente (ex: Dedup2) e clique em **Copy**. - Edite os campos fundamentais: **Name:** DedupEngine_NOVO - **Dedup Directory:** /backup/dedup_novo - **Dedup Index Directory:** /index/dedup_novo - Clique em **Save**. - Vá na aba **Dedupengines**. - Selecione o motor existente (ex: Dedup2) e clique em **Copy**. - Edite os campos fundamentais: **Name:** DedupEngine_NOVO - **Dedup Directory:** /backup/dedup_novo - **Dedup Index Directory:** /index/dedup_novo - Clique em **Save**. - Vá na aba **Dedupengines**. - Selecione o motor existente (ex: Dedup2) e clique em **Copy**. - Edite os campos fundamentais: **Name:** DedupEngine_NOVO - **Dedup Directory:** /backup/dedup_novo - **Dedup Index Directory:** /index/dedup_novo - Clique em **Save**. - Vá na aba **Devices**. - Selecione um device existente (ex: Dedup01-01) e clique em **Copy**. - Edite o **Primeiro Device:** **Name:** Device_Dedup_NOVO_01 - **Media Type:** DedupType_NOVO ⚠️ **OBRIGATÓRIO MUDAR** - **Archive Device:** /backup/dedup_novo - **Dedup Engine:** Selecione DedupEngine_NOVO - Clique em **Save**. - Repita o processo (Copy/Paste) para criar: Device_Dedup_NOVO_02 - Device_Dedup_NOVO_03 - Vá na aba **Devices**. - Selecione um device existente (ex: Dedup01-01) e clique em **Copy**. - Edite o **Primeiro Device:** **Name:** Device_Dedup_NOVO_01 - **Media Type:** DedupType_NOVO ⚠️ **OBRIGATÓRIO MUDAR** - **Archive Device:** /backup/dedup_novo - **Dedup Engine:** Selecione DedupEngine_NOVO - Clique em **Save**. - Repita o processo (Copy/Paste) para criar: Device_Dedup_NOVO_02 - Device_Dedup_NOVO_03 - Vá na aba **Devices**. - Selecione um device existente (ex: Dedup01-01) e clique em **Copy**. - Edite o **Primeiro Device:** **Name:** Device_Dedup_NOVO_01 - **Media Type:** DedupType_NOVO ⚠️ **OBRIGATÓRIO MUDAR** - **Archive Device:** /backup/dedup_novo - **Dedup Engine:** Selecione DedupEngine_NOVO - Clique em **Save**. - Repita o processo (Copy/Paste) para criar: Device_Dedup_NOVO_02 - Device_Dedup_NOVO_03 - Vá na aba **Autochangers**. - Selecione o autochanger existente e clique em **Copy**. - Edite: **Name:** Dedup_Autochanger_NOVO - **Devices:** Na lista da direita ("Selected"), **remova os devices antigos**. - Adicione **TODOS os novos devices** (_01, _02, _03). - Clique em **Save**. - Vá na aba **Autochangers**. - Selecione o autochanger existente e clique em **Copy**. - Edite: **Name:** Dedup_Autochanger_NOVO - **Devices:** Na lista da direita ("Selected"), **remova os devices antigos**. - Adicione **TODOS os novos devices** (_01, _02, _03). - Clique em **Save**. - Vá na aba **Autochangers**. - Selecione o autochanger existente e clique em **Copy**. - Edite: **Name:** Dedup_Autochanger_NOVO - **Devices:** Na lista da direita ("Selected"), **remova os devices antigos**. - Adicione **TODOS os novos devices** (_01, _02, _03). - Clique em **Save**. - Vá na aba **Storage**. - Use a função **Copy** no Storage antigo. - Edite os campos com atenção especial (pois os nomes novos ainda não aparecem nas listas): **Storage Name:** Storage_Dedup_NOVO - **Device:** Dedup_Autochanger_NOVO (Digite manualmente, idêntico ao Passo 2C). - **Media Type:** DedupType_NOVO (Digite manualmente). - **Autochanger:** Marque a opção **Yes**. - Clique em **Save**. - Vá na aba **Storage**. - Use a função **Copy** no Storage antigo. - Edite os campos com atenção especial (pois os nomes novos ainda não aparecem nas listas): **Storage Name:** Storage_Dedup_NOVO - **Device:** Dedup_Autochanger_NOVO (Digite manualmente, idêntico ao Passo 2C). - **Media Type:** DedupType_NOVO (Digite manualmente). - **Autochanger:** Marque a opção **Yes**. - Clique em **Save**. - Vá na aba **Storage**. - Use a função **Copy** no Storage antigo. - Edite os campos com atenção especial (pois os nomes novos ainda não aparecem nas listas): **Storage Name:** Storage_Dedup_NOVO - **Device:** Dedup_Autochanger_NOVO (Digite manualmente, idêntico ao Passo 2C). - **Media Type:** DedupType_NOVO (Digite manualmente). - **Autochanger:** Marque a opção **Yes**. - Clique em **Save**. - Vá na aba **Pools**. - Para cada Pool (ex: DiskBackup365d, Poll_DB_30_dias): Selecione e clique em **Copy**. - **Name:** Adicione o sufixo _NOVO (ex: DiskBackup365d_NOVO). - **Storage:** Selecione Storage_Dedup_NOVO. - **Label Format:** Altere para VolNovo- (Facilita auditoria visual). - Salve. - Vá na aba **Pools**. - Para cada Pool (ex: DiskBackup365d, Poll_DB_30_dias): Selecione e clique em **Copy**. - **Name:** Adicione o sufixo _NOVO (ex: DiskBackup365d_NOVO). - **Storage:** Selecione Storage_Dedup_NOVO. - **Label Format:** Altere para VolNovo- (Facilita auditoria visual). - Salve. - Vá na aba **Pools**. - Para cada Pool (ex: DiskBackup365d, Poll_DB_30_dias): Selecione e clique em **Copy**. - **Name:** Adicione o sufixo _NOVO (ex: DiskBackup365d_NOVO). - **Storage:** Selecione Storage_Dedup_NOVO. - **Label Format:** Altere para VolNovo- (Facilita auditoria visual). - Salve. - No BWeb: **Commit / Write Configuration**. - No BWeb: **Reload Director**. - No Terminal: systemctl restart bacula-sd - No BWeb: **Commit / Write Configuration**. - No BWeb: **Reload Director**. - No Terminal: systemctl restart bacula-sd - No BWeb: **Commit / Write Configuration**. - No BWeb: **Reload Director**. - No Terminal: systemctl restart bacula-sd # Verifica se o Director aponta para o Autochanger correto grep -r "Device" /opt/bacula/etc/ | grep "Storage_Dedup_NOVO" # Saída Esperada: Device = "Dedup_Autochanger_NOVO" # Verifica se o Motor de Dedup subiu e está "ouvindo" echo "dedup usage storage=Storage_Dedup_NOVO" | bconsole # Saída Esperada: Status do DedupEngine_NOVO com data/hora atual. # Verifica se o Director aponta para o Autochanger correto grep -r "Device" /opt/bacula/etc/ | grep "Storage_Dedup_NOVO" # Saída Esperada: Device = "Dedup_Autochanger_NOVO" # Verifica se o Motor de Dedup subiu e está "ouvindo" echo "dedup usage storage=Storage_Dedup_NOVO" | bconsole # Saída Esperada: Status do DedupEngine_NOVO com data/hora atual. # Verifica se o Director aponta para o Autochanger correto grep -r "Device" /opt/bacula/etc/ | grep "Storage_Dedup_NOVO" # Saída Esperada: Device = "Dedup_Autochanger_NOVO" # Verifica se o Motor de Dedup subiu e está "ouvindo" echo "dedup usage storage=Storage_Dedup_NOVO" | bconsole # Saída Esperada: Status do DedupEngine_NOVO com data/hora atual. #!/usr/bin/env bash set -euo pipefail # ============================================================================== # 1. CONFIGURAÇÃO # ============================================================================== DIR_BASE="/opt/bacula/etc/conf.d/Director/bacula01-dir" STORAGE_ANTIGO="Dedup01" STORAGE_NOVO="Storage_Dedup_NOVO" POOL_MAP=( "CatalogBackup14d:CatalogBackup14d_NOVO" "Poll_DB_30_dias:Poll_DB_30_dias_NOVO" "Poll_VM-PROX_30_dias:Poll_VM-PROX_30_dias_NOVO" "Poll_VM-ESXI_90_dias:Poll_VM-ESXI_90_dias_NOVO" "Poll_VM-PROX_90_dias:Poll_VM-PROX_90_dias_NOVO" "DiskBackup365d:DiskBackup365d_NOVO" "DiskBackup5anos:DiskBackup5anos_NOVO" ) # 1 = SIMULAÇÃO | 0 = APLICAR DRY_RUN=1 # ============================================================================== # 2. MOTOR DE MIGRAÇÃO (REGEX CORRIGIDO PARA ASPAS) # ============================================================================== TARGET_DIRS=("$DIR_BASE/Job" "$DIR_BASE/JobDefs" "$DIR_BASE/Schedule") backup_file() { local f="$1" local bkp="${f}.bkp_migracao" if [[ -e "$bkp" ]]; then local n=1 while [[ -e "${bkp}.${n}" ]]; do n=$((n+1)); done bkp="${bkp}.${n}" fi cp -a -- "$f" "$bkp" } apply_perl() { local f="$1" shift if [[ "$DRY_RUN" -eq 1 ]]; then echo " [SIMULACAO] Alteraria: $(basename "$f")" else backup_file "$f" perl -0777 -i -pe "$@" -- "$f" echo " [APLICADO] Atualizado: $(basename "$f")" fi } echo "=== MIGRAÇÃO FINAL (IDEMPOTENTE + FIX ASPAS) ===" echo "Proteção ativa: Ignora pools já migradas." PERL_RULES=() # 1. Storage (Corrigido escape para o bash) PERL_RULES+=("s/(bStorages*=s*)"?Q$STORAGE_ANTIGOEb"?/${1}"$STORAGE_NOVO"/mg;") # 2. Pools for map in "${POOL_MAP[@]}"; do OLD="${map%%:*}" NEW="${map##*:}" # AQUI ESTÁ A CORREÇÃO: b antes de "? # Isso garante que ele consome a aspa original, evitando duplicidade # Regras Genéricas PERL_RULES+=("s/(bPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bFullPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bIncrementalPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bDifferentialPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bNexts*Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") # Regras Verbose PERL_RULES+=("s/(^s*Fulls+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Differentials+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Incrementals+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") done FILES=() for d in "${TARGET_DIRS[@]}"; do if [[ -d "$d" ]]; then while IFS= read -r -d '' f; do FILES+=("$f"); done >> MUDANÇA NECESSÁRIA EM: $(basename "$f") " || true echo " -----------------------------------------" fi apply_perl "$f" "$(printf '%s' "${PERL_RULES[@]}")" fi fi done echo "--------------------------------------------------------" if [[ "$DRY_RUN" -eq 1 ]]; then echo "FIM DA SIMULAÇÃO." if [[ "$CHANGED" -gt 0 ]]; then echo "✅ Verifique se as aspas estão corretas (apenas uma)." echo " Se sim, mude DRY_RUN=0 e execute." else echo "✅ Tudo pronto! Nenhuma alteração pendente." fi else echo "SUCESSO: $CHANGED arquivos atualizados." echo "Execute 'reload' no bconsole." fi #!/usr/bin/env bash set -euo pipefail # ============================================================================== # 1. CONFIGURAÇÃO # ============================================================================== DIR_BASE="/opt/bacula/etc/conf.d/Director/bacula01-dir" STORAGE_ANTIGO="Dedup01" STORAGE_NOVO="Storage_Dedup_NOVO" POOL_MAP=( "CatalogBackup14d:CatalogBackup14d_NOVO" "Poll_DB_30_dias:Poll_DB_30_dias_NOVO" "Poll_VM-PROX_30_dias:Poll_VM-PROX_30_dias_NOVO" "Poll_VM-ESXI_90_dias:Poll_VM-ESXI_90_dias_NOVO" "Poll_VM-PROX_90_dias:Poll_VM-PROX_90_dias_NOVO" "DiskBackup365d:DiskBackup365d_NOVO" "DiskBackup5anos:DiskBackup5anos_NOVO" ) # 1 = SIMULAÇÃO | 0 = APLICAR DRY_RUN=1 # ============================================================================== # 2. MOTOR DE MIGRAÇÃO (REGEX CORRIGIDO PARA ASPAS) # ============================================================================== TARGET_DIRS=("$DIR_BASE/Job" "$DIR_BASE/JobDefs" "$DIR_BASE/Schedule") backup_file() { local f="$1" local bkp="${f}.bkp_migracao" if [[ -e "$bkp" ]]; then local n=1 while [[ -e "${bkp}.${n}" ]]; do n=$((n+1)); done bkp="${bkp}.${n}" fi cp -a -- "$f" "$bkp" } apply_perl() { local f="$1" shift if [[ "$DRY_RUN" -eq 1 ]]; then echo " [SIMULACAO] Alteraria: $(basename "$f")" else backup_file "$f" perl -0777 -i -pe "$@" -- "$f" echo " [APLICADO] Atualizado: $(basename "$f")" fi } echo "=== MIGRAÇÃO FINAL (IDEMPOTENTE + FIX ASPAS) ===" echo "Proteção ativa: Ignora pools já migradas." PERL_RULES=() # 1. Storage (Corrigido escape para o bash) PERL_RULES+=("s/(bStorages*=s*)"?Q$STORAGE_ANTIGOEb"?/${1}"$STORAGE_NOVO"/mg;") # 2. Pools for map in "${POOL_MAP[@]}"; do OLD="${map%%:*}" NEW="${map##*:}" # AQUI ESTÁ A CORREÇÃO: b antes de "? # Isso garante que ele consome a aspa original, evitando duplicidade # Regras Genéricas PERL_RULES+=("s/(bPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bFullPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bIncrementalPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bDifferentialPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bNexts*Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") # Regras Verbose PERL_RULES+=("s/(^s*Fulls+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Differentials+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Incrementals+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") done FILES=() for d in "${TARGET_DIRS[@]}"; do if [[ -d "$d" ]]; then while IFS= read -r -d '' f; do FILES+=("$f"); done >> MUDANÇA NECESSÁRIA EM: $(basename "$f") " || true echo " -----------------------------------------" fi apply_perl "$f" "$(printf '%s' "${PERL_RULES[@]}")" fi fi done echo "--------------------------------------------------------" if [[ "$DRY_RUN" -eq 1 ]]; then echo "FIM DA SIMULAÇÃO." if [[ "$CHANGED" -gt 0 ]]; then echo "✅ Verifique se as aspas estão corretas (apenas uma)." echo " Se sim, mude DRY_RUN=0 e execute." else echo "✅ Tudo pronto! Nenhuma alteração pendente." fi else echo "SUCESSO: $CHANGED arquivos atualizados." echo "Execute 'reload' no bconsole." fi #!/usr/bin/env bash set -euo pipefail # ============================================================================== # 1. CONFIGURAÇÃO # ============================================================================== DIR_BASE="/opt/bacula/etc/conf.d/Director/bacula01-dir" STORAGE_ANTIGO="Dedup01" STORAGE_NOVO="Storage_Dedup_NOVO" POOL_MAP=( "CatalogBackup14d:CatalogBackup14d_NOVO" "Poll_DB_30_dias:Poll_DB_30_dias_NOVO" "Poll_VM-PROX_30_dias:Poll_VM-PROX_30_dias_NOVO" "Poll_VM-ESXI_90_dias:Poll_VM-ESXI_90_dias_NOVO" "Poll_VM-PROX_90_dias:Poll_VM-PROX_90_dias_NOVO" "DiskBackup365d:DiskBackup365d_NOVO" "DiskBackup5anos:DiskBackup5anos_NOVO" ) # 1 = SIMULAÇÃO | 0 = APLICAR DRY_RUN=1 # ============================================================================== # 2. MOTOR DE MIGRAÇÃO (REGEX CORRIGIDO PARA ASPAS) # ============================================================================== TARGET_DIRS=("$DIR_BASE/Job" "$DIR_BASE/JobDefs" "$DIR_BASE/Schedule") backup_file() { local f="$1" local bkp="${f}.bkp_migracao" if [[ -e "$bkp" ]]; then local n=1 while [[ -e "${bkp}.${n}" ]]; do n=$((n+1)); done bkp="${bkp}.${n}" fi cp -a -- "$f" "$bkp" } apply_perl() { local f="$1" shift if [[ "$DRY_RUN" -eq 1 ]]; then echo " [SIMULACAO] Alteraria: $(basename "$f")" else backup_file "$f" perl -0777 -i -pe "$@" -- "$f" echo " [APLICADO] Atualizado: $(basename "$f")" fi } echo "=== MIGRAÇÃO FINAL (IDEMPOTENTE + FIX ASPAS) ===" echo "Proteção ativa: Ignora pools já migradas." PERL_RULES=() # 1. Storage (Corrigido escape para o bash) PERL_RULES+=("s/(bStorages*=s*)"?Q$STORAGE_ANTIGOEb"?/${1}"$STORAGE_NOVO"/mg;") # 2. Pools for map in "${POOL_MAP[@]}"; do OLD="${map%%:*}" NEW="${map##*:}" # AQUI ESTÁ A CORREÇÃO: b antes de "? # Isso garante que ele consome a aspa original, evitando duplicidade # Regras Genéricas PERL_RULES+=("s/(bPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bFullPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bIncrementalPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bDifferentialPools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") PERL_RULES+=("s/(bNexts*Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/g;") # Regras Verbose PERL_RULES+=("s/(^s*Fulls+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Differentials+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") PERL_RULES+=("s/(^s*Incrementals+Backups+Pools*=s*)"?Q$OLDEb"?/${1}"$NEW"/mg;") done FILES=() for d in "${TARGET_DIRS[@]}"; do if [[ -d "$d" ]]; then while IFS= read -r -d '' f; do FILES+=("$f"); done >> MUDANÇA NECESSÁRIA EM: $(basename "$f") " || true echo " -----------------------------------------" fi apply_perl "$f" "$(printf '%s' "${PERL_RULES[@]}")" fi fi done echo "--------------------------------------------------------" if [[ "$DRY_RUN" -eq 1 ]]; then echo "FIM DA SIMULAÇÃO." if [[ "$CHANGED" -gt 0 ]]; then echo "✅ Verifique se as aspas estão corretas (apenas uma)." echo " Se sim, mude DRY_RUN=0 e execute." else echo "✅ Tudo pronto! Nenhuma alteração pendente." fi else echo "SUCESSO: $CHANGED arquivos atualizados." echo "Execute 'reload' no bconsole." fi # 1. Salvar o script nano migrar_producao.sh # Cole o conteúdo acima # 2. Dar permissão de execução chmod +x migrar_producao.sh # 3. Executar em modo SIMULAÇÃO (DRY_RUN=1) ./migrar_producao.sh # 4. Se tudo estiver correto, editar e mudar DRY_RUN=0 nano migrar_producao.sh # Alterar linha: DRY_RUN=0 # 5. Aplicar as mudanças ./migrar_producao.sh # 6. Recarregar o Director echo "reload" | bconsole # 1. Salvar o script nano migrar_producao.sh # Cole o conteúdo acima # 2. Dar permissão de execução chmod +x migrar_producao.sh # 3. Executar em modo SIMULAÇÃO (DRY_RUN=1) ./migrar_producao.sh # 4. Se tudo estiver correto, editar e mudar DRY_RUN=0 nano migrar_producao.sh # Alterar linha: DRY_RUN=0 # 5. Aplicar as mudanças ./migrar_producao.sh # 6. Recarregar o Director echo "reload" | bconsole # 1. Salvar o script nano migrar_producao.sh # Cole o conteúdo acima # 2. Dar permissão de execução chmod +x migrar_producao.sh # 3. Executar em modo SIMULAÇÃO (DRY_RUN=1) ./migrar_producao.sh # 4. Se tudo estiver correto, editar e mudar DRY_RUN=0 nano migrar_producao.sh # Alterar linha: DRY_RUN=0 # 5. Aplicar as mudanças ./migrar_producao.sh # 6. Recarregar o Director echo "reload" | bconsole - **Media Type deve ser único:** Nunca use o mesmo Media Type do ambiente antigo. - **Sempre faça backup antes:** O script cria backups automáticos, mas valide manualmente. - **Execute em modo simulação primeiro:** DRY_RUN=1 evita mudanças acidentais. - **Valide as aspas:** O script corrige aspas duplicadas, mas sempre confira a saída. - **Media Type deve ser único:** Nunca use o mesmo Media Type do ambiente antigo. - **Sempre faça backup antes:** O script cria backups automáticos, mas valide manualmente. - **Execute em modo simulação primeiro:** DRY_RUN=1 evita mudanças acidentais. - **Valide as aspas:** O script corrige aspas duplicadas, mas sempre confira a saída. - **Media Type deve ser único:** Nunca use o mesmo Media Type do ambiente antigo. - **Sempre faça backup antes:** O script cria backups automáticos, mas valide manualmente. - **Execute em modo simulação primeiro:** DRY_RUN=1 evita mudanças acidentais. - **Valide as aspas:** O script corrige aspas duplicadas, mas sempre confira a saída. - [Como Restaurar Backup de Job Prunado (bscan e bextract)](https://tecmestre.com.br/restaurar-job-prunado-bacula-bscan-bextract/) - [Erro "Unsupported Proxmox version" - Solução Completa](https://tecmestre.com.br/erro-unsupported-proxmox-version-bacula-plugin/) - [Configurar Deduplicação Paralela (Side-by-Side)](https://tecmestre.com.br/configurar-dedup-paralela-bacula-side-by-side/) - [Migração Completa para Oracle Cloud (OCI)](https://tecmestre.com.br/migracao-bacula-enterprise-oracle-cloud-oci/) - [10 Devices Paralelos para 50 Jobs Simultâneos](https://tecmestre.com.br/configurar-10-devices-paralelos-bacula-alta-concorrencia/) - [Como Restaurar Backup de Job Prunado (bscan e bextract)](https://tecmestre.com.br/restaurar-job-prunado-bacula-bscan-bextract/) - [Erro "Unsupported Proxmox version" - Solução Completa](https://tecmestre.com.br/erro-unsupported-proxmox-version-bacula-plugin/) - [Configurar Deduplicação Paralela (Side-by-Side)](https://tecmestre.com.br/configurar-dedup-paralela-bacula-side-by-side/) - [Migração Completa para Oracle Cloud (OCI)](https://tecmestre.com.br/migracao-bacula-enterprise-oracle-cloud-oci/) - [10 Devices Paralelos para 50 Jobs Simultâneos](https://tecmestre.com.br/configurar-10-devices-paralelos-bacula-alta-concorrencia/) - [Como Restaurar Backup de Job Prunado (bscan e bextract)](https://tecmestre.com.br/restaurar-job-prunado-bacula-bscan-bextract/) - [Erro "Unsupported Proxmox version" - Solução Completa](https://tecmestre.com.br/erro-unsupported-proxmox-version-bacula-plugin/) - [Configurar Deduplicação Paralela (Side-by-Side)](https://tecmestre.com.br/configurar-dedup-paralela-bacula-side-by-side/) - [Migração Completa para Oracle Cloud (OCI)](https://tecmestre.com.br/migracao-bacula-enterprise-oracle-cloud-oci/) - [10 Devices Paralelos para 50 Jobs Simultâneos](https://tecmestre.com.br/configurar-10-devices-paralelos-bacula-alta-concorrencia/) - [Documentação Oficial Bacula Enterprise - Deduplicação](https://www.baculasystems.com/documentation-downloads/) - [Mais tutoriais de Bacula no TecMestre](https://tecmestre.com.br/bacula-enterprise/) - [Documentação Oficial Bacula Enterprise - Deduplicação](https://www.baculasystems.com/documentation-downloads/) - [Mais tutoriais de Bacula no TecMestre](https://tecmestre.com.br/bacula-enterprise/) - [Documentação Oficial Bacula Enterprise - Deduplicação](https://www.baculasystems.com/documentation-downloads/) - [Mais tutoriais de Bacula no TecMestre](https://tecmestre.com.br/bacula-enterprise/)