2009-01-19 77 views
2

我正在嘗試編寫一些代碼來確定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

回答

1

爲什麼不試試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