Todos os scripts eu criei um database chamado DBA no meu servidor central e um schema diario. As tabelas sermpre serão criadas neste schema e database.

ESTE SCRIPT EM PARTICULAR USA OUTRO TXT DE SERVIDORES, POIS NESTE NÃO PASSAMOS AS INSTÂNCIAS E SIM SOMENTE O SERVIDOR. EU O CHAMEI DE SERVIDORESDEFAULT.TXT  e fica

SERVER1
SERVER2
SERVER3

Os dois primeiros são 2008 e o terceiro 2005

Eu o gravo numa pasta chamada c:\dadosps, vocês irão ver esta chamada em todos os scripts

Este script varre o evetlog (application) de todos os servidores, procura por type  "error|erro|warning" quando tiver "*SQL*" no source e 1 dia anterior a data de hoje. Joga pra um XML e grava numa tabela SQL SERVER com datatype XML.

Criar a Tabela no SQL SERVER

Create table Diario.tb_Eventlog(servidor varchar(50),Data datetime,valores XML)

Script PS

$ServidorCentral = "SERVER1\MSSQLSERVER_1"
$DatabaseCentral = "DBA"

$sql = "truncate table Diario.Eventlog"
Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql

$Datas=(get-date).adddays(- 1).ToUniversalTime().ToShortDateString()
$Datahoje = (get-date).ToShortDateString()

foreach ($svr in get-content "C:\dadosps\servidoresdefault.txt" )
{

    $Evtlog = ""
    $Evtlog = new-Object System.Diagnostics.Eventlog("application",$svr)
    $Evtlog.Entries | where-object {$_.entrytype -match "(Warning|Error|Erro)" -and $_.source -like "*SQL*" -and $_.timegenerated.ToUniversalTime().ToShortDateString() -eq $Datas } | export-clixml "c:\dadosps\Eventlog.xml"

    $valores = Get-Content "c:\dadosps\Eventlog.xml"
    $valores = $valores -replace "'", "''"

    $sql = "set dateformat dmy insert into diario.eventlog (servidor,data,valores) values ('$svr','$DataHoje','$valores')"
    Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql

del c:\dadosps\Eventlog.xml

}

 
 
Assim são inseridos numa tabela os eventos encontrados com "(Warning|Error|Erro)"  na entrada (entrytype) (fonte) e que o source seja *SQL*
 
A idéia é pegar estes exemplos e transformá-los em funções. Assim podemos usar em varios scripts.
Como fariamos em função ?. A idéia da função é ela ser geral ou seja, passaremos o source que queremos procurar, não somente o sql server como esta hard code no exemplo acima.
 
Function get-eventviewer ([string] $servidor, [string] $source,[datetime] $datas )
{
    $Evtlog = ""
    $Evtlog = new-Object System.Diagnostics.Eventlog("application",$servidor)
    $Evtlog.Entries | where-object {$_.entrytype -match "(Warning|Error|Erro)" -and $_.source -like $Source -and $_.timegenerated.ToUniversalTime().ToShortDateString() -eq $Datas } | select-object  TimeGenerated,Category,Eventid,Message,source,entrytype | export-clixml "c:\dadosps\Eventlog.xml"
   
    $Retorno = Get-Content "c:\dadosps\Eventlog.xml"
    $Retorno = $valores -replace "'", "''"

    del c:\dadosps\Eventlog.xml
    Return $Retorno
}
 
Assim eu passo o servidor e o aonde quero procurar se é SQL SERVER = *MSSQL*  ou qualquer outro sempre lembrando que se quiser trabalhar com o wildcard use o * .
Ela manda retorna um XML contendo os eventos encontrados do servidor.
 
Para rodar
 
$xml = get-eventviewer WINDOWS-6D9049D *MSSQL* 2008-11-05
$xml
 
 
Abraços a todos
 

No meu primeiro Artigo eu mostro como rodar os scripts

PowerShell e o dia a dia do DBA SQL SERVER - INTRODUÇÃO e checando a conectividade de linked servers

 

 

Laerte Poltronieri Junior
PowerShell no Dia a Dia do DBA 
http://laertejuniordba.spaces.live.com