检测SQL集群

问题描述:

我正在尝试编写一些代码来确定SQL服务器列表是否启动。我尝试过每台服务器的WMI,SQLDMO,SqlDataSourceEnumerator和Ping端口1433,但都取得了不同程度的成功(请参阅下面的结果)。检测SQL集群

使用SQLDMO和SqlDataSourceEnumerator,我发现3中有6个,必须说3个缺少SQL服务器中的2个组成了一个群集。

Pinging端口1433在6个中找到4个,缺少2个是组成SQL集群的2个服务器。

WMI证明是最不成功的,因为它只在6台服务器中找到1台。

这里是我以前的原型服务器发现的代码:

private void buildServerMap(bool useLibCOM) 
    { 
     sqlServersMap = new Dictionary<string, string>(); 

     if (useLibCOM) 
     { 
      //get all available SQL Servers  
      SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); 
      SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); 

      ArrayList servs = new ArrayList(); 
      for (int i = 0; i < sqlServers.Count; i++) 
      { 
       object srv = sqlServers.Item(i + 1); 

       if (srv != null) 
       { 
        sqlServersMap.Add(srv.ToString(), srv.ToString()); 
       } 
      } 
     } 
     else 
     { 
      System.Data.Sql.SqlDataSourceEnumerator enumSQL = System.Data.Sql.SqlDataSourceEnumerator.Instance; 

      System.Data.DataTable table = enumSQL.GetDataSources(); 

      foreach (System.Data.DataRow row in table.Rows) 
      { 

       foreach (System.Data.DataColumn col in table.Columns) 
       { 
        sqlServersMap.Add((string)row[col], (string)row[col]); 
       } 
      } 
     } 
    } 

    private bool pingSqlServer(string server) 
    { 
     bool success = false; 

     TcpClient client = new TcpClient(); 

     try 
     {   
      client.Connect(server, 1433); 

      success = true; 
     } 
     catch (Exception) 
     { 

      //throw; 
     } 

     return success; 
    } 

    public StringBuilder buildWmiServerList(string path, string sqlServer, string sqlServerServiceName, StringBuilder sb, out bool reportNeeded) 
    { 
     reportNeeded = false; 

     try 
     { 
      ManagementScope ms = new ManagementScope(path); 

      ms.Connect(); 

      ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service WHERE Started = TRUE AND DisplayName='" + sqlServerServiceName + "'"); 
      searcher.Scope = ms; 

      if (searcher != null && searcher.Get() != null) 
      { 
       foreach (ManagementObject service in searcher.Get()) 
       { 
        sb.Append(sqlServer + " SQL Server service - RUNNING\n"); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      sb.Append(sqlServer + " SQL Server service - UNVERIFIABLE\n"); 
      reportNeeded = true; 
     } 

     return sb; 
    } 

在如何解决任何想法/检测形成SQL集群SQL服务器?

+0

任何完整的解决方案源代码? – Kiquenet 2011-01-26 20:43:29

我不知道DMO,不管怎么说都不推荐使用,但在SMO中可以使用Server.IsClustered。

,你可能也想看看这个: http://www.sqldbatips.com/showarticle.asp?ID=45

为什么不试试SQL ping?这里有源代码,所以你可以看到他们是如何做到的。

无论如何,一些想法:

你们是不是在物理服务器,集群名称或虚拟服务器名称(S)如phys1,phys2,vclus,vserv1,vserv2(假设主动/主动)?

您是从客户端使用tcp还是命名管道?你尝试过tcp:vserv1吗? 例如,如果已禁用然后启用命名管道,则可以在集群IIRC上使用命名管道。 使用的协议列在SQL日志中,以及使用的tcp端口(名为instance = random)

您能在客户端上创建系统DSN吗?从这里,你可以计算出在HKLM \ SW \ Microsoft \ MSSQLServer下使用什么端口和协议?

+0

无法保证服务器正在使用端口1433。 – 2009-01-23 16:03:04