的Windows Server 2008 R2企業版,SQL Server 2008中X64,SP3,開發版同時SQL批量插入使用錯誤文件選項
我建立和動態執行(通過sp_executesql的)一個BULK INSERT命令時產生的故障。一般形式爲:
BULK INSERT #HeaderRowCheck
from "\\Server\Share\Develop\PKelley\StressTesting\101\DataSet.csv"
with
(
lastrow = 1
,rowterminator = '\n'
,tablock
,maxerrors = 0
,errorfile = 'C:\SQL_Packages\TempFiles\#HeaderRowCheck_257626FB-A5CD-41B8-B862-FAF8C591C7A9.log'
)
(錯誤文件名是基於配置的本地文件夾,該表被加載,併爲每批量插入運行新生成一個GUID - 這是包裹在它自己的存儲過程的子程序)
一個外部進程(即SQL Agent,現在是一個WCF服務)啓動DTEXEC,啓動一個SSIS包,該包調用數據庫中循環訪問存儲過程的數據庫,構建查詢併爲每個數據庫運行該查詢。最多可以同時從/到一個給定的數據庫運行四個加載,並且SQL實例上的多個數據庫可以同時運行這個數據庫 - 儘管從歷史上看,數據量一直很低,而且我們通常只有一個一次運行這個實例。我們做了很多事情,並且它在兩年多的時間裏完美無缺地工作 - 安全性得到了正確配置,存在必要的文件和文件夾,這一切都是平常的。 (運氣?我喜歡不認爲)
我們現在正在預測一些嚴重的工作量,所以我們正在進行一些壓力測試,其中我會發起8次運行,每次運行有四個進程,其中一組四個並逐個處理要加載的文件(即,最多可同時執行32個批量插入,就像我說的壓力測試一樣)。低並注意,啓動時,一個或多個文件在執行過程中會失敗,出現錯誤消息,如:
Error #4861 encountered while loading header information from file "DataSet.csv": Cannot bulk load because the file "C:\SQL_Packages\TempFiles\#HeaderRowCheck_D0070742-76A5-4175-A1A7-16494103EF25.log" could not be opened. Operating system error code 80(The file exists.).
從運行到運行時,用於同一個文件,數據集,或者點在-整體處理不會發生錯誤。
表面上,它聽起來像兩個進程試圖訪問相同的錯誤文件,這意味着他們獨立地生成相同的GUID(!)。我的理解是,這應該是幾乎不可能的。另一個理論是,很多事情正在同時進行(可能多達32個同時執行BULK INSERT命令),SQL和/或操作系統在某種程度上變得困惑(我是DBA,而不是網絡管理員)。我可以做一個解決方法,建立我的try-catch塊來檢查錯誤4861並重試三次,但我寧願避免這樣的混亂。
我已經拋棄了一個例程,它在使用之前將錯誤文件的名稱(使用guid)記錄到表中。經過多次運行和幾次失敗後,我發現(a)失敗的文件+ guid正在我的表中記錄,(b)沒有重複的guid被記錄。
任何人都知道可能會發生什麼?
菲利普
+1個棘手問題 – Omar