سؤال

أنا أحاول كتابة بعض التعليمات البرمجية التي من شأنها تحديد ما إذا كانت قائمة ملقمات SQL تصل.لقد حاولت أن WMI ، SQLDMO, SqlDataSourceEnumerator ، الأزيز منفذ 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?

هل كانت مفيدة؟

المحلول

أنا لا أعرف عن DMO التي انتقدت على أي حال ولكن في SMO يمكنك القيام به الخادم.IsClustered.

قد تحتاج أيضا إلى النظر في هذا:http://www.sqldbatips.com/showarticle.asp?ID=45

نصائح أخرى

لماذا لا نحاول SQL بينغ?هناك شفرة المصدر هنا لذلك يمكنك أن ترى كيف يفعلون ذلك.

على أية حال, بعض الأفكار:

أنت تحاول المادية ملقم اسم الكتلة أو اسم الملقم الظاهري(s) على سبيل المثال phys1, phys2, vclus, vserv1, vserv2 (على افتراض نشط/نشط)?

هل تستخدم tcp أو توجيهات من العميل الخاص بك ؟ هل حاولت tcp:vserv1?اسمه الأنابيب يمكن أن يكون مضحكا على مجموعات IIRC إذا تم تعطيل ثم تمكين ، على سبيل المثال.البروتوكولات المستخدمة مدرجة في سجلات SQL, وكذلك منفذ tcp الذي يستخدم (مثيل مسمى = عشوائي)

يمكنك إنشاء نظام DSN على العميل الخاص بك ؟ من هذا يمكنك معرفة ما منفذ بروتوكول يستخدم تحت HKLM\SW\Microsoft\MSSQLServer

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top