アクティブなサーバーとパッシブサーバーを判別して、自動的にSQLエージェントジョブを有効または無効にしたいと考えています。つまり、ジョブが有効になっているプライマリサーバがセカンダリサーバにフェールオーバーすると、ジョブは無効になり、セカンダリサーバ(今はプライマリ)上のジョブが有効になります。SQLエージェントジョブを自動的に有効/無効にする
私は私が必要とする正確に何をして私の基準をわずかに修正したスクリプトが見つかりました: http://sqlmag.com/blog/alwayson-availability-groups-and-sql-server-jobs-part-28-additional-options-tackling-jobs-failo
ALTER procedure [dbo].[SQLAgentJobFailover] (@agname varchar(200))
AS
BEGIN
declare @is_primary_replicate bit
declare @job_name VARCHAR(100) = 'MySQLAgentJobName'
declare @job_enabled bit
select @is_primary_replicate = master.dbo.fn_hadr_group_is_primary(@agname)
declare job_cursor cursor for
select s.name from msdb.dbo.sysjobs s
inner join msdb.dbo.syscategories c on s.category_id = c.category_id
where c.name = @agname
order by name
open job_cursor
fetch next from job_cursor into @job_name
while @@fetch_status = 0
begin
select @job_enabled=enabled from msdb.dbo.sysjobs where name = @job_name
if @is_primary_replicate = 1
begin
if @job_enabled = 1
print @job_name+' enabled on primary. do nothing'
else
begin
print @job_name+' disabled on primary. enable it !'
exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 1
end
end
else if (@is_primary_replicate = 0)
begin
if @job_enabled = 1
begin
print @job_name+' enabled on secondary. disable it !'
exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 0
end
else
print @job_name+' disabled on secondary. do nothing'
end
fetch next from job_cursor into @job_name
end
close job_cursor
deallocate job_cursor
END
GO
また、ここでは、関数のスクリプトです:
ALTER FUNCTION dbo.fn_hadr_group_is_primary (@AGName sysname)
RETURNS bit
AS
BEGIN
DECLARE @PrimaryReplica sysname;
SELECT @PrimaryReplica = hags.primary_replica
FROM
sys.dm_hadr_availability_group_states hags
INNER JOIN sys.availability_groups ag ON ag.group_id = hags.group_id
WHERE
ag.name = @AGName;
IF UPPER(@PrimaryReplica) = UPPER(@@SERVERNAME)
RETURN 1; -- primary
RETURN 0; -- not primary
END;
GO
しかし、私は実行時にセカンダリサーバーは次のようになります。
exec master.dbo.SQLAgentJobFailover @agname = 'CorpAnalyticsAG'
コマンドは正常に完了しましたが、ジョブは無効になっていません。
私には理由が分かりません。以下は
は私のAG名
任意のアイデアですか?
と同じであるかどうかをテストする必要がありますか?変数@job_nameを何かに設定することは、カーソル内で直ちに変更するので無駄です。あなたが1つの仕事のためにこれをやろうとするならば、あなたは全くカーソルを必要としません。また、masterや他の場所に関数dbo.fn_hadr_group_is_primaryを作成しましたか?その関数のコードを貼り付けて、それが良いかどうかを確認します。また、おそらくあなたは正しい(at)agname(可用性グループ名)を渡していないので、カーソル選択で行が返されず、何も処理が行われません..... – Matt
はい、110%右ですカーソルが必要です。私はカーソルセクションをコメントアウトするとすぐに思えた、ストアドプロシージャが正常に実行され、ジョブを有効にしました。あなたがあなたのコメントを答えとして書くなら、私は喜んでそれを受け入れるでしょう – AznDevil92
@Mattは上記のコメントのためにあなたにタグを付けると考えました – AznDevil92