2014-01-20 115 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;到您的查詢,以減少爭的開始....但你應該明白這是什麼做第一。
相關問題