可靠性和擴充性是所有系統的最終目标之一,他們兩個看起來有些對立,不過通常來講他們又有互相的聯系。錯誤和造成錯誤的條件是可靠性最明顯的威脅。SSIS提供了解決這些情況的優雅的方法。這個章節中要關注的特性是錯誤輸出和檢驗點,使用他們來實作可靠性,他們也可以保證包的執行性能和擴充性。
重新啟動
一種經常遇到的情況,一個需要整夜執行的包執行失敗了,需要重新執行它。如果其中一個步驟非常的耗費資源和時間,重新執行它是一件痛苦的事情。在DTS中沒有類似“斷點續傳”的功能。重新執行一個失敗的包是很容易再次出錯的。由不同的政策在解決這些問問題,但是需要清楚DTS模型的工作原理,大多數DBA都沒有這樣的工作經驗。
由于這些因素,SQL Server 2008中的檢驗點功能是非常難得的方法,在SSIS中檢驗點是包的重新啟動的基礎,它将包的執行狀态寫入到一個檔案中。這些狀态資訊包括那個task已經執行過,那個task執行出錯了。要正确地設定檢驗點檔案,有三個包 屬性和一個task屬性需要設定:
- CheckpointFilename:這個屬性必須設定,檢驗點檔案的字尾是.chk
-
CheckpointUsage: 是否使用檢驗點,有三種值來描述如何使用檢驗點
Never: 不使用檢驗檔案
If Exists: 如果設定了CheckpointFilename屬性,包将按照檢驗檔案重新執行
Always: 總是使用檢驗檔案重新執行,如果沒有指定檔案将報錯
- SaveCheckpoints: 這是一個布爾值指定是否寫入檢驗點,很明顯這個值應該重視設定為true
- FailPackageOnFailure: 這個屬性是在task中設定的,當要将一個task設定為重新執行的檢驗點,如果這個屬性沒有被設定為true,執行失敗時資訊不會被寫入到檢驗點檔案中,下次執行的時候将會從第一個task開始執行
注意:SSIS 包被細分成Control Flow和 Data Flow,隻能在Control Flow中設定檢驗點而不能在Data flow中設定。如果在包的執行過程中沒有出現錯誤,檢驗點檔案也不會産生。檢驗點檔案包含所有重新啟動包的資訊。
簡單的Control Flow
我們首先從一個簡單的例子開始如圖1三個ExecuteSQL。
圖1
在第二個task中我們設定一個錯誤,select 1/0,如圖2
圖2
我們假設第一個task是一個耗時耗力的任務,為了它在執行完之後不會被執行第2次,将檢驗點設定在這個任務上,首先設定包的屬性如圖3
圖3
現在設定第二個task的屬性如圖4
圖4
執行包,它在第二個task處失敗如圖5
圖5
在這裡如果這個是在DTS環境中我們修改package,并且做一些額外的工作保證task 1不會被再次執行,但是我們是用SSIS來建立的這個包,依賴檢驗點來實作這個。在錯誤輸出重我們看到一些内容被寫倒檢驗點檔案中,如下:
SSIS package "CheckPoint.dtsx" starting.
Information: 0x40016045 at CheckPoint: The package will be saving checkpoints to file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" during execution. The package is configured to save checkpoints.
Information: 0x40016049 at CheckPoint: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" update starting.
Information: 0x40016047 at 1: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" was updated to record completion of this container.
Error: 0xC002F210 at 2, Execute SQL Task: Executing the query "select 1/0" failed with the following error: "Divide by zero error encountered.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
Task failed: 2
Warning: 0x80014058 at 2: This task or container has failed, but because FailPackageOnFailure property is FALSE, the package will continue. This warning is posted when the SaveCheckpoints property of the package is set to TRUE and the task or container fails.
Information: 0x40016047 at 2: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" was updated to record completion of this container.
SSIS package "CheckPoint.dtsx" finished: Failure.
在檔案目錄中我們也可以看到這個檔案如圖6
圖6
現在我們修正task2種的錯誤:select 1/2,再次執行這個包結果如圖7:
圖7
Task1被忽略,從task2開始執行。這裡注意task2的FailPackageOnFailure屬性必須設定成true,否則的話檢驗檔案不會被寫入,再次執行的時候還是會從task1開始執行。我們來試一試如圖8
圖8
執行包,如圖9它将仍然從task1開始執行,這不是我們希望的。
圖9
這個例子簡單地說明了檢驗點的工作過程,在實際的生産環境情況可能會很複雜。
作者:
Tyler Ning出處:
http://www.cnblogs.com/tylerdonet/本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過以下郵箱位址
[email protected]聯系我,非常感謝。