web-dev-qa-db-ja.com

Always On可用性グループ、常にユーザーを読み取り専用インスタンスにリダイレクトする

プライマリと読み取りが有効なセカンダリを持つAlways On可用性グループがあります。データベースを使用して、データベースに入れる予定のデータの正確性をチェックする実装チームのユーザーがいます。

ユーザーはデータベースから読み取る権限のみを持っていますが、AGリスナーを介して(SSMSを介して)接続する場合、常にアクティブノードに接続します。

私は彼らに直接読み取り専用インスタンスにアクセスするように試みましたが、彼らは彼らの方法で立ち往生しており、1日か2日後に彼らは再びアクティブノードに戻ってきました。

SQL Serverがこのユーザーを常に読み取り専用のインテントでリダイレクトし、そこにリダイレクトする方法はありますか?

注:追加の接続パラメーターで 'ApplicationIntent = ReadOnly'を設定しようとしましたが、これはセカンダリノードにリダイレクトされないようであり、新しいスターター用にセットアップすることを忘れるので、理想的なソリューションではありません。

SQL Server 2012 Enterprise、可用性グループ1プライマリ、同期コミット付きの読み取り可能なセカンダリ1。

ユーザーがリンクサーバーに接続したり、他のサーバーを介して接続したりするつもりはありません。ユーザーはSSMSを介してデータベースに直接接続し(他のアプリケーションはありません)、AGリスナー(またはその周辺)が利用できる場合、そのユーザーをセカンダリノードに誘導できるようにします(そこには読み取りアクセスしかありません)。ユーザーが何もせずにプライマリにアクセスしても意味がありません。ユーザーがマシン内を移動し、アプリケーションインテントを追加するのを忘れてしまうからです。また、追加の接続パラメーターにそれを追加しても、常にセカンダリノードに移動するとは限りません。

9
Ste Bov

私はあなたの質問全体に対する答えはありません(今日、同様の質問に答えました https://dba.stackexchange.com/a/137844/36812 )が、 ApplicationIntent = ReadOnlyが正しく機能しません。

読み取り専用のルーティングURLを設定しましたか?これはそのままでは実行されないため、実行しない場合、これらの設定とそのフラグは機能しません。私はそれがうまくいったなら、あなたはあなたの要件を再評価し始めることができると思います。

MSDNの手順 https://msdn.Microsoft.com/en-us/library/hh710054.aspx で、PowerShellで最も簡単に実行できます。

Set-Location SQLSERVER:\SQL\PrimaryServer\default\AvailabilityGroups\MyAg
$primaryReplica = Get-Item "AvailabilityReplicas\PrimaryServer"
$secondaryReplica = Get-Item "AvailabilityReplicas\SecondaryServer"

Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://PrimaryServer.domain.com:1433" -InputObject $primaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://SecondaryServer.domain.com:1433" -InputObject $secondaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingList "SecondaryServer","PrimaryServer" -InputObject $primaryReplica
4
Cody Konior

Ste、あなたが望んでいるのは、ポイントアンドクリックソリューションまたはどこかの設定です。残念ながら、これらのどれも現在「既製」の形で存在しません。 Microsoftがこれを登録済みサーバーの接続設定に含めて保存できるようにしておけば、本当にすばらしいでしょう。

これにより、次の2つのオプションのいずれかを使用できます。

  • 自分で何かを書く
  • ユーザーの行動を変更する

SNAC-SQL Native Access ClientのMicrosoftダウンロードに遭遇し、要件を満たす可能性のあるものを探しました。これにより、小さなコードを記述して、読み取り専用のセカンダリに直接アクセスするためのボタンをユーザーに提供できます。 https://blogs.msdn.Microsoft.com/alwaysonpro/2013/08/02/connect-to-sql-server-using-application-intent-read-only/

他の可能性は、SSMS経由で接続するときに、ユーザーに接続パラメーターダイアログの入力を強制することです。この動作を強制するには、プライマリサーバーとセカンダリサーバーのログインを変更して、プライマリへの接続を拒否し、セカンダリへの接続を許可する必要があります。 SQLエージェントジョブを使用して、サーバーのステータスを確認し、それに応じてログインを設定できます。

確かに、私は後者を実行しようとしませんでしたが、理論的にはそれでうまくいくはずです。

1