包执行故障排除

更新日期: 2006 年 12 月 12 日

Integration Services 包括可用于在包完成和部署以后的执行过程中进行故障排除的功能和工具。

在设计时,Business Intelligence Development Studio 提供了用于暂停包的执行的断点、“进度”窗口和用于在数据通过数据流时查看数据的数据查看器。 但是,这些功能在包部署后运行包时不再可用。 用于排除已部署包故障的主要技术如下:

  • 使用事件处理程序捕获和处理包错误。
  • 使用错误输出捕获错误数据。
  • 使用日志记录跟踪包的执行步骤。

还可以使用下列技巧和技术避免正在运行的包的问题

使用事件处理程序捕获和处理包错误

通过使用事件处理程序,您可以响应许多由包和包中的对象引发的事件。

  • 创建 OnError 事件的事件处理程序。 在事件处理程序中,您可以使用发送邮件任务将故障通知给管理员,使用脚本任务和自定义逻辑获取用于故障排除的系统信息或者清除临时资源或不完整的输出。 有关详细信息,请参阅 Integration Services 事件处理程序创建包事件处理程序

外部数据访问接口问题的故障排除

很多包在与外部数据访问接口交互时会失败。 但是,这些访问接口返回到 Integration Services 的消息通常不能够为开始交互故障排除提供足够的信息。 为了满足此故障排除的需要,Microsoft SQL Server 2005 Service Pack 2 (SP2) 包含新的日志记录消息,这些消息可用来对包与外部数据源的交互进行故障排除。

  • 启用日志记录并选择包的“诊断”事件可以看到新的故障排除消息。 如果是在 SP2 中启动,以下 Integration Services 组件能够在每次对外部数据访问接口的调用前后向日志写入消息:

    • OLE DB 连接管理器、OLE DB 源以及 OLE DB 目标
    • ADO.NET 连接管理器和 DataReader 源
    • 执行 SQL 任务
    • 查找转换、OLE DB 命令转换和渐变维度转换

    新的日志记录消息包括正被调用的方法的名称。 例如,这些日志消息可能包括 OLE DB Connection 对象的 Open 方法或 Command 对象的 ExecuteNonQuery 方法。 这些消息具有以下格式(其中“%1!s!”为方法信息的占位符):

    ExternalRequest_pre: The object is ready to make the following external request: '%1!s!'.
    ExternalRequest_post: '%1!s!'. The external request has completed.
    

    若要对与外部数据访问接口的交互进行故障排除,请检查日志,以查看每个“之前”消息 (ExternalRequest_pre) 是否都具有相对应的“之后”消息 (ExternalRequest_post)。 如果没有对应的“之后”消息,就会知道外部数据访问接口不会按预期方式回应。
    下面的示例显示了包含新日志记录消息的日志中的一些示例行:

    ExternalRequest_pre: The object is ready to make the following external request: 'ITransactionJoin::JoinTransaction'.
    ExternalRequest_post: 'ITransactionJoin::JoinTransaction succeeded'. The external request has completed.
    ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.Open'.
    ExternalRequest_post: 'IDbConnection.Open succeeded'. The external request has completed.
    ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.CreateCommand'.
    ExternalRequest_post: 'IDbConnection.CreateCommand finished'. The external request has completed."
    ExternalRequest_pre: The object is ready to make the following external request: 'IDbCommand.ExecuteReader'.
    ExternalRequest_post: 'IDbCommand.ExecuteReader finished'. The external request has completed."
    ExternalRequest_pre: The object is ready to make the following external request: 'IDataReader.GetSchemaTable'.
    ExternalRequest_post: 'IDataReader.GetSchemaTable finished'. The external request has completed."
    ExternalRequest_pre: The object is ready to make the following external request: 'IDataReader.Close'.
    ExternalRequest_post: 'IDataReader.Close finished'. The external request has completed."
    ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.Close'.
    ExternalRequest_post: 'IDbConnection.Close finished'. The external request has completed."
    

使用错误输出对错误数据进行故障排除

您可以使用对许多数据流组件可用的错误输出将包含错误的行定向到单独的目标中,供以后分析。

  • 使用错误输出捕获错误数据。 将包含错误的行发送到单独的目标(如错误表或文本文件)。 错误输出自动添加两个数值列(包含导致该行被拒绝的错误的编号)以及发生该错误的列的 ID。 有关详细信息,请参阅处理数据中的错误如何在数据流组件中配置错误输出
  • 向错误输出添加易于理解的信息。 除了由错误输出提供的两个数字标识符外,您还可以添加说明性信息以便更容易分析错误输出。
    添加错误说明。 使用脚本组件查找错误说明是很容易的。 有关详细信息,请参阅Enhancing an Error Output with the Script Component
    添加错误列的名称。 在脚本组件中无法轻易查找与错误输出保存的列 ID 对应的列名,需要其他的步骤。 数据流中的每个列 ID 在该数据流任务中都是唯一的,并且设计时在包中保持不变。 建议采用下列方法向错误输出中添加列名:
    1. 创建列名的查找表。 创建另一个应用程序,该应用程序使用 Integration Services API 对每个已保存的包、包中的每个数据流、数据流中的每个对象以及数据流对象中的每个输入和输出进行迭代。 应用程序应当将每一列的列 ID 和名称以及父数据流任务的 ID 和包的 ID 持久化到查找表。
    2. 将列名称添加到输出。 将查找转换添加到错误输出中,此错误输出在上述步骤创建的查找表中查找列名。 查找可以使用错误输出中的列 ID、包 ID(在系统变量 System::PackageID 中)以及数据流任务的 ID(在系统变量 System::TaskID 中)。

使用日志记录对包执行进行故障排除

通过启用日志记录,您可以跟踪正在运行的包中所发生的大部分问题。 日志提供程序捕获有关指定事件的信息供以后分析,并且以数据库表、平面文件、XML 文件或支持的其他输出格式保存该信息。

  • 启用日志记录。 您可以只选择所要捕获的事件以及只选择所要捕获的信息项,以修改日志记录输出。 有关详细信息,请参阅 Integration Services 日志提供程序在包中实现日志记录
  • 选择包的“诊断”事件对访问接口问题进行故障排除。 在 SP2 中,一些新的日志记录消息可以帮助您对包与外部数据源的交互进行故障排除。 有关详细信息,请参阅本主题中的外部数据访问接口问题的故障排除。
  • 增强默认日志记录输出。 通常,每次该包运行时日志记录都会向日志记录目标中追加行。 虽然日志记录输出的每一行都使用包的名称和唯一标识符来标识包,也通过唯一的 ExecutionID 来标识包的执行,但单一列表中的大量日志记录输出会使分析变得困难。 建议采用下列方法增强默认日志记录输出并使其更容易生成报告:
    1. 创建记录包的每次执行情况的父表。 此父表只有一行用于包的每次执行,并使用 ExecutionID 链接到 Integration Services 日志记录表中的子记录。 您可以在每个包的开始使用一个执行 SQL 任务创建此新行并记录开始时间。 然后您可以在包的结尾使用另一个执行 SQL 任务,用结束时间、持续时间和状态来更新该行。
    2. 将审核信息添加到数据流。 您可以使用审核转换将有关创建或修改每一行的包执行的信息添加到数据流的行中。 审核转换可以提供九条信息,包括 PackageName 和 ExecutionInstanceGUID。 有关详细信息,请参阅审核转换。 如果您希望在每一行中包括自定义信息以便审核,可以使用派生列转换将此信息添加到数据流的行中。 有关详细信息,请参阅派生列转换
    3. 考虑捕获行计数数据。 考虑另行创建一个表,用于存储行计数信息。其中,每个包执行实例均由其 ExecutionID 标识。 使用行计数转换在数据流的关键点将行计数保存到一系列变量中。 数据流结束后,请使用执行 SQL 任务将该系列值插入到表的行中,供以后分析和报告。

运行时验证问题的故障排除

有时在包中前一个任务执行完成之前,您也许不能连接到数据源,或者无法验证包的某些部分。Integration Services 包含的下列功能可以帮助您避免在这些条件下产生验证错误:

  • 配置加载包时无效包元素的 DelayValidation 属性。 您可以将具有无效配置的包元素的 DelayValidation 设置为 True,以防止包加载时的验证错误。 例如,可以使用只有在运行时通过执行 SQL 任务创建才存在的目标表来执行数据流任务。 可以在包级或包中的各个任务和容器级启用 DelayValidation 属性。
    可以对数据流任务设置 DelayValidation 属性,但不能对单个数据流组件设置该属性。 可以通过将单个数据流组件的 ValidateExternalMetadata 属性设置为 false 来实现类似的效果。 但是,当此属性的值为 false 时,该组件不能识别外部数据源的元数据的更改。 设置为 true 时,ValidateExternalMetadata 属性可帮助避免数据库中由于锁定导致的阻塞问题,特别是在包使用事务时。

运行时权限问题的故障排除

如果您在尝试使用 SQL Server 代理运行已部署的包时遇到错误,则代理所使用的帐户可能不具备必需的权限。 有关如何对从 SQL Server 代理作业中运行的包进行故障排除的信息,请参阅 Microsoft 支持知识库文章从 SQL Server 代理作业步骤中调用 SSIS 包时 SSIS 包不运行。 有关如何从 SQL Server 代理作业中运行包的详细信息,请参阅在 SQL Server 代理中计划包执行如何使用 SQL Server 代理作业运行包

64 位问题的故障排除

在 32 位模式或在 32 位服务器上能顺利运行的包在 64 位服务器上出现错误时,请考虑下列常见问题。 有关详细信息,请参阅 64 位计算机上的 Integration Services 注意事项

  • 部分数据访问接口在 64 位平台上不可用。 尤其是,需要连接到 Excel 或 Access 数据源的 Microsoft Jet OLE DB 访问接口在 64 位版本中不可用。
  • 在 64 位计算机上使用的脚本必须在 32 位计算机上进行预编译。 在使用脚本任务或脚本组件的包中,PreCompile 属性必须设置为 True。
  • DTS 包不能运行在 64 位模式下。 如果您的包使用了执行 DTS 2000 包任务来运行 SQL Server 2000 Data Transformation Services (DTS) 包,则必须在 32 位模式下运行该包。 DTS 包运行时不支持 64 位。

无说明错误的故障排除

如果遇到了没有附带说明的 Integration Services 错误,您可以通过其错误号在 Integration Services Error and Message Reference 中查找错误来找到说明。 目前该列表中不包括故障排除信息。

请参阅

任务

包开发故障排除

概念

包性能故障排除
Integration Services 服务故障排除

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

新增内容
  • 添加了有关 SQL Server 2005 SP2 如何包括新日志记录消息的信息。使用这些消息,用户可以对外部数据访问接口问题进行故障排除。