SSIS数据流未写入前几批

时间:2019-03-20 17:51:07

标签: sql-server ssis etl bulk

我在SSIS中有一个数据流,它将随机不导入记录。我已经进行了数周的研究,因此在这一点上,我在SSIS包中有rowcount,在SQL中有count(*)来验证插入的行,触发表以记录何时以及SSIS插入了什么插件上的包日志记录。

此问题随机发生。它不可能一次连续几天发生,而在任何时候早晨,下午突然发生。

这是我的流程:

  1. 数据通过单个平面文件连接和源来自多个平面文件。
  2. 我使用rowcount对行进行计数。例如,假设它是1000行。
  3. 我将派生列添加到流
  4. 我再次使用rowcount对行进行计数。这始终与#2相匹配
  5. 然后我使用c#脚本解析行 (不要问为什么我不仅仅划定界限,不相关,也不起因, 该文件很奇怪)。

    编辑::由于被问到-c#脚本具有多个try catch用于解析,并且捕获了错误行,并添加了error输出而不是正常输出。我已经测试过了,它正在按预期工作。我也有一个错误输出rowcount。在我所谈论的问题发生的所有情况下,该值为0。它在其他情况下确实具有值(XML解析错误),但是与该问题无关,也无法修复,因为文件本身是错误的。在发生错误rowcount之后,我将这些行批量插入到另一个表中-该插入在所有实例中均获得了正确的计数。

  6. 我使用rowcount对行进行计数。到目前为止,该数字也始终与#2匹配

  7. 使用OLE DB目标将记录插入到表中。表锁已关闭,检查约束已打开,保持空值已关闭,保持身份为空,最大提交大小为3500,每批行为空。错误输出设置为重定向。 我使用SSIS包Log进行验证,并且该日志将指出它仍然为1000行
  8. 我使用错误输出到rowcount,该数字为0
  9. 我有具有较低提交等的加法重试插入。表上没有其他工作完成,并且由于到目前为止每次在#8上的错误输出均为0,所以这些部分甚至都没有命中,所以再次出现-不相关。 / li>
  10. 任务流中的下一步是在表和其他日志记录上运行一个count(*)(请参见下文),它将具有较小的数字,即700。

现在我收集的日志中有一些有趣的信息

  • 使用一些繁重的日志记录,我在插入上使用了联接,以获取SQL表中与插入的每个文件相关的特定行。首先插入的文件将只有一(1)条记录。 为什么要这样-我不确定。这种情况通常发生在两到三个文件中。之后,下一个文件可能会包含部分或全部文件-即200行文件中的120行

  • 如果我查看触发数据结果,则触发日志将显示相同的内容:前几个插入仅包含1行,其次是下一个插入的正常插入的一半(通常我的数据流为450批量记录,例如,大约200条记录)。之后,剩余的批次将具有全部450行,直到最后一个批次为止(明显的原因是插入的行用完了)。

结论:

无论出于何种原因,由于某种原因,插入操作只会在前几批中插入一行,然后继续在其余批中写入所有记录。问题在于,SSIS显然认为它正在插入所有行(由于“程序包日志”指出已插入所有行,并且有0个错误行,但表的count(*)却显示出不同)。

我想出的原因:

  • 它是否像Use数据库语句或某些其他语句必须在插入发生之前运行,并且由于某种原因SSIS不在此等待?我运行了一个SQL跟踪,并且在插入开始之前在同一spid上可以找到的唯一语句是

     exec [sys].sp_bcp_dbcmptlevel [DBNAME]
     set fmtonly on
     select * from [dbo].[TableName]
     set fmtonly off
    

我在插入页面上没有Validate external metadata,所以我不确定为什么还要执行此步骤或如何停止它,或者甚至有必要。

  • 是否存在某种阻止?也许-但是为什么它似乎始终只阻止前几次插入,为什么仍在该批次中插入一条记录?如果它阻塞了,我怀疑不会插入任何记录。此外,表的建立方式不应对这些记录造成阻塞(检查父表可插入的内容)。

  • 外键?还有其他限制吗?否-没有FK,唯一的约束是一列的默认getdate()

  • SQL和/或SSIS错误?我的SQL修补程序级别是SQL Server 2008 R2(Sp3)-10.50.6220.0 SSIS的版本是2008。

  • 某种内存争用?机器上的内存通常仅使用50%。我还没有看到巨大的峰值。

其他信息:

  • 服务器在同一服务器上运行SSIS包和SQLServer。SQLServer确实设置了内存限制,以免与SSIS包的内存使用冲突。

我已经在多个地方看到了其他各种问题-听起来最像我的问题的最接近问题似乎是here,它们只是建议重建数据流任务。也许我只是肛门,但我想知道为什么会在执行此操作之前发生这种情况,因为我不必总是必须对我制作的每个SSIS程序包都写检查以确保“嘿!确实如此”。写下它说的所有行。”

EDIT :来自发生错误的运行的数据流的程序包日志。我有OnError,OnInformation,OnPreExecute,OnPostExecute,OnProgress,OnTaskFailed,BufferSizeTuning。

我以前没有OnWarning,我刚刚添加了该功能,如果/如果给出任何警告信息,如果问题再次发生,将进行更新。

<Messages>
  <Message StartTime="2019-03-19T12:09:14">The processing of file "D:\636885940052243508" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:14">Execute phase is beginning.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940052243508" is 1020.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940052243508" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940088814813" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940088814813" is 3.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940088814813" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940056841575" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940056841575" is 1077.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940056841575" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940090153045" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940090153045" is 5.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940090153045" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940052788627" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940052788627" is 1005.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940052788627" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940089158218" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940089158218" is 2.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940089158218" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940046337791" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940046337791" is 962.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940046337791" has ended.
</Message>

...跳过的原因是数百行(是的,如果我将它们加起来,计数确实会匹配)

  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion in "component "Insert" (1886)" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion  in "component "Insert" (1886)" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion in "component "Retry Insert" (2051)" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion  in "component "Retry Insert" (2051)" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:38">Post Execute phase is beginning.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Malformed - Bad Parse" (10)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Insert" (1886)" wrote 36581 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Retry Insert RBAR" (1933)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Malformed - Failed Insert" (1994)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Retry Insert" (2051)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">Cleanup phase is beginning.
</Message>
</Messages>

0 个答案:

没有答案