2009-11-22 24 views
3

我們的SSIS包含一個結構化的控件包和許多從控件包調用的子包(大約30個)。子包被調用執行包任務。每個子包有一個執行包任務。每個執行包任務使用文件連接管理器來指定子包dtsx文件的路徑。每個子包有一個文件連接管理器。每個文件連接管理器都有一個爲ConnectionString屬性定義的表達式。此表達式如下所示:SSIS間歇性變量錯誤:系統找不到指定的文件

@[Template::FolderPackages]+"MyPackage.dtsx" 

每個包的文件名是不同的。變量(FolderPackages)在SSIS包配置文件中指定。

,它是在運行時所產生的誤差是

Error 0x80070002 while loading package file "MyPackage.dtsx"

該系統找不到指定的文件。」失敗的包是從運行不同的運行,有時甚至沒有包失敗的。這是當運行在完全相同的環境/數據等

我在這個錯誤期間運行FileMon,發現錯誤發生時,SSIS試圖從錯誤的地方讀取dtsx文件,即從system32。我檢查這是相同的如果@ [Template :: FolderPackages]變量是空的,但是因爲使用了相同的變量,會發生什麼情況每個孩子的包裝和一些爲一些工作,但有時不爲別人工作,我沒有這個事實的exporanation。

是否有任何明顯的跡象,或者有時間向微軟提出支持電話?

+0

加載下一個軟件包之前可以推遲嗎?所有的軟件包都在同一個目錄下嗎?你把包的絕對路徑,以幫助確保它不會去System32? – 2009-11-22 22:49:35

+0

我們都試過了。阻止它的唯一可靠方法是在包中有一個與Prod系統相同的絕對路徑,這樣當配置加載失敗時,它將回退到Prod位置。 雖然這顯然會吸引開發環境。僅供參考,微軟正在挖掘堆棧痕跡和所有血腥細節。看起來像一個真正的bug。 – 2009-11-24 20:10:42

回答

0

這個問題的官方答案是它是SQL 2005和2008中的一個bug。訪問同一個變量的許多任務都會導致競爭條件,而某些任務會獲取表達式的默認值而不是評估值。

解決方法是確保默認值(屬性表中爲您遇到問題的任何屬性定義的值)應該是在生產環境中可以使用的值。

這樣,當競爭條件發生在產品中時,SSIS將回退到包值,該值仍然有效。

In dev?那麼你將不得不手動處理,直到我們得到來自微軟的錯誤修復。

0

在黑暗中刺,但...

我有一個類似的問題與在只讀=假,多個組件都在讀同一時間變量,從而導致鎖定問題變量的位。

我一直通過運行一對數據流來重新創建問題,該對數據流除了引用for循環容器內的變量外,並將變量更改爲只讀,並解決了問題。

如果您臨時硬編碼軟件包名稱,這是否解決了問題?

+0

血腥地獄。我希望這很簡單。如果我們將變量設置爲只讀,那麼它是否仍然允許從config中設置一個值? 我現在要去測試它... – 2009-11-24 20:11:50

+0

Hokay。我們不能將變量設置爲readonly = true,因爲它們不會接受來自配置文件的值。遊民。 – 2009-11-25 21:28:23

0

在向Microsoft發送跟蹤信息後發現我們遇到堆損壞後發生此錯誤。如果我們瞭解它的底部,我會更新這個問題。 當前的建議是爲dtexec.exe禁用堆棧後備。

2

你是否直接在SSIS變量上使用表達式?每次變量被需要使用它的消費對象引用時,都會計算帶有表達式的變量。這就是競爭條件錯誤存在的地方,因爲如果另一個線程已經在計算一個不同的變量,並且該變量的默認值被提供給了使用者對象,那麼表達式有時不會被評估。

如果你的設計相匹配,在連接部位這兩個漏洞討論這個問題,而解決方法:

https://connect.microsoft.com/SQLServer/feedback/details/332372/ssis-variable-expressions-dont-always-evaluate

在 connect.microsoft.com/SQLServer/feedback/details中的第二個/ 406534/SSIS-2008-變量表達式 - 不要 - 始終評估

解決方法的總結是 { - 請注意,可以在您運行SSIS控制流和利用這些表達變量的並行任務。如果你有兩個任務並行,如果每個依賴於相同的變量,並且該變量有一個表達式來設置它的值,那麼你可以打這個。 手動序列化這些任務,以便它們不會並行運行。 IE瀏覽器。在控制流上添加一個綠色箭頭,以便任務順序爲Task1,Task2,Task3,而不是並行路徑,而不是在沒有路徑的同一個容器內。

  • 你可以避開變量表達式:使用自制腳本任務,做同一種工作在所要求的順序分配的局部變量,因此變量不計算使用表達式(即件事即可。打這場比賽的情況)。換句話說,在使用控制流之前,手動爲變量值分配一個時間點。在變量上使用表達式的要點是在使用時根據另一個值動態設置一個值,因此這實現了類似的設計目標,但是採用了手動方式。

  • 減少線程以最大限度地降低潛能:將數據流任務EngineThreads設置爲1,MaxConcurrentExecutables設置爲1.這將有助於將包的執行一次一個地執行到一個任務,但這有副作用,可能會導致性能下降。

  • 在設計中不同範圍級別的變量的不同副本上創建和設置值,以便它們評估不同的並行執行範圍並避免對並行線程執行表達式評估。大師:: VAR1,Child1 :: VAR1,CHILD2 :: VAR1

}

相關問題