Primeiros passos com Powershell.

Olá Pessoal,

Neste artigo vou mostrar alguns scripts úteis utilizando o Powershell e SQL Server. Eu não irei falar do poder do Powershell e porque você deva oimageu não utiliza-lo, pois o Laerte já mostrou por "N" formas qual sua utilidade e vantagens, vou deixar ao critério do amigo leitor chegar nessa conclusão. 

Para simular situações do dia a dia pensei em algumas tarefas importantes como por exemplo: Preciso criar um inventário simples de meus servidores, armazenando nome da instancia, processadores, memóra, etc. Podemos criar um script Powershell para se conectar em nossos servidores e listar essas opções, com isso iremos manter essas informações atualizadas de arcordo com a frequencia de execução do script. Para implementar nossa solução proposta acima vamos escrever o seguinte script: 

   1: $ServerList = Get-Content C:TempScriptServers.txt
   2: ForEach ($svr in $ServerList)
   3: { 
   4: $Server = Get-SqlServer -sqlserver $svr -username "usuario" -password "senha"
   5: $Server | Select-Object Name,Edition,Language,LoginMode,PhysicalMemory,Platform,Processors,Product,ProductLevel,VersionString,Collation,ErrorLogPath 
   6: | ConvertTo-Html -As LIST | Out-File C:TempScriptInventary.html -Append
   7: "" | Out-File C:TempScriptInventoryServers.html -Append
   8: }

Este script armazena na variável $ServerList o conteúdo do arquivo C:TempScriptServers.txt de qual contém os nomes dos servidores no padrão SERVERINSTANCE um em cada linha, após isso o script se conecta em cada servidor e lista as opções Name,Edition,Language,PhysicalMemory,Processors … e de "quebra" ainda manda para um arquivo HTML de qual pode ser hospedado em um servidor em sua intranet para uma melhor visualização. Veja a saída do comando abaixo.

image

Podemos perceber através das linhas marcadas os nomes dos servidores, e suas configurações, neste exemplo recuperamos configurações de duas instâncias SQL Server de qual com o mesmo script poderia se conectar em várias instâncias. A próxima situação é Como posso verificar quais databases de usuário em minhas instâncias estão com as opções AutoClose e AutoShrink habilitadas ?.Para esse exemplo vamos continuar com a mesma linha de raciocínio, conectar em nossas instâncias especificadas no arquivo Servers.txt e verificar os status das opções acima. Neste caso vamos fazer um filtro pois queremos apenas os bancos de dados de usuário.Vamos ao script:

   1: $ServerList = Get-Content C:TempScriptServers.txt
   2: ForEach ($svr in $ServerList)
   3: {
   4:  $Server = Get-SqlServer -sqlserver $svr -username "usuario" -password "senha"
   5:  $Databases = $Server.Databases
   6:  $Server.Name
   7:  
   8: ForEach ($db in $Databases)
   9: {
  10:  if (!$db.IsSystemObject) {
  11:  $db | Where-Object {$_.AutoClose -eq $true -or $_.AutoShrink -eq $true } | Select-Object Name,AutoClose,AutoShrink | Format-Table
  12:      }
  13:  }
  14: }

Neste script verificamos se o banco de dados é um banco de dados de sistema, e após filtramos apenas os banco de dados que tenham pelo menos uma das opções como True, ou seja, retorna apenas os databases que tenha a opção AutoClose ou AutoShrink habilitadas.

image

Neste momento voce deve estar pensando: "Legal, mas e se eu quiser alterar esses valores ?  quero que desabilite as duas opções nos bancos de dados.selecionados" Fácil vamos alterar nosso script para desabilitar essas opções.

   1: $ServerList = Get-Content C:TempScriptServers.txt
   2: ForEach ($svr in $ServerList)
   3: {
   4:  $Server = Get-SqlServer -sqlserver $svr -username "usuario" -password "senha"
   5:  $Databases = $Server.Databases
   6:  $Server.Name
   7:  
   8: ForEach ($db in $Databases)
   9:  {
  10:      if (!$db.IsSystemObject){
  11:          if (!$db.IsDatabaseSnapshot){
  12:              $db.AutoClose = $false
  13:              $db.AutoShrink = $false
  14:              $db.Alter()
  15:              }
  16:      $db | Select-Object Name,AutoClose,AutoShrink | Format-Table
  17:  
  18:          }
  19:      }
  20: } 

Notem que em nosso exemplo estamos validando além do banco de dados ser um banco de dados de usuário, se o banco de dados é um Database Snapshot pois sabemos que não é possível altera-lo. Logo após o script seta as opções do tipo Boolean para false, por último o script lista as opções alteradas.

image

Outra situação é "Como posso visualizar quando todas as minhas estatísticas em um determinado ou vários databases de uma ou várias tabelas foram atualizadas?" no script abaixo listamos a data da última atualização de todas as statísticas de todas as tabelas do banco de dados AdventureWorks.

   1: $Server = Get-SqlServer -sqlserver "SERVER2008PRODUCAO" -username "usuario" -password "senha"
   2: Get-SqlDatabase -sqlserver $Server -dbname "AdventureWorks" |Get-SqlTable | Get-SqlStatistic | Select-Object Table,Name,IsAutoCreated,LastUpdated | Format-Table –AutoSize

image

Sim, isso mesmo, para atualizarmos todas essas statísticas apenas adicionamos o cmd-let Update-Statistics como no script abaixo:

   1: $Server = Get-SqlServer -sqlserver "SERVER2008PRODUCAO" -username "usuario" -password "senha"
   2: Get-SqlDatabase -sqlserver $Server -dbname "AdventureWorks" |Get-SqlTable | Get-SqlStatistic | Update-SqlStatistic 

image

O Grande diferencial do Powershell é a possíbilidade de trabalhar em operações multi-servidores, o script acima poderia ser facilmente alterado para executar em uma range de servidores, automatizando algumas tarefas rotineiras de um DBA. Com isso concluo este artigo, espero ter demostrado um pouco da produtividade e flexibilidade oferecida pelo Powershell voltado ao SQL Server.

Abraços, até o próximo!

Referencias: http://laertejuniordba.spaces.live.com/

Advertisements