Windows-Server-2008

我們如何從中心位置管理多個伺服器

  • October 4, 2016

請讓我解釋一下我們如何從一個中心點管理多個伺服器。實際上我需要一個在具有相同名稱數據庫的多個伺服器上執行的應用程序。現在我想從一個位置集中我的數據庫。請讓我建議。開發人員已將 sql server 用於我的應用程序

我最喜歡 2008 的功能之一是中央管理伺服器。CMS 向我們介紹了多伺服器管理。但是,它僅在 SSMS 中顯示結果,不保存結果集。要在 SQL Server 表中獲取結果集,您唯一需要的是一個方便的 Power Shell 腳本。讓我用一個簡單的例子來解釋這個腳本。

我將預設實例 ISILEFE01 註冊為中央管理伺服器,並將兩個實例註冊為成員,命名為ISILEFE01\ISIL and ISILEFE01\EFE.

現在,讓我們執行一個非常簡單的查詢來獲取在 CMS 下註冊的所有 SQL Server 實例的版本。

這就是 CMS 所能做的。此外,我們將使用 Powershell。請查看下面的 powershell 腳本:

$CentralManagementServer = “ISILEFE01”
$HistoryDatabase = “PSDatabase”

function ResultInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedResult) 
{

$sqlQueryText = “INSERT INTO dbo.test  (servername1,servername2) VALUES(‘$EvaluatedServer’, ‘$EvaluatedResult’)”
write-output $sqlQueryText
Invoke-Sqlcmd -ServerInstance $sqlServerVariable -Database $sqlDatabaseVariable -Query $sqlQueryText

}



$sconn = new-object System.Data.SqlClient.SqlConnection(“server=$CentralManagementServer;Trusted_Connection=true”);

$q = “select name from [msdb].[dbo].[sysmanagement_shared_registered_servers_internal];”

$sconn.Open()
$cmd = new-object System.Data.SqlClient.SqlCommand ($q, $sconn);
$cmd.CommandTimeout = 0;
$dr = $cmd.ExecuteReader();



while ($dr.Read()) { 
$ServerName = $dr.GetValue(0);

     $sqlQueryText = “select @@version”

     $selectResult=Invoke-Sqlcmd -ServerInstance $ServerName -Query $sqlQueryText
     [string]$a=$selectResult.column1

     ResultInsert $CentralManagementServer $HistoryDatabase $ServerName $a;

}



$dr.Close()
$sconn.Close()

根據腳本,我想將結果放入我的預設實例 ISILEFE01 上的 sql server 表中。我在預設實例 ISILEFE01 上創建了一個名為“PSDatabase”的數據庫和一個名為“test”的表。

這裡重要的一點是,在 CMS 中註冊的 SQL Server 實例的名稱寫在一個名為“

$$ msdb $$.$$ dbo $$.$$ sysmanagement_shared_registered_servers_internal $$” 。通過對該表執行選擇查詢,我可以檢索 sql server 實例的名稱,然後在一個簡單的循環中,我可以對在 CMS 下註冊的所有實例執行任何 T-SQL 查詢。 最後,在我的主函式中,我正在呼叫一個函式來將我檢索到的值插入到“PSDatabase”下的“test”表中。現在請檢查測試表中插入的內容:

引用自:https://serverfault.com/questions/807076