【问题标题】:SSIS Intermittent variable error: The system cannot find the file specifiedSSIS间歇性变量错误:系统找不到指定的文件
【发布时间】:2017-10-28 04:40:50
【问题描述】:

我们的 SSIS 封装了一个结构化的控制包和从控制包调用的许多子包(大约 30 个)。子包通过执行包任务调用。每个子包有一个执行包任务。每个执行包任务都使用文件连接管理器来指定子包 dtsx 文件的路径。每个子包有一个文件连接管理器。每个文件连接管理器都有一个为 ConnectionString 属性定义的表达式。这个表达式看起来像这样:

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

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

运行时产生的错误是

加载包文件“MyPackage.dtsx”时出现错误 0x80070002

系统找不到指定的文件。”失败的包因运行而异,有时根本没有包失败。这是在完全相同的环境/数据等上运行时。

我在此错误期间运行了 FileMon,发现当错误发生时,SSIS 会尝试从错误的位置(即 system32)读取 dtsx 文件。我检查了这与@[Template::FolderPackages] 变量为空时会发生的情况相同,但是因为相同的变量用于每个子包并且适用于某些子包但有时对其他人不起作用,我没有解释这个事实。

有什么明显的问题,或者是时候向 Microsoft 发起支持电话了吗?

【问题讨论】:

  • 你能延迟加载下一个包吗?所有的包都在同一个目录吗?您是否为软件包设置了绝对路径,以帮助确保它不会进入 System32?
  • 我们都试过了。阻止它的唯一可靠方法是在包中具有与 Prod 系统相同的绝对路径,以便当配置加载失败时,它会退回到 Prod 位置。不过,这显然在开发环境中很糟糕。仅供参考,微软正在用堆栈跟踪和所有血淋淋的细节来挖掘这个案例。看起来像一个真正的错误。

标签: sql ssis


【解决方案1】:

您是否直接在 SSIS 变量上使用表达式?每次变量被需要使用它的消费对象引用时,都会计算带有表达式的变量。这就是存在竞争条件错误的地方,因为有时如果另一个线程已经在评估不同的变量,则表达式不会被评估,并且该变量的默认值被提供给消费者对象。

如果这与您的设计相匹配,连接站点上的这两个错误会讨论问题以及解决方法:

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

第二个在 connect.microsoft.com/SQLServer/feedback/details/406534/ssis-2008-variable-expressions-dont-always-evaluate

解决方法的摘要是 { - 注意可以在您的 SSIS 控制流中运行的并行任务并利用这些表达式变量。如果您有两个并排的任务,并且每个任务都依赖于同一个变量,并且该变量有一个表达式来设置其值,那么您可以点击它。 手动对此类任务进行排序,以便它们不会并行运行。 IE。在控制流上添加一个绿色箭头,以便任务按 Task1、Task2、Task3 的顺序发生,而不是在并行路径上并排发生,而不是在没有路径的同一容器内发生。

  • 您可以避免使用变量表达式:使用执行相同工作的自制脚本任务按所需顺序分配局部变量,这样变量就不会使用表达式进行评估(即可以命中的东西)这个比赛条件)。换句话说,在控制流中的某个时间点手动分配变量值,然后再使用它们。对变量使用表达式的目的是在使用时根据另一个值动态设置一个值,因此这实现了类似的设计目标,但以手动方式。

  • 减少线程以最大限度地降低潜力:将数据流任务 EngineThreads 设置为 1,将 MaxConcurrentExecutables 设置为 1。这将有助于将程序包的执行顺序一次执行一个任务,但这会产生副作用,可能会导致性能下降.

  • 在设计中不同范围级别的变量的不同副本上创建和设置值,以便它们在不同的并行执行范围内进行评估,并避免在并行线程上进行表达式评估。 Master::Var1, Child1::Var1, Child2::Var1

}

【讨论】:

    【解决方案2】:

    在黑暗中有点刺,但是......

    我遇到了类似的变量问题,其中 readonly=false 并且多个组件同时读取变量并导致锁定问题。

    我一直通过运行一对数据流来重现问题,这些数据流只在 for 循环容器中引用变量并将变量更改为只读,这解决了问题。

    如果您临时硬编码包名称,这是否可以解决问题?

    【讨论】:

    • 该死的。我希望事情就这么简单。如果我们将变量设置为只读,那仍然允许它从配置中设置一个值吗?我现在去测试一下……
    • 好吧。我们不能将变量设置为 readonly=true,因为这样它们就不会接受来自配置文件的值。无赖。
    【解决方案3】:

    在向 Microsoft 发送跟踪信息后发现我们遇到了堆损坏。如果我们深入了解这个问题,我会更新这个问题。 当前的建议是禁用 dtexec.exe 的堆后备。

    【讨论】:

      【解决方案4】:

      对此问题的官方回答是,它是 SQL 2005 和 2008 中的一个错误。许多任务访问同一个变量会导致竞争条件,并且某些任务会获取表达式的默认值而不是评估值。

      解决方法是确保默认值(在属性表中为您遇到问题的任何属性定义的值)应该是适用于您的生产环境的值。

      这样,当 prod 中发生竞争条件时,SSIS 将回退到包值,这仍然可以工作。

      在开发中?好吧,在我们从 Microsoft 获得错误修复之前,您将不得不手动处理。

      【讨论】:

        【解决方案5】:

        有一篇与此问题相关的知识库文章:http://support.microsoft.com/kb/2448991,其中说明了解决此问题的时间和地点。

        【讨论】:

        • 没有内容摘要的链接可能会被删除,尤其是在链接停止工作时
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 2016-09-19
        • 2012-03-02
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多