2

SQLサーバーのリストが稼働しているかどうかを判断するコードを作成しようとしています。各サーバーのWMI、SQLDMO、SqlDataSourceEnumerator、およびPingポート1433を試しましたが、成功の度合いはさまざまです(以下の結果を参照)。

SQLDMOとSqlDataSourceEnumeratorを使用して、6つのうち3つを見つけました。これは、3つの欠落しているSQLサーバーのうち2つがクラスターを形成していると言わなければなりません。

pingポート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サーバーを解決/検出する方法に関するアイデアはありますか?

4

2 に答える 2

3

とにかく廃止されたDMOについては知りませんが、SMOではServer.IsClusteredを実行できます。

これも参照してください: http://www.sqldbatips.com/showarticle.asp?ID=45

于 2009-01-19T18:15:27.503 に答える
1

SQL pingを試してみませんか? ここにソースコードがあるので、彼らがどのようにそれを行うかを見ることができます.

とにかく、いくつかの考え:

物理サーバー、クラスター名、または仮想サーバー名 (phys1、phys2、vclus、vserv1、vserv2 (アクティブ/アクティブを想定) など) を試していますか?

クライアントから tcp または名前付きパイプを使用していますか? tcp:vserv1 を試しましたか? 名前付きパイプは、たとえば、無効にしてから有効にすると、クラスター IIRC でおかしくなることがあります。使用されているプロトコルは、使用されている tcp ポート (名前付きインスタンス = ランダム) と同様に、SQL ログに一覧表示されます。

クライアントでシステム DSN を作成できますか? これにより、HKLM\SW\Microsoft\MSSQLServer で使用されているポートとプロトコルを特定できます。

于 2009-01-19T20:39:11.817 に答える