Powershell — Renomeio de pastas em diretório na rede

Eduardo Roedel
4 min readDec 5, 2021

--

Oi gente! Como vocês estão? Espero que muito bem!

Sei que o título deste post é autoexplicativo, mas vou compartilhar o contexto que me levou a escrever, pois fazer esse negócio funcionar corretamente, levou um tempo.
Recentemente em um cliente, tive a necessidade auxiliar na reformulação da política de backup dos bancos de dados (obviamente SQL Server ❤), pois havia pouco espaço em disco no servidor de backup. Até ali, OK. Averiguando a raiz da situação: bancos relativamente grandes (700GB — 1,1TB) + Backup FULL diário + Backup DIFF a cada 2h + Backup LOG a cada 10min. Olhando para este cenário, podemos pensar várias coisas, uma delas é: pra suportar essa política, vai precisar de bastante disco (rs).

Neste apoio havia um requisito particular: efetuar um backup completo (FULL) mensal e anual, sem tempo de retenção. Ok. Missão dada, missão cumprida.

Qual foi o raciocínio adotado para economizar espaço em disco + atender este requisito?

Resposta:

  • Ao invés de fazermos um backup FULL diariamente, passamos a fazer um backup FULL semanal das bases de usuário, retendo os últimos 7 dias (ou 168h);
  • Backup DIFF (acumulativo do último full) a cada 6h (este pode ser aumentado a periodidicidade para 12h em 12h se for necessário ou mais tempo), retendo os últimos 7 dias (ou 168h);
  • Backup de LOG (transacional) a cada 5 minutos, retendo os últimos 7 dias (ou 168h);
  • Das bases de sistema (master, model e msdb), backup FULL diário, retendo os últimos 7 dias (ou 168h);
  • Backup mensal (FULL) no dia 01 de cada mês com a opção COPY_ONLY, ignorando o mês 01;
Chamada da rotina de backup do Ola Hallengren e em caso de ser 01/01, interrompe o job.
Agendamento (schedule) utilizado para efetuar o backup todo dia 01/01.
  • Backup anual (FULL) no dia 01/01 de cada ano, com a opção COPY_ONLY, seguindo a mesma parametrização do backup mensal, sem o IF/ELSE na etapa (step).
Agendamento (schedule) utilizado para efetuar todo dia 01/01.

A ideia do COPY_ONLY basicamente será para não gerar uma nova cadeia de backups;

Você pode pensar neste momento: “Eduardo, se conflitar a rotina de backup FULL semanal com a mensal?” Uma possibiliade é tratarmos os horários dos agentamentos (nessa situação foi possível). Caso não for possível, uma sugestão seria fazer uma condição (IF/ELSE) semelhante na rotina mensal pra interromper ela mesma caso já rodou ou esteja em execução e efetuar uma cópia do(s) arquivo(s) gerado(s) para o destino em questão (em Powershell).

Após toda essa história contada, vamos ao que interessa sobre o Powershell elaborado e por que?

A ideia deste Powershell além de catalogar a data do backup (embora já contém por padrão no nome do arquivo) é garantir também que esses não sejam removidos por conta das varíaveis CleanupTime e CleanupMode. Os segredos para que este Powershell funcione corretamente no Agent foram:

  • O SQL Server Agent estar com permissão de leitura/escrita/modificação no destino;
  • Estar com credencial de domínio (AD);
  • Na variável $RootPath conter o termo “FileSystem::\\” para que seja entendido que é um diretório;
Chamada do Powershell. O termo “Monthly” é apenas um termo usado na situação e não é um requisito dele existir. Este script pode ser usado em outras situações e o mesmo foi utilizado nesta como parte de uma solução.

O script em questão está neste link no GitHub.

O padrão da solução de backup ([dbo].[DatabaseBackup]) do Ola Hallengren através da variável Directory, é criar os sub-diretórios:
<nome da instância / grupo de disponibilidade (Availability group) / servidor> / <nome do banco>/ <tipo de backup> (FULL/DIFF/LOG/FULL_COPY_ONLY).
Nisto, é fazer seus diretórios anteriores ao do nosso querido e salvador de pátrias Mr. Ola.

Feito isto, está entregue uma nova política de backup. Lembrando que este foi UM raciocínio e pode haver mais possibilidades :)

Espero que se você chegou até aqui, tenha gostado do post.
Dicas e sugestões, sempre serão bem vindas.

E se você tiver algum raciocínio diferente do apresentado, comente pois vai ser muito legal e poderá ajudar mais gente.

Um abraço!

Referências:

--

--

Eduardo Roedel

SQL Server Database Administrator