2014-01-20 44 views
0

我们最近遇到了Client Machine中的Sql服务器死锁问题。 我们怀疑这是由于计划作业A,作业B,作业C在频繁的时间间隔。如何在没有死锁的情况下安排SSIS作业

a。工作A - 每15分钟 b。工作B - 每20分钟一次 c。作业C - 每30分钟

这些时间间隔不会因数据量而异,这会导致作业重复执行。 另外,如果有人工干预,那么我们如何确保工作完成其未完成的任务?

1.是否有创建依赖项的方法?

为了让作业B等待作业完成,作业C等待作业B过程完成。

2.如何处理最坏的情况,如果工作失败,那么如何恢复交易?

3.是否有方法在SSIS作业状态下编写和跟踪自定义日志文件/电子邮件警报?

在此先感谢

回答

0

这是一个有点缺憾,但每个职业可以有,他们清楚时,他们开始一个标志文件,并写入当他们结束到。下一个作业需要在开始之前检查之前作业的标志文件。当然,如果这项工作试图多次启动并且标志文件不在那里,它会发送一封电子邮件来阻止它,这样人们就可以将事情整理出来,并让事情重新开始。

恢复失败将是分开的,这取决于你如何解决第一个问题。

您可以将特定项目作为一个进程的一部分写入日志,并让另一个SSIS包监视该进程,并在遇到特定文本时发送电子邮件。该日志也可以用来代替标志文件,但是您需要知道,完成的过程A是当前过程,而不是之前15分钟的过程。

0

我目前把这个作为工作的第一步处理这样的:

-- Check running SQL Agent jobs. If there are any 'Load' jobs then don't run this one. 
-- This step has 3 retries at 5 minutes each 
IF EXISTS 
(
SELECT sj.name, sja.* 
FROM msdb.dbo.sysjobactivity AS sja 
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id 
WHERE sja.start_execution_date IS NOT NULL 
AND sja.stop_execution_date IS NULL 
AND sj.name LIKE 'Load%' 
) 
    RAISERROR('Job is still currently running. Cannot run this job in parallel. This step will retry.',18,0) 

然后在高级选项卡中设置的步骤是在任何时间间隔重试了多少次。如果另一个作业已在运行(通过作业名在这个例子开始Load认定,这将RASIE错误,重试

另一种选择,以避免死锁是:

  1. 优化querties所以他们不花了这么长时间
  2. 添加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;到您的查询,以减少争的开始....但你应该明白这是什么做第一。
相关问题