私は最近、いくつかのプロパティをチェックするためにSMOをいじってみましたが、SQL Server 2016で読み取りルーティングの順序に関する情報を収集しようとすると問題が発生しました。
以前のバージョンではルーティングリストは非常にシンプルで、リストは表示された順に処理されていましたが、2016年にはラウンドロビンアルゴリズムが導入され、複数のセカンダリレプリカで読み取りトラフィックを受け入れることができました。
このデータはT-SQLを介してアクセスできますが、SMOがこれを反映するように更新されているようには見えません。つまり、単純な文字列コレクションであるため、構成を正確に取得または設定することができません。
SQL Server 2016の正確なデータを取得するために欠けている属性はありますか? (以下のC#のSMO呼び出しの例)
アクセスできないように見えるのはラウンドロビン情報だけで、読み取りルーティングリストにあるすべてのレプリカが一覧表示されます。存在するレプリカのさまざまなグループを区別していないようです。
接続バグレポート接続が停止しています...
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();
}
}
}
この問題はSSMS 17.3で修正されましたが、GACからではなく、「applocal」アセンブリをロードする必要があります。さらに、「下位互換性」を維持するために、ReadOnlyRoutingList
プロパティは文字列のままで、以前と同じように動作します。 新規追加されたLoadBalancedReadOnlyRoutingList
(およびそれを使用したゲッター/セッター)は、探している正しい表現になります。
接続が死んでいます...
長生きコネクト!
コードの再現(読みやすくするために省略)新しいプロパティとメソッドを表示するには:
#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