web-dev-qa-db-ja.com

AOAGフェイルオーバー時にレポートジョブを自動的に有効または無効にするにはどうすればよいですか?

2つのDBサーバーを備えたAlwaysOn Availability Groupがあります。これらのDBサーバーのいずれかが再起動されたときに(なんらかの理由で電源がオフになった後)、SQL Server Agent Alertsを使用して、いくつかのSQL Server Agentジョブ(セカンダリでは実行しないでください)をプログラムで無効にしようとしています。

DBサーバーの電源を入れると、メッセージ35266、たとえばAlwaysOn Availability Groups connection with primary database established for secondary database 'XXXX' ......が記録されます。そのため、アラートを設定してジョブを実行し、前述のジョブを無効にすることができます。ただし、このメッセージはデータベースごとに2回、常に1つずつ次々と記録されることに気づきました。

メッセージ#35266がデータベースごとに2回記録されるのはなぜですか?

1

結局のところ、AOAGイベントID#35266は、ノードが起動または停止するときに2〜3回非常に定期的に発生します。 35266が検出されたときに何をするかが本質的にトグルに似ていない限り、問題はありません。 35266を検出したときに行うことは(イベントのテキストに応じて)特定のジョブを有効または無効にすることなので、私の場合は問題なく動作します。したがって、プライマリノードでジョブ2または3を連続して有効にしても、大したことはありません。

これが私が最終的に得たものです。

SQL Serverエージェントジョブ「RPTジョブを有効または無効にする」を作成する

次の場合を除き、デフォルトを受け入れる

  • 名前:Rptジョブを有効または無効にする
  • 所有者:T-SQLを実行してSQL Serverエージェントジョブを有効/無効にする権限を持つアカウント
  • 有効:オン

ジョブステップを作成します。

  • ステップ名:enable_or_disable
  • タイプ:Transact-SQLスクリプト
  • データベース:マスター

コマンド:

DECLARE @DB nvarchar(25)
DECLARE @MSG nvarchar(200)
SET @DB = '{DB name that provides report data}'

If sys.fn_hadr_is_primary_replica ( @DB ) = 1  
BEGIN 
    EXEC msdb.dbo.sp_update_job @job_name='{job name}',@enabled = 1
    .
    .
    .
    EXEC msdb.dbo.sp_update_job @job_name='{job name}',@enabled = 1
    SET @MSG = '"' + @DB + '" is PRIMARY. Enabled report jobs'
    PRINT @MSG
END 
ELSE
BEGIN
    EXEC msdb.dbo.sp_update_job @job_name='{job name}',@enabled = 0
        .
        .
        .
    EXEC msdb.dbo.sp_update_job @job_name='{job name}',@enabled = 1
    SET @MSG = '"' + @DB + '" is not PRIMARY. Disabled report jobs'
    PRINT @MSG
END

スケジュール:

  • 有効:はい
  • スケジュールの種類:SQL Serverエージェントの開始時に自動的に開始する

Create SQl Server Agent Alert 'Alert Disable Rpts on 35266'

次の場合を除き、デフォルトを受け入れる

  • 名前:35266のアラート無効Rpts
  • データベース名:
  • エラー番号:35266
  • メッセージに次の内容が含まれている場合に警告を発する:オン
  • メッセージテキスト:セカンダリデータベース '{レポートデータを提供するDB名}'に対して確立されたプライマリデータベースとの接続

例:セカンダリデータベース 'DB_NAME'用に確立されたプライマリデータベースとの接続

応答:

  • ジョブを実行:チェック
  • ジョブを選択:Rptジョブを有効または無効にする

Create SQl Server Agent Alert 'Alert Enable Rpts on 35266'

次の場合を除き、デフォルトを受け入れる

  • 名前:35266のアラート有効化Rpts
  • データベース名:
  • エラー番号:35266
  • メッセージに次のものが含まれている場合に警告を発する:オン
  • メッセージテキスト:プライマリデータベース '{レポートデータを提供するDB名}'に対して確立されたセカンダリデータベースとの接続

例:プライマリデータベース「DB_NAME」に対して確立されたセカンダリデータベースとの接続

応答:

  • ジョブを実行:チェック
  • ジョブを選択:Rptジョブを有効または無効にする
2

SQL Serverエージェントアラートを使用して、少数のSQL Serverエージェントジョブ(セカンダリで実行してはならない)をプログラムで無効にしようとしています

それを行う代わりに、レプリカがプライマリであるかどうかを確認してください:

If sys.fn_hadr_is_primary_replica ( @dbname ) <> 1   
BEGIN  
-- If this is not the primary replica, exit (probably without error).  
END  
-- If this is the primary replica, continue to do your stuff.  

一般的なSPを作成して、すべてのエージェントジョブを最初にマスターでチェックして、いくつかのステータスをチェックすることもできます。

  • レプリカがプライマリかどうかを確認します
  • データベースがミラーリングまたはAlwaysON可用性グループの一部であり、アクセス可能かどうかを確認します。
1
Kin Shah