首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测SQL集群

检测SQL集群
EN

Stack Overflow用户
提问于 2009-01-19 17:02:28
回答 2查看 1.2K关注 0票数 2

我正在尝试编写一些代码,以确定SQL服务器的列表是否已出现。我尝试过每个服务器的WMI、SQLDMO、SqlDataSourceEnumerator和port 1433,并取得了不同程度的成功(见下面的结果)。

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

Pingport1433发现了6个中的4个,缺少的2个是构成SQL集群的2个服务器。

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

下面是我用来创建服务器发现原型的代码:

代码语言:javascript
复制
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服务器的任何想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-19 18:15:27

我不知道DMO,但在SMO中,您可以做Server.IsClustered。

您可能还想看看以下内容:http://www.sqldbatips.com/showarticle.asp?ID=45

票数 3
EN

Stack Overflow用户

发布于 2009-01-19 20:39:11

为什么不试试SQL ping呢?这里有源代码,您可以看到它们是如何实现的。

总之,有些想法:

您是否尝试物理服务器、集群名称或虚拟服务器名称(例如phys1、phys2、vclus、vserv1、vserv2 (假设为活动/活动)?

您正在使用来自客户端的tcp或命名管道吗?您试过tcp:vserv1 1吗?例如,如果禁用了命名管道,那么集群IIRC上的命名管道就会很有趣。所使用的协议列在SQL日志中,以及所使用的tcp端口(命名实例=随机)中。

您能在客户端上创建系统DSN吗?由此,您可以计算出HKLM\SW\Microsoft\MSSQLServer下使用的端口和协议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/458328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档