файл ошибок Windows Server 2008 R2 Enterprise, SQL Server 2008 X64, SP3, разработчик изданиеОдновременная SQL BULK Вставки генерировать сбои при использовании опции
я строю и динамически выполнять (через 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, теперь является службой WCF) запускает DTEXEC, который запускает пакет SSIS, который вызывает хранимые процедуры в базе данных, которая осуществляет цикл через множество, строит запрос и запускает его для каждого. Одновременно может быть запущено до четырех нагрузок из/в данную базу данных, и одновременно могут работать несколько баз данных на экземпляре SQL, хотя исторически объем был низким, и у нас обычно был только один экземпляр, выполняющий это за раз. Мы делаем это очень много, и он работает безупречно уже более двух лет - безопасность настроена правильно, необходимы файлы и папки, все обычное. (Luck? Мне нравится думать не так.)
Теперь мы ожидаем серьезных нагрузок, поэтому мы проводим некоторые стресс-тесты, в которых я запускаю 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 и/или ОС каким-то образом запутываются (я администратор базы данных, а не администратор сети). Я мог бы обойтись, построив блок try-catch, чтобы проверить ошибку 4861 и повторить попытку до трех раз, но я бы предпочел избежать такого клонирования.
С тех пор я бросил в рутину, которая записывает имя файла ошибки (с помощью guid) в таблицу перед ее использованием. После многих прогонов и нескольких сбоев я вижу, что (а) файл с ошибкой + guid записывается в мою таблицу и (б) не регистрируются повторяющиеся записи.
Кто-нибудь знает, что может быть?
Филипп
+1 сложная проблема – Omar