SSIS 检查点
SSIS的检查点(Checkpoint)实际上是一个用于保存Task组件的状态的文件,它记录控制流中Task组件的执行状态和变量的值。用户通过合理地配置Checkpoint,在Package运行出错之后,重新执行Package,可以跳过上一次已经成功执行的步骤,而直接从失败的地方重新执行,这就意味着,从哪里失败,从哪里执行,这可以大大提高Package失败后再次执行的效率。通常一个Package由多个控制流的Task组件和数据流组件构成,跑完整个Package会耗费的时间会比较长,例如,Package包含5个Task,前4个Task都执行成功,第5个Task执行失败,如果Package下次从第5个Task开始执行,那么再次执行Package将会节省大量的时间。
使Package在错误点重新执行,这是CheckPoint设计的目的,但是,Checkpoint文件只会保存Task级别的执行状态和变量的值,对于数据流Task中的源、转换和目的,Checkpoint不会记录其状态,这就意味着,必须把数据流任务作为一个整体来运行。
一,配置CheckPoint
通过配置CheckPoint,使Package在Task执行失败之后,记录发生错误的Task组件。当Package再次执行时,直接从出错的Task组件开始执行,而不用浪费时间,去重复执行已经成功的Task组件,这是SSIS的错误重试机制。而启用Checkpoint,需要配置Package级别和Task级别的属性。
1,配置Package级别的属性
启用Checkpoint,必须配置Package的三个属性:
- CheckpointFileName:用于指定Checkpoint文件存储的路径,如果Packge在运行时出现了错误并中断,那么这个文件将会保持中断时的运行快照。
- CheckpointUsage:指定Package使用Checkpoint的情况,共有3个有效值:
- Never:不使用CheckPoint,
- Always:每次都使用Checkpoint
- IfExists:如果Checkpoint文件,那么使用Checkpoint,这就意味着,只有当CheckPoint文件存在时,才会执行CheckPoint机制,读取CheckPoint文件的内容,从上次的错误点开始执行package。
- SaveCheckpoints:是Checkpoint的关键属性,指定是否存储Checkpoint,也就说,要启用Checkpoint,该属性必须设置为True。
2,配置Task级别的属性
只有当Package被Task失败的触发时,Package才会保存CheckPoint,因此,为了触发Package的Checkpoint,在Task失败时,必须使Package失败,这就需要配置Task级别两个属性FailPackageOnFail和FailParentOnFail。
FailPackageOnFailure:默认值是False,该属性用于指定当Task失败时,Package是否失败。
- True表示如果当Task失败时,使Package失败;当Package的属性SaveCheckpoints为True,并且CheckpointFileUsage为IfExists时,这将在故障点重新开始执行Package。
当Task失败时,只有把该属性 FailPackageOnFail 设置为True,CheckPoint才会把该Task记录下来;如果这个属性都设置为False,那么该Task的失败不会触发CheckPoint记录故障点。
FailParentOnFailure:作用于Task的容器,当Task位于容器内时,该属性指定Task的失败是否影响容器的状态:
- 把容器记录为故障点:把Task的FailParentOnFail属性设置为True,把Task的FailPackageOnFailure设置为Fasle,并把容器的FailPackageOnFailure设置为True。
- 把容器内得Task记录故障点:把容器内的Task的FailPackageOnFailure设置为True。
当把属性FailParentOnFailure设置ture时,Task会把失败状态向上传递到其父容器;当把属性FailParentOnFailure设置false时,Task不会把失败状态向上传递到其父容器。当把失败传递给父容器,并且父容器的FailPackageOnFail设置为True,那么父容器使Package失败,这会使得Checkpoint把容器记录为故障点。
二,CheckPoint过程解析
CheckPoint文件记录Package执行失败时的错误信息,在重新执行package时,Package读取该文件以确定从那个task开始。当Package执行成功时,不会生成CheckPoint文件;只有执行失败时,才会生成CheckPoint文件。
1,CheckpointUsage 的用法
为了启用Checkpoint,必须设置SaveCheckpoints为Ture。当SaveCheckpoints属性设置为True之后,Package每次执行都检查CheckpointUsage属性,对于SaveCheckpoints属性的不同设置,Package会有不同的行为。
- 当CheckpointUsage 为 IfExists 时,如果存在CheckPoint文件,那么执行CheckPoint,从CheckPoint文件中记录的错误点开始执行package;如果不存在CheckPoint文件,那么从头开始执行package。
- 当CheckpointUsage 为 Never 时,不会检查CheckPoint文件,不管是否存在CheckPoint文件,都不使用CheckPoint。
- 当CheckpointUsage 为 Always 时,始终检查CheckPoint文件,当CheckPoint文件不存在,Package会报错。
Error: Checkpoint file "xxx" failed to open due to error 0x80070002 "The system cannot find the file specified.".
Error: The package failed during execution because the checkpoint file cannot be loaded. Further execution of the package requires a checkpoint file. This error usually occurs when the CheckpointUsage property is set to ALWAYS, which specifies that the package always restarts.
2,解析Checkpoint的工作流程
通常情况下,项目中常用的配置是:
- SaveCheckpoints:为True
- CheckpointUsage:为IfExists
- CheckpointFileName:为Checkpoint文件的路径
在启用了检查点之后,Package的工作流程通常是:
- 第一步:检查 Checkpoint 文件是否存在,如果不存在,那么Package从头开始执行;如果存在,Package读取文件,并找到从哪一个 Task 开始执行,并且从中读取文件中保存的变量和连接信息。
- 第二步:更新每一个启用 Checkpoint (FailPackageOnFailure = True) 的Task的状态,把已经执行成功的Task的状态更新到 Checkpoint 文件。
- 第三步:如果Package执行失败,那么 Checkpoint 文件保留上一个执行成功的 Task 的信息。
- 第四步:如果Package执行成功,那么删除 Checkpoint 文件,当下一次启动Package时,从Package的第一个 Task 开始执行。
三,探索Task的Checkpoint
创建一个新的Package,添加两个Execute SQL Task,配置Task的属性,测试Task的Checkpoint工作流程。
1,配置Package的属性,开启CheckPoint机制
设置Package的Checkpoints属性为:

2,查看FailPackageOnFail=False的行为
当执行Package时,Task执行失败,但是CheckPoint文件没有生成,原因是没有设置Task的FailPackageOnFail属性,其保持默认值False。
也就时说,当FailPackageOnFail=False时,虽然Package执行失败,但是不会生成CheckPoint文件。

3,查看FailPackageOnFail=True的行为
把Task的 FailPackageOnFail 属性设置为true,重新执行Package之后,生成CheckPoint文件,内容是:
<DTS:Checkpoint
xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:PackageID="{97AB8700-8254-4D50-969C-B6E992C06D53}">
<DTS:Variables DTS:ContID="{97AB8700-8254-4D50-969C-B6E992C06D53}"/>
<DTS:Container DTS:ContID="{6AA5C196-805F-404F-A987-16D318C26E3E}" DTS:Result="0" DTS:PrecedenceMap=""/>
</DTS:Checkpoint>
有用的信息是<DTS:Container >中记录的“DTS:ContID”,这个ContID是Package成功执行的最后一个Task的ID,“DTS:Result=0”,表明Task执行成功。
修正错误点的SQL语句,再次执行Package,Package从上次失败的Task开始执行Package。

四,探索容器的Checkpoint
容器的Checkpoint配置,会比Task多一个属性FailParentOnFailure,应根据需要为容器配置该属性。总的来说,对容器有两种配置:
- 配置A:设置容器的Task属性:FailPackageOnFail=False,FailParentOnFailure=True,设置容器的属性:FailPackageOnFail=True。
- 配置B:设置容器的Task属性:FailPackageOnFail=True,FailParentOnFailure=False,容器的属性保持默认值。
1,探究配置A
设置Execute SQL Task 2的属性FailPackageOnFail=False,FailParentOnFailure=True,设置容器的属性FailPackageOnFail=True。

查看CheckPoint文件,内容是XML格式,有用信息是第一个<DTS:Contrainer>节,ContID是Task的ID,“DTS:Result=0”,表明Task执行成功。
<DTS:Checkpoint
xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:PackageID="{EB3A3226-0D11-425E-BA6F-E628375D4A7A}">
<DTS:Variables DTS:ContID="{EB3A3226-0D11-425E-BA6F-E628375D4A7A}"/>
<DTS:Variables DTS:ContID="{8AF684D1-DAE9-422A-86C3-28E5469866F8}"/>
<DTS:Container DTS:ContID="{B978F098-D7A1-47E1-9870-AED62CCD6FA1}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{5FDFEFEC-CFF0-4527-92BB-64EF54E9D0E6}" DTS:Result="0" DTS:PrecedenceMap=""/>
</DTS:Checkpoint>
从该文件中,看到有两个<DTS:Contrainer>节,表明有两个Task执行成功,而实际上,只有Execute SQL Task 1执行成功,这是为什么?这是因为我们把Execute SQL Task 2的属性FailPackageOnFail设置为False,Task失败不会是Package也失败,所以Package认为该Task执行的结果是成功。
重新执行Package,查看执行情况,Package并没有从出错的Task开始执行,而是从出错的Task的下一个Task开始执行。

这种配置是不可取的,它会导致Package不能从失败的Task开始执行,这里仅仅是为了演示Task的FailParentOnFailure属性的用法。
2,探究配置B
设置Execute SQL Task 2的属性FailPackageOnFail=Ture,FailParentOnFailure=False,容器和其他Task保持默认值,也就是说容器的FailParentOnFailure=False,FailPackageOnFail=False。
<DTS:Checkpoint
xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:PackageID="{EB3A3226-0D11-425E-BA6F-E628375D4A7A}">
<DTS:Variables DTS:ContID="{EB3A3226-0D11-425E-BA6F-E628375D4A7A}"/>
<DTS:Container DTS:ContID="{B978F098-D7A1-47E1-9870-AED62CCD6FA1}" DTS:Result="0" DTS:PrecedenceMap=""/>
</DTS:Checkpoint>
有用信息是第一个<DTS:Contrainer>节,ContID是Task的ID,“DTS:Result=0”,表明Task执行成功,从Checkpoint文件中,可以看到只有一个Task执行成功,也就是Execute SQL Task1执行成功。
重新执行Package,查看执行情况,Package从出错的Task开始执行:

因此,通常情况下,请无视Task的FailParentOnFailure属性,保持其默认值,而直接配置Task的FailPackageOnFail属性,设置为True,就可以实现在错误点重新执行。
补充一句,对Task和容器的属性(FailParentOnFailure和FailPackageOnFail)配置不同的组合,会产生不同的行为,有兴趣的读者可以自行测试,本文不再赘述。
参考文档:
微软BI 之SSIS 系列 - 通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性
Integration Services Checkpoints to restart package from failure
SSIS 检查点的更多相关文章
- 微软BI 之SSIS 系列 - 通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性
开篇介绍 通常一个 ETL Package 是由多个控制流和数据流共同组成,有的时候 ETL 的步骤可能会比较多,整个流程执行下来的时间可能比较长.假设在 ETL Package 中包含5个Task, ...
- SSIS的CheckPoint用法
在SSIS的Package Property中有CheckPoints的属性目录,CheckPoint是SSIS的Failover Feature.通过简单的配置CheckPoint,能够在Packa ...
- 微软BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
[公告]本博客于2015年10月起不再更新 新博客文章主要发表在商业智能BI社区: http://www.flybi.net/blog/biwork 博客地图自动分类 文章目录方便更好的导航,阅读文章 ...
- 在SSIS包中使用 Checkpoint从失败处重新启动包
使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...
- BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
微软 BI ETL 架构设计 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改 ...
- 在SSIS包中使用 Checkpoint从失败处重新启动包[转]
使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...
- SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
可以执行 SSIS Package ,证明用 SSIS Package 的账户是可以执行成功的.SQL Server Agent 默认指定账号是 Network Service. 那么可以尝试一下将 ...
- APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点)
APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近涉足APP端测试,常见检查点总结如下: 一.业务方面: 1. 注册( ...
- SSIS 属性:ExecValueVariable
有些Task组件执行完成之后,会产生输出结果,称作Execution Value,例如,Execute SQL Task在执行完成之后,会返回受影响的数据行数.Task组件的Execution Val ...
随机推荐
- C/C++预处理指令#define,#ifdef,#ifndef,#endif… (转)
本文转自博文C/C++预处理指令#define,#ifdef,#ifndef,#endif….这篇博文写得特别好,特转载. 本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何 ...
- 实战:通过ViewModel规范TableView界面开发
TableView界面可以说是移动App中最常用的界面之一了,物品/消息列表.详情编辑.属性设置--几乎每个app都可以看到它的身影.如何优美地实现一个TableView界面,就成了iOS开发者的必备 ...
- The 16th tip of DB Query Analyzer
The 16th tip of DB Query Analyzer ---- SQL Schedule will be executed even DBMS h ...
- Android开发技巧——高亮的用户操作指南
Android开发技巧--高亮的用户操作指南 2015-12-15补记: 发现使用PopupWindow进行遮罩层的显示,在华为P7上会有问题.具体表现为:画出来的高亮部分会偏下.原因为:通过view ...
- ZooKeeper客户端事件串行化处理
为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造.在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题, ...
- SharePoint 入门级介绍
前言:接触SharePoint两年有余,从一开始的小白,变成现在的菜鸟,一路走来,学到很多,现在,想把自己知道的东西,写给大家,尤其是刚刚接触SharePoint的人们,做一个简单的参考.从一开始接触 ...
- obj-c编程06:反射与元编程初步
我们知道对于现如今的动态语言比如ruby而言,反射和元编程以及支持的非常灵活了,你完全可以跳过常规的手段,而利用反射来查询或调用对象的私有方法.而obj-c对反射的支持略显小繁琐,而且在开了ARC后同 ...
- UML类图简介
概述 设计模式中常常使用UML来表示类与类,类与接口之间的关系,UML类图是设计模式入门必备的技能,感觉各种关系比较多,这里做一下总结. 类与接口的表示 类与接口通常是一个矩形框表示,一般分为3层,第 ...
- SQLCODE和SQLERRM .
Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息. OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕 ...
- Jedis对Redis的常用命令操作
本篇主要总结一些Jedis对Redis的常用命令操作: 1.对key操作命令 2.对String操作命令 3.对List操作命令 4.对Set操作命令 5.对Hash操作命令 6.排序操作指令 一.项 ...