SSIS可靠性和擴展性—簡介
可靠性和擴展性是所有系統的最終目標之一,他們兩個看起來有些對立,不過通常來講他們又有相互的聯系。錯誤和造成錯誤的條件是可靠性最明顯的威脅。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: 0x40016049 at CheckPoint: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" update starting.
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.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號