web-dev-qa-db-ja.com

可用性グループの読み取り可能なセカンダリに関する質問

最近、SQLサーバーで問題が発生しました。 AlwaysOnクラスターの背後にある概念とメカニズムを教えてください。

背景:
1つのプライマリノードdbs1と1つのセカンダリノードdbs2でAlwaysOnクラスターを構築しました。彼らは両方の読み取り可能なセカンダリを「読み取り専用のみ」として構成したと仮定します。また、読み取り専用のルーティングリストも作成しました。 「ApplicationIntent=ReadOnly」を指定するすべての接続は、dbs2にリダイレクトされます。

問題:
dbs2で実行されている同じエージェントジョブ(mssqlからMySQLにデータを挿入するため)は不安定です-突然成功し、突然失敗します。成功した場合、エージェントセッションはdbs1ではなくdbs2に表示されます。

失敗した場合は、次のエラーが表示されました

「SQL Server '(local)'に接続できません」-エージェントジョブ履歴

「ターゲットデータベースは可用性グループにあり、現在、アプリケーションインテントが読み取り専用に設定されている場合、接続にアクセスできます。」 -SQLエラーログ

ただし、読み取り可能なセカンダリを「yes」に変更した場合、エージェントジョブは常にdbs2のセッションで正常に実行できます。

私の質問:

1)読み取りインテントのみの動作は何ですか?エージェントジョブが失敗した理由

2)成功した​​としても、エージェントジョブがdbs1に設定されている場合、セッションがdbs2ではなくdbs2にあるのはなぜですか。スクリプトの挿入/削除/更新コマンドに関連していますか?

3)読み取り意図のみと読み取り可能なセカンダリのオプションはいの違いは何ですか? 「ApplicationIntent= readonly」を指定した後も、後者のオプションの読み取り専用ルーティングが有効であることをテストしました

私は彼らのメカニズムに本当に興味があります。自由にコメントして議論してください。ありがとう。

追加情報(2017年8月4日に新規更新):

以下は、私のエージェントジョブスクリプトです。 「ApplicationIntent=ReadOnly」を指定できますか?そして、このT-SQLはSQL Serverテーブルにデータを書き込まず、別のMySQLデータベースに書き込むのではないかと混乱しています。可用性グループが許可しないのはなぜですか?繰り返しますが、BenSqlWorldWideのコメントとフィードバックに特に感謝します!

EXECUTE ( 'TRUNCATE TABLE MySQL_Table' ) AT MySQL_Server;

INSERT INTO MySQL_Server...MySQL_Table  (c1,c2,c3)  SELECT c1,c2,c3 FROM [dbs2].[SQL_Database].[dbo].[SQL_Table];
5
Owen Kiwi
  1. 「読み取り専用のみの動作は何ですか?なぜエージェントジョブが失敗したのですか?」この接続は、可用性グループ内のデータベースにデータを書き込まないことをサーバーに約束しています。 doで書き込みをしようとすると、データベースに書き込むことができないため、書き込みは失敗します。ただし、この動作を実現するには、可用性グループリスナーを通過する必要があると思います。 a)リスナーを通過し、b)ReadOnlyアプリケーションインテントを指定するクライアントからの接続のみを受け入れるようにセカンダリを構成しました。エラーは(local)に接続しようとしていることを示しているため、インスタンスに直接接続していると思われます。
  2. これは、エージェントジョブの構成方法にも関連していると思います。接続文字列には何を指定していますか? ApplicationIntent=ReadOnly(または類似のもの)を指定していない場合、プライマリに転送されます。

    すべて読み取りである場合、接続文字列はデータベースを指定していない可能性があります。 SQL Serverが使用するルーティングリストを認識できるように、データベース名を含める必要があります(サーバーで複数の可用性グループが実行されている可能性があります)。参照: AlwaysOnセカンダリは読み取り可能-applicationintent = readonlyで接続できません

  3. 「読み取りインテントのみと読み取り可能なセカンダリのオプションはいの違いは何ですか?」 2次の役割のデータベースの「読み取り専用のみ」と「任意」の違いにより、データベースが受け入れる接続の種類が決まります。前者は、何も書き込まないことを小指で誓ったクライアントからの接続のみを受け入れると言います(つまり、ApplicationIntent=ReadOnlyを指定します)。 「すべて」は何でも取ると言います(書き込みは引き続き失敗しますが、クライアントが何も書き込まないことをと言うことの要件リラックスしています)。


あなたはコメントで尋ねました:
SQLエージェントジョブT-SQLスクリプトで接続文字列AppicationIntent=ReadOnlyを指定できますか?また、私のinsertステートメントが実際にSQL ServerではなくMySQLプラットフォームをターゲットにしていることを考えると、その動作にはまだ少し混乱しています。 「読み取り専用のみ」の設定で移動できない理由、特に(ローカル)に接続しようとしないのはなぜですか?

使用しているSQLエージェントジョブの種類によって異なります。たとえば、SSISパッケージでApplicationIntent=ReadOnlyを使用しましたが、標準のTransact SQLジョブなどにそれを指定する方法がわかりません。失敗した理由に関して、明示的にApplicationIntentReadOnlyに設定した接続のみを受け入れるようにセカンダリを設定し、ジョブがそれを行わなかった場合、それは拒否されます( あなたは書き込みを行わないことを知っています)。

4
Ben Thul