Thu thập thông tin Định tuyến Đọc bằng SMO là không chính xác trong SQL Server 2016


7

Tôi đã chơi xung quanh với SMO để kiểm tra một số thuộc tính gần đây và đã gặp phải một vấn đề khi cố gắng thu thập thông tin về thứ tự đọc định tuyến trong SQL Server 2016.

Với các phiên bản trước, danh sách định tuyến khá đơn giản, danh sách sẽ được xử lý theo thứ tự, nhưng với năm 2016, họ đã giới thiệu thuật toán quay vòng cho phép bạn có nhiều bản sao thứ cấp chấp nhận lưu lượng đọc.

Mặc dù dữ liệu này có thể truy cập được thông qua T-SQL, nhưng nó không xuất hiện vì SMO đã được cập nhật để phản ánh điều này, điều đó có nghĩa là bạn không thể nhận chính xác hoặc đặt cấu hình theo cách đó vì đây vẫn là một bộ sưu tập chuỗi đơn giản.

Có một số thuộc tính mà tôi đang thiếu sẽ cho phép tôi có được dữ liệu chính xác cho SQL Server 2016 không? (ví dụ SMO gọi cho C # bên dưới)

Nó chỉ là thông tin vòng tròn dường như không thể truy cập được, nó liệt kê tất cả các bản sao có trong danh sách định tuyến đọc, nó dường như không phân biệt các nhóm bản sao khác nhau sẽ tồn tại.

Kết nối báo cáo lỗi. Kết nối đã chết ...

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();
        }
    }
}

Câu trả lời:


6

Sự cố đã được khắc phục trong SSMS 17.3, tuy nhiên, bạn sẽ cần tải cụm "applocal" chứ không phải từ GAC. Ngoài ra, để "tương thích ngược", ReadOnlyRoutingListtài sản sẽ giữ nguyên một chuỗi và hành động / hành xử giống như trước đây. Trình mới được thêm vào LoadBalancedReadOnlyRoutingList(và một getter / setter với nó) sẽ có đại diện chính xác mà bạn đang tìm kiếm.

Kết nối đã chết ...

Kết nối lâu dài!

Mã Repro (cắt ra để dễ đọc) Để xem các thuộc tính và phương thức mới:

#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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.