Banco de Dados

20 fev, 2024

Scripts SQL e Tabelas de Sistema – Parte 3: Arquivos de Log

Publicidade

O assunto desta vez é a geração de scripts que se apliquem a múltiplos bancos de dados.

É claro que scripts que afetam toda instância SQL são muito poderosos, mas é sempre bom lembrar que quanto mais amplo o escopo do seu script, maiores devem ser os cuidados na sua construção.

Tendo isso em mente, começamos a conversa falando dos tipos de tabelas de sistema.

LEIA TAMBÉM: Scripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas

Scripts SQL – Tipos de Tabelas de Sistema

Estou sempre me referindo a estes catálogos como “tabelas de sistema”, mas muitos deles são visões ou até mesmo exibições de gerenciamento dinâmico do sistema (que englobam as DMVs e DMFs).

De qualquer modo, para fins de criação de um gerador de scripts, não importa que tipo de objeto que se está usando. Basta saber como trabalhar com seus metadados.

Já apresentei algumas tabelas de sistema nos artigos anteriores, mas o ponto importante é que aquelas tabelas existem em todos os bancos de dados da instância, sejam eles bancos de sistema (MASTER, TEMPDB, MSDB, MODEL) ou de usuário.

Outros catálogos são específicos de uma ou outra base de sistema.

Por exemplo, na base MASTER, existem algumas tabelas extras que só são encontradas ali. Por exemplo:

  • sys.databases : contém informações de todas as bases de dados (veja link).
  • sys.servers : informa metadados dos servidores vinculados (“linked servers”)
  • sys.logins : traz informações de todos os logins cadastrados na instância SQL
  • sys.master_files : metadados dos arquivos de dados e log usados em cada base de dados (datafiles”)

Do mesmo modo, na base MSDB existem tabelas que tratam de metadados dos jobs da instância, seus passos, agendamentos etc.

Caso de Uso

Neste exemplo, apresento um script simples para ajudar o administrador da instância a controlar o consumo excessivo de espaço em disco por parte dos arquivos de log.

Originalmente, eu criei este script para lidar com um caso real, onde o ambiente de testes da empresa dispunha de uma quantidade limitada de espaço para os arquivos de log.

O objetivo deste script é identificar quais arquivos de log estão ocupando mais espaço do que o esperado e então tentar liberar espaço livre destes arquivos.

Para isso, eu uso a instrução DBCC SHRINKFILE. Importante lembrar que para executar esta operação é necessário fazer parte do grupo de segurança sysadmin ou então do grupo db_owner de cada um dos bancos de dados afetados.

Definindo Escopo

Para encontrar os metadados necessários para esta tarefa, eu uso duas tabelas de sistema específicas da base MASTER:

  • sys.databases
  • sys.master_files

O Quadro 1 mostra a consulta para identificar o tamanho dos arquivos de log das bases de dados de usuário que tiverem status “online”.

Quadro 1: verificando o tamanho dos arquivos de log

LEIA TAMBÉM: Scripts SQL e Tabelas de Sistema – Parte 2: Criando Índices

Construindo o Gerador de Scripts de Gerenciamento de Log

Agora eu reutilizo a consulta anterior para criar o gerador de scripts e adiciono duas variáveis para especificar qual o tamanho limite dos arquivos que sofrerão a redução e qual o tamanho que será reservado para eles. Veja o Quadro 2.

Quatro 2 A
Quadro 2 B: gerador dos scripts de “ShrinkFile”

Observe no quadro acima que o resultado da consulta foi exibido em modo texto, exatamente para exibir as novas “linhas” que fazem parte do script. Basta agora copiar estas declarações e executá-las no seu ambiente.

Você pode fazer o download do script completo neste link.

Scripts SQL – Comentários Finais

Neste artigo, trago um exemplo bem simples de uso de geradores de scripts que afetam múltiplos bancos de dados.

O exemplo foi escolhido a dedo, visto que o nível de complexidade do gerador de scripts aumenta muito quando se trata de criar ações que vão afetar objetos internos de múltiplas bases de dados.

Um exercício que demonstraria esta afirmação (e fica como sugestão para o leitor) seria converter os scripts dos artigos anteriores para serem executados em todos os bancos de dados da instância.

No quarto artigo dessa série, trarei um novo exemplo que exatamente isso: inspeciona cada uma das bases e toma ações dentro de cada uma delas.

Até a próxima!