1

我可以在 SQL Server 数据库服务器上的数据库中的distribution某处找到复制是否是连续的?msdb(2005 年和 2008 年)

背景:我正在制作一个复制监控系统,当复制在 X 时间内没有成功合并时,它会发出警报(通过电子邮件)。为此,我定期查询distribution数据库MSreplication_monitordataMSmerge_sessions表。为了测试复制是否超过了警报时间,我对每个条目执行以下操作,MSreplication_monitordata以查看上次成功复制的时间:

select top 1 end_time
from MSmerge_sessions
where runstatus=2 and agent_id=@AgentId
order by end_time desc

runstatus=2 过滤器仅用于“完成”状态(请参阅文档

问题是连续复制只有一个MSmerge_sessions条目不断更新其 end_time,但其状态也为 3,这意味着“正在进行”。我不能只测试那个,因为这会返回非连续复制会话,这些会话可能在完成之前失败。

我尝试查看该MSmerge_sessions.current_phase_id列是否有用,但它没有记录,我无法推断它的含义。我也尝试过msdb数据库,因为这是保存复制作业记录的地方(在sysjobs表中)。该sysjobschedules表看起来很有希望,其中一些next_run_datenext_run_time字段为 0,但我不知道如何将其链接到sysjobs.

4

1 回答 1

1

好吧,所以这没有我希望的那么漂亮,但它是:

select 
    agent.*,
    case when exists(
        select *
        from msdb.dbo.sysjobsteps step
        where agent.job_id=step.job_id
        and step.step_id=2
        and step.command like '%-Continuous%')
        then 1
        else 0
    end as Continuous
from distribution.dbo.MSmerge_agents agent

从这个脚本推导出来,我通过绝望的互联网搜索找到了它。这假定字符串匹配不区分大小写。

如果有人有更好/更整洁/更漂亮的解决方案,我仍然会将答案奖励给他们。

于 2012-11-26T14:22:38.350 回答