2015-09-21 49 views
1

今天我需要您對PowerShell的幫助。我有一個配置爲中央管理服務器(CMS)的SQL Server實例(在名爲VMDEV-APP11的服務器上),其中我已註冊了所有Dev/Test/Prod SQL實例,並且我想使用PowerShell從SQL Server錯誤日誌中讀取SQL Server錯誤日誌我所有的服務器。我有一個查詢,它檢索我所有的SQL Server實例,但是當我將這個輸出輸入到ReadErrorLog的調用中時,出現錯誤。如何讓powershell讀取SQL Server錯誤日誌

這是檢索我被登記在我的CMS的SQL Server實例的列表的代碼(注意,我不包括我的SQL Server 2000個實例):

Set-Location D:\MSSQL11.MSSQLSERVER\CMS 
# Define functions to query SQL Server and write data to a SQL table 
. ./invoke-sqlcmd2.ps1 
. ./write-datatable.ps1 

Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'" 

server_name 
----------- 
INF-SRV14 
VMDEV-APP15 
NEX-SRV48 
... 

這是我的想法會工作和錯誤我真正得到:

Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'" | foreach-object { $_.server_name.ReadErrorLog() } 

錯誤:

Method invocation failed because [System.String] does not contain a method named 'ReadErrorLog'.
At D:\MSSQL11.MSSQLSERVER\CMS\db_errorlog.ps1:38 char:284
+ ... reach-object { $_.server_name.ReadErrorLog() }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

我suspec我需要將我的查詢返回的字符串轉換爲另一種類型的對象(服務器名稱可能?),以便讓ReadErrorLog()調用正常工作,但我不知道該怎麼做。

有什麼建議嗎?

任何幫助將不勝感激。

+2

你從哪裏得到.ReadErrorLog()方法? –

+0

我正嘗試使用基於此站點的ReadErrorLog():http://blogs.technet.com/b/heyscriptingguy/archive/2012/10/22/use-powershell-to-parse-sql-server-2012- error-logs.aspx – Ken

回答

0

你試圖調用一個DataRow列值,這是一個字符串ReadErrorLog()方法。

你需要做的是這樣的:

Import-Module sqlps -DisableNameChecking 

Invoke-sqlcmd2 -ServerInstance "VMDEV-APP11" -Database dba -Query "select s.server_name from msdb.dbo.sysmanagement_shared_registered_servers s, msdb.dbo.sysmanagement_shared_server_groups g where s.server_group_id = g.server_group_id and g.name not like '2000%'" | ` 
foreach-object { 
    $server = $_.server_name 
    $logs = (get-item SQLSERVER:\sql\$server\default).ReadErrorLog() 
    # $logs is a DataTable so you can iterate the rows however you wish 
} 

此假設所有的服務器都默認情況下,否則你可能需要反覆折騰一點,以針對特定的實例。

+0

謝謝Kev。不幸的是我有一些命名實例。我嘗試了下面的代碼:'Invoke-sqlcmd2 | ' 'foreach-object {If($ _。server_name-like「* \ *」){$ server = $ _。server_name} else {$ server = $ _。server_name +「\ default」} $ server = $ _ .server_name $ logs =(get-item SQLSERVER:\ sql \ $ server).ReadErrorLog()}'這適用於命名實例,但不適用於默認實例。有什麼不對的建議嗎? – Ken

+0

D'oh:我剛剛在之前的評論中看到了我的錯誤。有一個額外的'$ server = $ _。server_name'應該被刪除。我現在很好。 – Ken

+0

@Ken - 很酷,很高興幫助。如果答案是有用的,那麼你可以標記爲正確的,也可以選擇upvote。 – Kev

0

我我的SQL中央管理服務器上運行的代碼是:

$logs = 0..6 | % { (get-item SQLSERVER:\sql\<servername>\default).ReadErrorLog($_) } 

本來,我得到這個通過添加跑了PowerShell代碼到本地管理員 Windows組的服務帳戶工作AND在遠程SQL服務器主機上創建SQL登錄sysadmin權限。不出所料,我的安全官員對此有疑問。我最初的嘗試,以減少訪問導致我出現以下錯誤:

WARNING: Could not obtain SQL Server Service information. An attempt to connect 
to WMI on 'NEX-SRV1' failed with the following error: SQL Server WMI provider 
is not available on NEX-SRV1. --> Invalid namespace 

頗有幾分鬼混後,我有我的想法是讀取SQL錯誤日誌所需的最低安全性。在運行SQL Server數據庫的遠程服務器上執行以下補助:

本地Windows組

  • 服務帳戶添加到 「分佈式COM用戶」 組

WMIMgmt。 msc

使用所有安全選項將服務帳戶添加到以下每個分支除了「Edit Se保障」

  • 根> CIMV2
  • 根> CIMV2> ms_409
  • 根>微軟>的SQLServer> ComputerManagement

SQL服務器

  • 創建SQL登錄該服務帳戶並將其添加到「安全管理員」角色。

在我做出這些更改後,我有能力從中央位置監視SQL錯誤日誌,而不必授予對服務帳戶的瘋狂級別的訪問權限。