小编Phi*_*ley的帖子

使用ErrorFile选项时,同时SQL BULK INSERT会生成失败

Windows Server 2008 R2 Enterprise,SQL Server 2008 X64,SP3,开发人员版

我构建并动态执行(通过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'
 )
Run Code Online (Sandbox Code Playgroud)

(错误文件名称基于已配置的本地文件夹,正在加载的表,以及为每个批量插入运行新生成的guid - 它是一个包含在其自己的存储过程中的子例程.)

外部进程(是SQL代理,现在是WCF服务)启动DTEXEC,它启动一个SSIS包,该包调用循环遍历集合的数据库中的存储过程,构建查询,并为每个执行查询.最多可以有四个负载同时从/进入给定数据库,并且SQL实例上的多个数据库可以同时运行 - 尽管历史上,数量一直很低,而且我们通常只有一个实例一次运行它.我们做了很多,并且它已经完成了两年多的完美工作 - 安全性已正确配置,必要的文件和文件夹存在,通常都是这样.(运气?我想不想.)

我们现在正在预测一些严重的工作负载,所以我们正在做一些压力测试,我在其中启动8次运行,每次运行有4个进程,其中一组四个将分开并逐个处理要加载的文件(即最多正在执行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和/或OS在某种程度上变得混乱(我是DBA,而不是网络管理员).我可以做一个解决方法,构建我的try-catch块以检查错误4861并重试最多三次,但我宁愿避免这样的kludgery.

我已经抛出一个例程,在使用之前将错误文件的名称(使用guid)记录到表中.在多次运行并且多次运行失败后,我看到(a)失败的文件+ guid正在我的表中记录,并且(b)没有记录重复的guid.

任何人都知道可能会发生什么?

菲利普

sql-server operating-system guid bulkinsert

4
推荐指数
1
解决办法
4006
查看次数

标签 统计

bulkinsert ×1

guid ×1

operating-system ×1

sql-server ×1