Wie scanne ich SQL server-Fehlerprotokoll (und ignoriere einige Fehler) mit PowerShell?

Ich brauche ein PowerShell-Skript (2.0 kompatibel), um SQL server 2008 R2 und spätere Fehlerprotokolle zu scannen. Ich muss eine list von Phrasen zu suchen, und eine list von Phrasen auszuschließen.

param ([String]$instanceName=$(throw "Instance name was not supplied")) [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Sqlserver.SMO')|Out-Null; $sqlserver = new-object ("Microsoft.Sqlserver.Management.Smo.server") $instanceName; $r = $sqlserver.ReadErrorLog(); $find = "Error:","Failed"; $exclude = "Error: 0x2098"; # need to do something with $r here and involve $find and $exclude 

Also, zum Beispiel möchte ich alle Zeilen im ERRORLOG finden, die Error: enthalten und Failed , aber die im $exclude Array $exclude . Irgendwelche Ideen?

Hier finden Sie viele Informationen dazu: Verwenden Sie PowerShell, um SQL server 2012 Fehlerprotokolle zu parsing

Aber eine Möglichkeit zu tun, was Sie fragen ist, indem Sie die Ergebnisse bei der Einstellung $ r

 $r = $sqlserver.ReadErrorLog() | ? { $_.Text -match 'error' -OR $_.text -match 'Failed' -and $_text -notmatch "Error: 0x2098"} 

Sie können durch jede list iterieren und aktualisieren $ r entsprechend, so etwas wie unten sollte Sie begonnen haben.

 Foreach($ExcludeText in $exclude){ $r = $r | ? {$_.text -notmatch $ExcludeText} } Foreach($IncludeText in $find){ $r = $r | ?{$_.text -match $IncludeText} } 

Der obige Artikel enthält Details zur undokumentierten TSQL-Version.

http://www.mssqltips.com/sqlservertip/1476/reading-the-sql-server-log-files-using-tsql/

Ich glaube, Sie fehlen einige Parameter. Die erweiterte Prozedur xp_readerrorlog nimmt die folgenden Parameter an.

A – Anzahl der Fehlerprotokolldateien

B – 1 = SQL server Protokoll, 2 – SQL Agent Protokoll

C – Suchstring 1

D – Suchstring 2

Hier ist eine powershell-Lösung wie du gefragt hast.

Ich denke, die Reihenfolge der und / oder ist wichtig?

 $srv = new-Object Microsoft.Sqlserver.Management.Smo.server("(local)") $d = $srv.ReadErrorLog(0) foreach ($r in $d.Rows) { if ( ($r['Text'] -match 'Error:' -and $r['Text'] -notmatch 'Error: 0x2098') -or $r['Text'] -match 'Failed:' ) { Write-Host "============================================" Foreach ($c in $d.Columns) { Write-Host $c.ColumnName "=" $r[$c]} } } 

Bildbeschreibung hier eingeben