7

虽然我的头衔说明了我目前的目标,但我对替代解决方案持开放态度。简而言之,我有一系列计划在我们的 SQL Server 机器上每晚运行的 SSIS 包。

由于我的公司 IT以太网中发生的各种更新,有时这些导出会停止,并且该过程将在工作中停止工作。为了解决这个过程,我在我的工作站上启动 BIDS 并重新启动哪个过程失败。这很有用,因为根据我的经验,从 BIDS 中生成的任何错误都比我从 SQL Server/包执行历史记录或服务器事件日志中发现的任何错误都要有用得多。

从历史上看,我的问题是并非所有问题都会出现在 BIDS 中,但它们会始终出现在服务器上。这些问题诊断起来很痛苦,并且花费了我很多时间。

因此,我想做的是将我的包发布到 SSIS 服务器,从 BIDS 启动服务器实例并在项目运行时对其进行监控。这可能吗?

如果没有,我还能做些什么,以便在流程执行时监控内部步骤?

我担心这一切都不可能,但我不得不问。这将使我的调试和故障排除生活变得更加轻松。

4

2 回答 2

13

可能的选项:

您需要利用LoggingSSIS 中的功能。它允许您配置要为其捕获消息的事件。我通常更喜欢日志OnWarningOnError跟踪包中出现的所有警告和错误消息。您有各种提供程序来保存日志记录数据。我更喜欢使用 SQL Server,以便我可以查询日志记录信息。

SSIS 2012 中显示的日志记录选项:

Business Intelligence Development Studio (BIDS)如果您正在 SSIS 2005 - 2008 R2SQL Server Data Tools (SSDT)中开发包或正在 SSIS 2012 中开发包,则要启用包中的日志记录,您需要单击该包。

单击SSIS菜单,然后单击Logging...

您将看到配置 SSIS 日志对话框。

在左侧,您可以检查包或单个任务以记录事件数据。

Providers and Logs选项卡上,您可以选择一个适当的提供程序来保存日志信息。下面的屏幕截图显示事件信息是使用连接管理器在 SQL Server 数据库中捕获的OLEDB_PracticeDB

配置 SSIS 日志 - 提供程序和日志

详细信息选项卡上,您可以选择要捕获的事件。下面的屏幕截图显示我正在捕获以下事件。

  • 错误
  • 信息
  • 任务失败
  • 警告

感谢@William Todd Salzman推荐OnTaskFailed活动

配置 SSIS 日志 - 详细信息选项卡

样品包装图:

假设我们有一个名为SO_15004109.dtsxData Flow TaskScript Task的包。数据流任务只是一个内部没有组件的虚拟对象。

示例包 - 数据流选项卡

脚本任务在 Main 方法中有以下代码来触发自定义信息、警告和错误消息,因此我们可以观察它是如何在日志数据源中捕获的。该代码是为 SSIS 2012 编写的,因此您可能需要为 SSIS 2005 更改它。我之所以选择VB.NET不是,是因为您已在C#下标记了此问题,并且 SSIS 2005 仅支持 VB.NET。

用于 SSIS 2005 及更高版本的 VB.NET 中的脚本任务代码。

#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
#End Region

<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    Public Sub Main()

        Dim fireAgain As Boolean = False
        Dts.Events.FireInformation(101, "Custom Script Information", "This is a test information message.", String.Empty, 0, fireAgain)
        Dts.Events.FireWarning(201, "Custom Script Warning", "This is a test warning message.", String.Empty, 0)
        Dts.Events.FireError(201, "Custom Script Error", "This is a test error message.", String.Empty, 0)

        Dts.TaskResult = ScriptResults.Success
    End Sub

#Region "ScriptResults declaration"
   
    Enum ScriptResults
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    End Enum

#End Region

End Class

脚本任务代码

如果我们执行包,它将失败,因为我们在Script Task中引发了错误。

包执行

如果您导航到记录错误的数据源,您会注意到如果您选择 SQL Server 日志记录提供程序,SSIS 会创建一个表来记录信息。下表列出了 SSIS 在选择作为日志提供程序的 SQL Server 数据库中创建的日志记录表。

SSIS Version   Log table name    Table type
-------------- ----------------  ----------
SSIS 2005      dbo.sysdtslog90   User
SSIS 2008      dbo.sysdtslog100  User
SSIS 2008 R2   dbo.sysssislog    System
SSIS 2012      dbo.sysssislog    System

在数据库中执行以下查询以查看此示例包捕获的事件。您会注意到一些消息两次,因为每个容器和任务都记录了这些事件。之所以命名该表,是dbo.sysssislog因为该包是在 SSIS 2012 中创建的。

select id, event, source, message from dbo.sysssislog;

记录数据

个人日志记录经验:

我在查看日志记录错误消息以了解出了什么问题方面取得了相当大的成功。在我看来,不建议在生产环境中调试包。但是,最好捕获日志事件。

当我在 SSIS 2005 和 2008 工作时,我创建了基于 SSRS 的报告,该报告查询日志表以生成作业执行的每日报告并将 PDF 附件发送给感兴趣的人。

SSIS 2012 中的情况有所改进,该工具具有内置报告功能,集成服务目录可创建名为SSIDB.

于 2013-02-21T14:36:30.453 回答
2

在我目前的演出中,我们已经开始使用 Pragmatic Works 的一款名为BIxPress的产品,其中包括将日志代码注入现有 SSIS 包并在它们执行时监控正在运行的包的工具。它并不便宜,但我们发现它很有帮助。(特别是因为这意味着我们不必推出自己的监控代码......)

于 2013-02-21T18:16:31.357 回答