Программно получить виртуальное имя кластера SQL - PullRequest
2 голосов
/ 03 февраля 2010

Я написал службу Windows для сбора информации со всех наших серверов SQL. Служба устанавливается на каждый сервер и, используя WMI и SMO, вставляет соответствующую системную информацию обратно в центральную базу данных. Чтобы получить информацию о SQL, я использую следующий код c #:

        List<Server> sqlServers = new List<Server>(); //List of Smo.Server objects
        string registrySubKey = @"SOFTWARE\Microsoft\Microsoft SQL Server";
        string registryValue = "InstalledInstances";

        try
        {
            RegistryKey rk = Registry.LocalMachine.OpenSubKey(registrySubKey);
            string[] instances = (string[])rk.GetValue(registryValue);
            if (instances.Length > 0)
            {
                foreach (string element in instances)
                {
                    Server s;
                    string serverInstance;

                    if (element == "MSSQLSERVER") //If default instance
                    {
                        serverInstance = System.Environment.MachineName;
                    }
                    else
                    {
                        serverInstance = System.Environment.MachineName + @"\" + element;
                    }

                    s = new Server(serverInstance);

                    if (s != null)
                    {
                        sqlServers.Add(s);
                    }
                }
            }
        }

Единственная проблема, с которой я сталкиваюсь - это наши кластеры SQL.

Для тех из вас, кто не знаком с активной / пассивной кластеризацией sql, вы не можете подключиться напрямую к одному из узлов. Вместо этого кластер sql получает виртуальное имя и другой IP-адрес, к которому затем будут подключаться клиенты.

Текущий код, который я имею, попытается подключиться к NodeName \ instanceName, который, очевидно, не будет работать в кластере. Вместо этого мне нужно программно найти виртуальное имя кластера SQL, к которому принадлежит этот узел, и подключиться к нему.

Я думал, что смогу получить эту информацию из класса WMI MSCluster_Cluster, но это даст мне только виртуальное имя кластера, а не виртуальное имя кластера SQL.

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

С этим кодом:

using System.Management;

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\MSCluster", "SELECT * FROM MSCluster_Resource"); 

foreach (ManagementObject queryObj in searcher.Get())
{
    Console.WriteLine("Name: {0}", queryObj["Name"]);
}

Я вижу свое имя кластера SQL (2008CLUSTERSQL) в виде двух выходных данных:

Имя: SQL IP-адрес i (2008CLUSTERSQL)

Имя: Сетевое имя SQL (2008CLUSTERSQL)

Поможет ли это? Я думаю, вы можете извлечь имя из этого?

Я получил этот код от WMI Code Creator (http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en), очень полезный инструмент для просмотра различных пространств имен / классов / свойств WMI.

1 голос
/ 11 февраля 2010

Не могли бы вы использовать запрос WMI с классами WMI mscluster?

http://technet.microsoft.com/en-us/library/cc780572(WS.10).aspx http://blogs.msdn.com/clustering/archive/2008/01/08/7024031.aspx

Под запросом я имею в виду опрос всех ресурсов / групп кластера, чтобы найти сетевое имя SQL Server.

...