Обнаружение кластера SQL - PullRequest
2 голосов
/ 19 января 2009

Я пытаюсь написать код, который определит, работает ли список серверов SQL. Я пытался с WMI, SQLDMO, SqlDataSourceEnumerator и Pinging порт 1433 каждого сервера, с различной степенью успеха (см. Результаты ниже).

Используя SQLDMO и SqlDataSourceEnumerator, я нашел 3 из 6, нужно сказать, что 2 из 3 отсутствующих серверов SQL образуют кластер.

Пинг-порт 1433 обнаружен 4 из 6, 2 отсутствующих - это 2 сервера, образующих кластер SQL.

WMI оказался наименее успешным, поскольку обнаружил только 1 из 6 серверов.

Вот код, который я использовал для создания прототипа обнаружения сервера:

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?

Ответы [ 2 ]

3 голосов
/ 19 января 2009

Я не знаю о DMO, который в любом случае устарел, но в SMO вы можете использовать Server.IsClustered.

Вы также можете посмотреть на это: http://www.sqldbatips.com/showarticle.asp?ID=45

1 голос
/ 19 января 2009

Почему бы не попробовать SQL-пинг ? Здесь есть исходный код, чтобы вы могли видеть, как они это делают.

Во всяком случае, некоторые мысли:

Пытаетесь ли вы использовать физический сервер, имя кластера или имя (я) виртуального сервера, например, phys1, phys2, vclus, vserv1, vserv2 (предполагается активный / активный)?

Используете ли вы tcp или именованные каналы с вашего клиента? Вы пробовали tcp: vserv1? Именованные каналы могут быть смешными, например, в кластерах IIRC, если они отключены, а затем включены. Используемые протоколы перечислены в журналах SQL, а также используемый порт tcp (с именем instance = random)

Можете ли вы создать системный DSN на своем клиенте? Отсюда вы можете определить, какой порт и протокол используется в HKLM \ SW \ Microsoft \ MSSQLServer

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...