我们如何从中心位置管理多个服务器

我们如何从中心位置管理多个服务器

请让我解释一下我们如何从中心点管理多台服务器。实际上,我需要一个在具有同名数据库的多台服务器上运行的应用程序。现在我想从一个位置集中我的数据库。请让我提出建议。开发人员已将 SQL Server 用于我的应用程序

答案1

2008 中我最喜欢的功能之一是中央管理服务器。CMS 为我们介绍了多服务器管理。但是,它只在 SSMS 中显示结果,而不保存结果集。要获取 SQL Server 表中的结果集,您唯一需要的是一个方便的 Power Shell 脚本。让我用一个简单的例子来解释这个脚本。

我将默认实例 ISILEFE01 注册为中央管理服务器,并将两个实例注册为成员,命名为ISILEFE01\ISIL and ISILEFE01\EFE.

现在,让我们运行一个非常简单的查询来获取 CMS 下注册的所有 SQL 服务器实例的版本。

这就是 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”下的“测试”表中。现在请检查测试表中插入了什么:

相关内容