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

9 Responses to Primeiros passos com Powershell.

  1. Laerte says:

    Grande Felipe..a SQLPSX é um show né. Parabéns cara, ótimos exemplos. Go Powershell Go !!! :)

  2. Felipe says:

    A SQLPSX é muito completa cara, valeu pelo apoio!Abraços..

  3. Marcos Lucas says:

    Eita que artigo bom é esse sobre powershell pensei que estava lendo algum artigo de laerte junior, parabéns pela qualidade e simplicidade.

  4. Felipe says:

    Valeu Marcos, mas ainda falta muiiitooo pra chegar nesse nível ..rs

  5. Fabrício says:

    Parabéns pelo artigo Felipe.Pergunta de iniciante… Essa semana instalei o powershell na minha estação de trabalho da empresa…Meus servidores possuem o SQL Server 2005 e não tem o porwershell instalado…Eu conseguiria obter essas informações dos meus servidores SQL Server através da minha máquina com powershell ou eu precisaria instalar o powershell em todos os meus servidores com SQL Server.Abraços

  6. Felipe says:

    Obrigado Fabrício!Você não precisa instalar o powershell em seus servidores SQL Server, pois os comandlets da SQLPSX utilizam os objetos SMO para se conectar e manipular o SQL Server.Inclusive em alguns testes, utilizei duas instâncias do SQL Server 2005 em VM sem o powershell instalado, executei os scripts a partir de uma máquina remota perfeitamente.Abraços!

  7. Fabrício says:

    Show… vou testar…Valeu

  8. Mario Piccin says:

    Parabens Felipe!
    Otimos exemplos. Otimo para automatizar a vida do DBA!

    []S
    Mario Piccin

  9. rafael bandeira says:

    Olá!
    Espero que possa me ajudar.
    Como faço para que o powershell leia o arquivo txt que contem a senha criptograda, segue o código.
    $pass = Get-Content c:\data\bitbarsenha.txt está certo esta linha?
    Adaptei deste link http://gallery.technet.microsoft.com/scriptcenter/80647f66-139c-40a4-bb7a-04a2d73d423c#content

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: