可靠性和扩展性是所有系统的最终目标之一,他们两个看起来有些对立,不过通常来讲他们又有相互的联系。错误和造成错误的条件是可靠性最明显的威胁。SSIS提供了解决这些情况的优雅的方法。这个章节中要关注的特性是错误输出和检验点,使用他们来实现可靠性,他们也可以保证包的执行性能和扩展性。
重新启动
一种经常遇到的情况,一个需要整夜执行的包执行失败了,需要重新执行它。如果其中一个步骤非常的耗费资源和时间,重新执行它是一件痛苦的事情。在DTS中没有类似“断点续传”的功能。重新执行一个失败的包是很容易再次出错的。由不同的策略在解决这些问问题,但是需要清楚DTS模型的工作原理,大多数DBA都没有这样的工作经验。
由于这些因素,SQL Server 2008中的检验点功能是非常难得的方法,在SSIS中检验点是包的重新启动的基础,它将包的执行状态写入到一个文件中。这些状态信息包括那个task已经执行过,那个task执行出错了。要正确地设置检验点文件,有三个包 属性和一个task属性需要设置:
- CheckpointFilename:这个属性必须设置,检验点文件的后缀是.chk
- CheckpointUsage: 是否使用检验点,有三种值来描述如何使用检验点
Never: 不使用检验文件
If Exists: 如果设置了CheckpointFilename属性,包将按照检验文件重新执行
Always: 总是使用检验文件重新执行,如果没有指定文件将报错 - SaveCheckpoints: 这是一个布尔值指定是否写入检验点,很明显这个值应该重视设置为true
- FailPackageOnFailure: 这个属性是在task中设置的,当要将一个task设置为重新执行的检验点,如果这个属性没有被设置为true,执行失败时信息不会被写入到检验点文件中,下次执行的时候将会从第一个task开始执行
注意:SSIS 包被细分成Control Flow和 Data Flow,只能在Control Flow中设置检验点而不能在Data flow中设置。如果在包的执行过程中没有出现错误,检验点文件也不会产生。检验点文件包含所有重新启动包的信息。
简单的Control Flow
我们首先从一个简单的例子开始如图1三个ExecuteSQL。
图1
在第二个task中我们设置一个错误,select 1/0,如图2
图2
我们假设第一个task是一个耗时耗力的任务,为了它在执行完之后不会被执行第2次,将检验点设置在这个任务上,首先设置包的属性如图3
图3
现在设置第二个task的属性如图4
图4
执行包,它在第二个task处失败如图5
图5
在这里如果这个是在DTS环境中我们修改package,并且做一些额外的工作保证task 1不会被再次执行,但是我们是用SSIS来创建的这个包,依赖检验点来实现这个。在错误输出重我们看到一些内容被写倒检验点文件中,如下:
SSIS package "CheckPoint.dtsx" starting.
Information: 0x40016045 at CheckPoint: The package will be saving checkpoints to file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" during execution. The package is configured to save checkpoints.
Information: 0x40016049 at CheckPoint: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" update starting.
Information: 0x40016047 at 1: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" was updated to record completion of this container.
Error: 0xC002F210 at 2, Execute SQL Task: Executing the query "select 1/0" failed with the following error: "Divide by zero error encountered.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
Task failed: 2
Warning: 0x80014058 at 2: This task or container has failed, but because FailPackageOnFailure property is FALSE, the package will continue. This warning is posted when the SaveCheckpoints property of the package is set to TRUE and the task or container fails.
Information: 0x40016049 at CheckPoint: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" update starting.
Information: 0x40016047 at 2: Checkpoint file "D:\MyProject\IntegrationService\ProSSISChapter5\checkpoint\chkSimple3ExecuteSqltask.chk" was updated to record completion of this container.
SSIS package "CheckPoint.dtsx" finished: Failure.
在文件目录中我们也可以看到这个文件如图6
图6
现在我们修正task2种的错误:select 1/2,再次执行这个包结果如图7:
图7
Task1被忽略,从task2开始执行。这里注意task2的FailPackageOnFailure属性必须设置成true,否则的话检验文件不会被写入,再次执行的时候还是会从task1开始执行。我们来试一试如图8
图8
执行包,如图9它将仍然从task1开始执行,这不是我们希望的。
图9
这个例子简单地说明了检验点的工作过程,在实际的生产环境情况可能会很复杂。
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com 联系我,非常感谢。