web-dev-qa-db-ja.com

AlwaysOn可用性グループのプライマリレプリカでのみSQLジョブを実行する方法

AlwaysOn可用性グループのプライマリレプリカでのみ必要なSQLジョブがあります。ジョブが最初に作成されたとき、サーバーAはプライマリでしたが、後でサーバーBがプライマリになり、サーバーAにあるジョブは失敗し、ジョブを適切に実行するには手動でサーバーBに再作成する必要がありました。

AlwaysOn可用性グループのプライマリレプリカでのみジョブを実行する方法は何ですか?

2

プライマリノードでのみジョブを実行する簡単な方法は、ジョブの実行時にどのジョブが'PRIMARY'であるかを確認するためにジョブの簡単なチェックを行うことです。これは簡単なsqlステートメントで実行できます。

DECLARE @ServerName NVARCHAR(256)  = @@SERVERNAME 
DECLARE @RoleDesc NVARCHAR(60)

SELECT @RoleDesc = a.role_desc
    FROM sys.dm_hadr_availability_replica_states AS a
    JOIN sys.availability_replicas AS b
        ON b.replica_id = a.replica_id
WHERE b.replica_server_name = @ServerName

IF @RoleDesc = 'PRIMARY'
BEGIN
    --Logic for the job goes here
END

次に、BEGINENDキーワードの間にロジックを配置します。

Aaronがコメントで指摘したのと同じように、同じロジックですべてのサーバーにジョブを作成して、セカンダリレプリカではなくプライマリレプリカでのみ実行されるようにする必要があります。プライマリレプリカからセカンダリレプリカにジョブをコピーするために使用できるスクリプトとツールがあります。

7