所以这是场景。在我的一个主要SSMS盒子上,我有大约100个复制批处理作业。这些批处理作业将一系列静态数据从“主”DB复制到每个单独的DB。因此,每个DB都有一个批处理作业。创建新数据库时,将创建新的批处理作业。
批处理作业遵循命名约定,下面是一个示例
PG-APP03-ORIGINS_Master-PG-APP03-100
因此我们可以看到服务器是PG-APP03并且它是ORIGINS_Master数据库,但是其余的作业名称并没有让我看到数据库受到影响。如果我深入研究这项工作的步骤,我会看到以下内容
-Subscriber [PG-APP03] -SubscriberDB [ORIGINS_9107L1]
-Publisher [PG-APP03]
-Distributor [PG-APP03]
-DistributorSecurityMode 1
-PublisherDB [ORIGINS_Master]
因此,我可以看到“订阅者”是我认识的数据库名称。
然而,我偶尔会有20个这样的工作在早上失败。我禁用了各个电子邮件警报,因为这些工作名称无法识别。因此,每天早上我进来,查看作业失败,并且必须深入到每个作业的第2步以找到订阅者名称。
我正在寻找可以将所有故障整理在一起的方法,由订阅者识别它们,并通过一封电子邮件发送给我。
我不仅可以使用它来更快地修复问题,我还可以将该电子邮件发送给某些关键人员,作为在复制修复之前数据库不准确的通知。
我一直在数据库中的某些表路由,并且可以找到作业存在的地方,我可以看到这些步骤,但我真的很难将这些全部放在一起。
任何帮助都将不胜感激。
答案 0 :(得分:0)
这是我写的代码,它给了我所需的输出
USE MSDB
GO
DECLARE @time INT
SET @time = cast(convert(varchar(8), getdate(), 112) as int)
SELECT DISTINCT
a.Name,
b.server,
CASE WHEN c.step_name ='Run Agent.' THEN 'Replication' END AS 'Step Name',
CASE WHEN c.run_status ='0' THEN 'Failed' END AS 'Run Status',
c.run_date,
CASE WHEN b.subsystem ='Distribution' THEN SUBSTRING(b.command,38,15)
ELSE '' END AS 'Subscriber'
FROM sysjobs AS a
INNER JOIN sysjobsteps AS b
ON a.job_id = b.job_id
INNER JOIN sysjobhistory AS c
ON a.job_id=c.job_id
WHERE c.run_status ='0'
AND c.step_id ='2'
AND c.run_date = @time
AND b.subsystem = 'Distribution'
所以我有订阅者专栏,在那里我将能够找出有问题的Db有复制问题