由于我公司IT部门发生的各种更新,有些时候这些出口制动,并且该过程将在工作中间停止工作.要对此过程进行故障排除,我会在工作站上启动BIDS并重新启动哪个进程失败.这很有用,因为根据我的经验,从BIDS中生成的任何错误都比我在sql Server /程序包执行历史记录或服务器事件日志中发现的任何错误更有用.
从历史上看,我的问题是并非所有问题都会出现在BIDS中,但它们会一直在服务器上.这些问题对于诊断来说是痛苦的,并且花费了我很多时间.
因此,我想要做的是将我的包发布到SSIS服务器,从BIDS启动服务器实例并在运行时监视项目.这可能吗?
如果没有,我还能做些什么,以便我可以在流程执行时监控内部步骤吗?
我担心这一切都不可能,但我不得不问.它将使我的调试和故障排除生活变得更加容易.
解决方法
您需要在SSIS中使用日志记录功能.它允许您配置要捕获消息的事件.我通常更喜欢使用日志OnWarning和OnError来跟踪包中发生的所有警告和错误消息.您有各种提供程序来保存日志记录数据.我更喜欢使用sql Server,以便我可以查询日志记录信息.
SSIS 2012显示的日志选项:
要在程序包中启用日志记录,如果要在SSIS 2012中开发程序包,则需要在SSIS 2005 – 2008 R2或sql Server数据工具(SSDT)中开发程序包时单击程序包Business Intelligence Development Studio(BIDS).
单击SSIS菜单,然后单击日志…
您将看到“配置SSIS日志”对话框.
在左侧,您可以检查包或单个任务以记录事件数据.
在“提供程序和日志”选项卡上,您可以选择可以保存日志信息的相应提供程序.下面的屏幕截图显示使用连接管理器OLEDB_PracticeDB在sql Server数据库中捕获事件信息.
在“详细信息”选项卡上,您可以选择要捕获的事件.下面的屏幕截图显示我正在捕获以下事件.
> OnError
> OnInformation
> OnTaskFailed
> OnWarning
感谢@William Todd Salzman推荐OnTaskFailed事件
样品包装图:
假设我们有一个名为SO_15004109.dtsx的包,其中包含数据流任务和脚本任务.数据流任务只是一个虚拟内部没有组件.
脚本任务在Main方法中具有以下代码,用于触发自定义信息,警告和错误消息,以便我们可以观察它在日志记录数据源中的捕获方式.代码是为SSIS 2012编写的,因此您可能需要为SSIS 2005更改它.我选择了VB.NET而不是C#,因为您在sql-server-2005下标记了这个问题,而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,fireAgain) Dts.Events.FireWarning(201,"Custom Script Warning","This is a test warning message.",0) Dts.Events.FireError(201,"Custom Script Error","This is a test error message.",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
如果我们执行包,它将失败,因为我们在脚本任务中引发了错误.
如果导航到记录错误的数据源,您会注意到,如果选择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中,该工具已经改进,该工具带有内置的报告功能,Integration Services Catalog创建了一个名为SSIDB的数据库.