Das Sammeln von Read Routing-Informationen mit SMO ist in SQL Server 2016 ungenau

7

Ich habe kürzlich mit SMO herumgespielt, um einige Eigenschaften zu überprüfen, und bin auf ein Problem gestoßen, als ich versucht habe, Informationen zur Lese-Routing-Reihenfolge in SQL Server 2016 zu sammeln.

Bei früheren Versionen war die Routing-Liste recht einfach. Die Liste wurde in der angegebenen Reihenfolge verarbeitet. Mit 2016 wurde jedoch der Round-Robin-Algorithmus eingeführt, mit dem mehrere sekundäre Replikate den gelesenen Verkehr akzeptieren können.

Obwohl auf diese Daten über T-SQL zugegriffen werden kann, sieht es nicht so aus, als ob SMO aktualisiert wurde, um dies widerzuspiegeln. Dies bedeutet, dass Sie die Konfiguration nicht genau abrufen oder so einstellen können, da es sich immer noch um eine einfache Zeichenfolgensammlung handelt.

Fehlt mir ein Attribut, mit dem ich genaue Daten für SQL Server 2016 abrufen kann? (Beispiel SMO-Aufruf für C # unten)

Es sind nur die Round-Robin-Informationen, auf die nicht zugegriffen werden kann. Es werden alle Replikate aufgelistet, die in der Read-Routing-Liste enthalten sind. Es scheint nur nicht die verschiedenen Gruppen von Replikaten zu unterscheiden, die existieren würden.

Fehlerbericht verbinden. Connect ist tot ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SmoTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter the servername");
            string connectServer = Console.ReadLine();
            Console.WriteLine("Enter the AG name");
            string agName = Console.ReadLine();

            Server srv = new Server();

            try
            {
                srv = new Server(connectServer);
                srv.ConnectionContext.StatementTimeout = 60; //timeout after 60 seconds running the query

                foreach (AvailabilityGroup ag in srv.AvailabilityGroups)
                {
                    if (ag.Name == agName)
                    {
                        ag.PrimaryReplicaServerName.ToString());
                        foreach (AvailabilityReplica ar in ag.AvailabilityReplicas)
                        {
                            if (ar.Name.ToString() == "connectServer")
                            {
                                foreach (Object obj in ar.ReadonlyRoutingList)
                                {
                                    Console.WriteLine("  {0}", obj);
                                }
                            }
                        }
                    } 
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.InnerException.ToString());
            }
            finally
            {
                srv.ConnectionContext.Disconnect();
            }

            Console.WriteLine("press a key");
            Console.Read();
        }
    }
}
Nic
quelle

Antworten:

6

Das Problem wurde in SSMS 17.3 behoben. Sie müssen jedoch die "applokale" Assembly laden und nicht die aus dem GAC. Um "abwärtskompatibel" zu sein, ReadOnlyRoutingListbleibt die Eigenschaft außerdem eine Zeichenfolge und verhält sich wie zuvor. Der neu hinzugefügte LoadBalancedReadOnlyRoutingList(und ein Getter / Setter damit) hat die richtige Darstellung, die Sie suchen.

Connect ist tot ...

Es lebe Connect!

Code Repro (aus Gründen der Lesbarkeit zugeschnitten) So zeigen Sie neue Eigenschaften und Methoden an:

#Load the Applocal assembly from SSMS 17.4
[System.Reflection.Assembly]::LoadFrom('C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\Microsoft.SqlServer.SMO.dll')

#Create a new server instance hitting the listener named SQL2016Listen
$SI = New-Object ('Microsoft.SqlServer.Management.Smo.Server') "SQL2016Listen"

#Get the list of Availability Replicas for an Availability Group called "SeedingTest"
$ARs = $SI.AvailabilityGroups | where {$_.Name -eq "SeedingTest"} | select AvailabilityReplicas

#Grab the first replica in the list of replicas and show all of the members that have "load" somewhere in the name
$ARs.AvailabilityReplicas[0] | get-member | where {$_.name -like "*load*"} | select name
Sean Gallardy - Benutzer im Ruhestand
quelle