Dicas para manter sua msdb em ordem — Parte 1/?

Eduardo Roedel
3 min readDec 14, 2021

Olá gente, como estão? Espero que muito bem!

No dia a dia atendendo novos clientes, é comum acharmos situações digamos assim, inusitadas. Podem parecer básicas a critério de alguns, mas como diz o trocadilho: “é raro, mas acontece muito” e pelos mais diversos motivos rs.

Estes dias encontrei um caso em um cliente no qual o backup FULL compactado da msdb dava mais de 30GB em disco. Normalmente um banco que costuma ser pequeno e vermos esse tamanho, já dispara o alerta de algo de errado não está certo.

Para quem não sabe a finalidade do msdb, basicamente é o banco de dados responsável por armazenar as informações pertinentes aos nossos queridinhos jobs, informações de backups, alertas e algumas features como database mail, planos de manutenção e outras.

Deu pra ver que essa banco é bem importante né? Então, nada mais justo do que cuidar do msdb das suas instâncias com muito carinho para que não virem monstrinhos e que não venham a comer sua preciosa área de backup de forma não controlada. O descaso com ela, é daquele tipo de situação que pode te complicar a vida caso você tenha pouco espaço para backup, uma transação grande deixando o transaction log de seu banco cheio e você precisar de uns GB’s para gerar o seu salvador backup de log. São uns “poucos” GB’s que podem lhe salvar de um ambiente de produção parar, uma transação falhar…

Passado este momento de conscientização (baseado no terror da temida lei de Murph) e de tocar o seu coração caro(a) leitor(a), vamos para o que interessa e dar início com a parte 1 desta série de artigos que farei sobre msdb e hoje vamos falar sobre expurgo do log de planos de manutenção.

Existe uma procedure não documentada chamada msdb.dbo.sp_maintplan_delete_log e a finalidade dela é remover o histórico de execuções dos planos de manutenção, com requisito mínimo da variável @oldest_time preenchida para execução, ou seja, dados anteriores a esta data vão ser removidos.

EXECUTE msdb.dbo.sp_maintplan_delete_log
@plan_id (UNIQUEIDENTIFIER — NULLABLE — Código do plano de manutenção),
@subplan_id (UNIQUEIDENTIFIER — NULLABLE — Código do subplano de manutenção),
@oldest_time (DATETIME — NOT NULLABLE — Menor data para retenção);

Dependendo do ambiente em evidência, pode haver uma grande massa destes logs (que foi meu caso) e colocar de uma vez só para remover um grande período, pode gerar probleminhas de transaction log full no msdb. Visando fazer uma limpeza de forma recorrente dos logs desta feature através de um job, elaborei um script que estará neste link para que possa ser executada com maior tranquilidade e com menor impacto no seu ambiente. Utilizei apenas a variável @oldest_time, mas nada impede o uso das outras duas variáveis para tratamentos mais específicos.

No script deste artigo, apenas configuro quantos dias desejo reter de dados dos logs através da variável @DayToRetain (no meu caso, quero manter 30 dias). A partir disto é feito um cálculo do dia atual - @DayToRetain e a magia de remoção destes logs dia por dia acontece. Dependendo da situação, pode haver a necessidade de um shrink para reaver este espaço pré-alocado.

Espero que tenham gostado desta dica e em breve postarei mais sobre msdb.

Qualquer dúvída, comente aqui ou me procura no Linkedin :)

Abraços!

Referências:

--

--