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回記録されるのはなぜですか?
結局のところ、AOAGイベントID#35266は、ノードが起動または停止するときに2〜3回非常に定期的に発生します。 35266が検出されたときに何をするかが本質的にトグルに似ていない限り、問題はありません。 35266を検出したときに行うことは(イベントのテキストに応じて)特定のジョブを有効または無効にすることなので、私の場合は問題なく動作します。したがって、プライマリノードでジョブ2または3を連続して有効にしても、大したことはありません。
これが私が最終的に得たものです。
SQL Serverエージェントジョブ「RPTジョブを有効または無効にする」を作成する
次の場合を除き、デフォルトを受け入れる
ジョブステップを作成します。
コマンド:
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
スケジュール:
Create SQl Server Agent Alert 'Alert Disable Rpts on 35266'
次の場合を除き、デフォルトを受け入れる
例:セカンダリデータベース 'DB_NAME'用に確立されたプライマリデータベースとの接続
応答:
Create SQl Server Agent Alert 'Alert Enable Rpts on 35266'
次の場合を除き、デフォルトを受け入れる
例:プライマリデータベース「DB_NAME」に対して確立されたセカンダリデータベースとの接続
応答:
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を作成して、すべてのエージェントジョブを最初にマスターでチェックして、いくつかのステータスをチェックすることもできます。