【问题标题】:How to scan SQL Server error log (and ignore some errors) with PowerShell?如何使用 PowerShell 扫描 SQL Server 错误日志(并忽略一些错误)?
【发布时间】:2013-11-27 15:59:43
【问题描述】:

我需要一个 PowerShell 脚本(兼容 2.0)来扫描 SQL Server 2008 R2 和更高版本的错误日志。我需要一个要搜索的短语列表和要排除的短语列表。

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

因此,例如,我想查找 ERRORLOG 中包含Error:Failed 的所有行,但排除$exclude 数组中的行。有什么想法吗?

【问题讨论】:

    标签: sql-server powershell smo


    【解决方案1】:

    您可以在这里找到很多关于此的信息: Use PowerShell to Parse SQL Server 2012 Error Logs

    但一种方法是在设置 $r 时过滤结果

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

    您可以遍历每个列表并相应地更新 $r,如下所示应该可以帮助您入门。

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

    【讨论】:

    • 谢谢,但是查找和排除数组可能会增长,我想知道如何处理数组,有什么想法吗?
    • 我添加了另一个示例,我认为它更接近您的要求。
    【解决方案2】:

    以上文章详细介绍了未记录的 TSQL 版本。

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

    我认为您缺少一些参数。 xp_readerrorlog 扩展过程采用以下参数。

    A - 错误日志文件的数量

    B - 1 = SQL Server 日志,2 - SQL 代理日志

    C - 搜索字符串 1

    D - 搜索字符串 2

    【讨论】:

    • 谢谢,但我对 T-SQL 解决方案不感兴趣,而且该脚本在 T-SQL 中并不能满足我的要求。
    【解决方案3】:

    这是您询问的 powershell 解决方案。

    我认为 and/or 的顺序很重要??

    $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]}
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2011-07-27
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      相关资源
      最近更新 更多