最近、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データベースに書き込むのではないかと混乱しています。可用性グループが許可しないのはなぜですか?繰り返しますが、BenとSqlWorldWideのコメントとフィードバックに特に感謝します!
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];
(local)
に接続しようとしていることを示しているため、インスタンスに直接接続していると思われます。これは、エージェントジョブの構成方法にも関連していると思います。接続文字列には何を指定していますか? ApplicationIntent=ReadOnly
(または類似のもの)を指定していない場合、プライマリに転送されます。
すべて読み取りである場合、接続文字列はデータベースを指定していない可能性があります。 SQL Serverが使用するルーティングリストを認識できるように、データベース名を含める必要があります(サーバーで複数の可用性グループが実行されている可能性があります)。参照: AlwaysOnセカンダリは読み取り可能-applicationintent = readonlyで接続できません
「読み取りインテントのみと読み取り可能なセカンダリのオプションはいの違いは何ですか?」 2次の役割のデータベースの「読み取り専用のみ」と「任意」の違いにより、データベースが受け入れる接続の種類が決まります。前者は、何も書き込まないことを小指で誓ったクライアントからの接続のみを受け入れると言います(つまり、ApplicationIntent=ReadOnly
を指定します)。 「すべて」は何でも取ると言います(書き込みは引き続き失敗しますが、クライアントが何も書き込まないことをと言うことの要件リラックスしています)。
あなたはコメントで尋ねました:
SQLエージェントジョブT-SQLスクリプトで接続文字列AppicationIntent=ReadOnly
を指定できますか?また、私のinsertステートメントが実際にSQL ServerではなくMySQLプラットフォームをターゲットにしていることを考えると、その動作にはまだ少し混乱しています。 「読み取り専用のみ」の設定で移動できない理由、特に(ローカル)に接続しようとしないのはなぜですか?
使用しているSQLエージェントジョブの種類によって異なります。たとえば、SSISパッケージでApplicationIntent=ReadOnly
を使用しましたが、標準のTransact SQLジョブなどにそれを指定する方法がわかりません。失敗した理由に関して、明示的にApplicationIntent
をReadOnly
に設定した接続のみを受け入れるようにセカンダリを設定し、ジョブがそれを行わなかった場合、それは拒否されます( あなたは書き込みを行わないことを知っています)。