SSIS的CheckPoint用法

在SSIS的Package Property中有CheckPoints的属性目录,CheckPoint是SSIS的Failover Feature。通过简单的配置CheckPoint,能够在Package执行失败时,不重复执行已经成功的Control Flow,只在最后出错点继续执行。

一,CheckPoint属性

开启Packge的CheckPoint机制,只需要配置Package的三个属性:CheckPointFileName,CheckpointUsage,SaveCheckpoint。

CheckpointFileName是指定保存文件的路径,如果Packge在运行时出现了错误并中断,那么这个文件将会保持中断时的运行快照。

CheckpointUsage指定是否执行Checkpoint,有三种值Never,IfExists,Always,Never是不时用CheckPoint,Always是每次都开启,IfExists是在Checkpoint文件存在的情况下开启,只有当CheckPointFile存在时,才会执行CheckPoint机制,读取CheckPoint文件的内容,从上次的错误点开始执行package。CheckPoint文件存放的Paht是由CheckpointFileName指定的。

SaveCheckpoint指定Package是否开启CheckPoint Feature,是Checkpoint的关键属性,必须开启。

二,与CheckPoint机制相关的属性是Task的FailPackageOnFail和FailParentOnFailure,这两个属性用以确定CheckPoint文件记录Task的ID的行为,确定重新执行的Task。

FailPackageOnFail是当Executable失败时,指定整个Package是否失败。

当FailPackageOnFail=True,当组件失败时,CheckPoint不会记录到CheckPoint文件中;当FailPackageOnFail=false,当组件失败时,CheckPoint会记录到CheckPoint文件中,如果一个Task的ID被记录到CheckPoint文件中,那么SSIS不会认为该Task执行失败;

FailParentOnFailure是当Executable失败时,指定Executable的Parent Task是否失败。

将属性FailParentOnFailure=ture,当Task失败,将失败状态向上传递到其父组件,将属性FailParentOnFailure=false,当Task失败,不会将失败状态向上传递到其父组件。传递给父组件的失败状态是一个指标,行为受到父组件的FailPackageOnFail属性的影响,父组件能够继续传递失败状态。

这两个属性是Control Flow组件的Property,影响CheckPoint对组件执行状态(失败状态)的判断,使用CheckPoint重新执行package时,会产生不同的行为:

FailPackageOnFail=true 是指如果该Control Flow异常了,中断运行,下次在该Control Flow上继续执行。

FailParentOnFailure=true 是指如果该Control Flow异常了,中断运行,下次在该Control Flow的parent上重新执行。

如果这两个属性都设置为False,不会触发CheckPoint机制。

三,CheckPoint文件的作用

CheckPoint文件记录package执行失败时的错误点信息,在重新执行package时,package读取该文件以确定从那个task开始。当package执行成功时,不会生成CheckPoint文件;只有执行失败时,才会生成CheckPoint文件。

1,当package执行时,Package先检查CheckpointUsage属性,当CheckpointUsage=Never时,不会检查CheckPoint文件,不管是否存在CheckPoint文件,都不执行CheckPoint机制。

2,当CheckpointUsage=Always时,始终检查CheckPoint文件,当CheckPoint文件不存在,Package报错。

Error: Checkpoint file "D:\StudyProjects\TestIS\CK_package1.txt" 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.

3,当CheckpointUsage=IfExists时,如果存在CheckPoint文件,那么执行CheckPoint机制,从CheckPoint文件中记录的错误点开始执行package;如果不存在CheckPoint文件,那么从头开始执行package。

如果上次package执行失败,手动将CheckPoint文件删除,在package重新执行时,由于检查不到CheckPoint文件,package会从头开始执行整个package。

BIWork对CheckPoint 执行过程解析

http://www.cnblogs.com/biwork/p/3366724.html

CheckPoint 执行过程解析

启用了检查点的 Package 在重新执行的时候它的执行过程通常是这样的:

第一步,检查 Checkpoints 文件是否存在。如果不存在的话,那么包将从头开始执行。如果存在,包将读取这个文件并找到应该从哪一个 Task 开始执行。并且也会从中读取一些有关如何从上一次失败的时候要如何更新相应的变量和连接信息。

第二步,更新每一个设置过 Checkpoint (FailPackageOnFailure = True) 的那些已经执行成功的Task的状态,记录下来更新到 Checkpoint 文件。

第三步,如果包执行失败,那么 Checkpoint 文件将不会改变并只会保留上一次执行成功的 Task 的信息。

第四步,如果包执行成功,那么 Checkpoint 文件就会被删除掉。那么下一次包再运行的时候,Checkpoint 文件将不会存在,这样包又会继续从第一个 Task 开始执行。

如果将 CheckpointUsage 属性设置为 Always, 那么检查文件必须存在否则包将不会执行。另外,如果包设置了 TransactionOption = Required 的话,将不允许使用 Checkpoints 这一机制。

四,示例,使用CheckPoint机制,使package在错误点 retry

1,创建示例表和Control Design

CREATE TABLE [dbo].[ptest]
(
    [id] [int] identity(1,1) NOT NULL,
    [code] [int] NOT NULL,
    CONSTRAINT [pk_ptest] PRIMARY KEY NONCLUSTERED
    (
        id ASC
    )
)

Task Execute Sql Task的sql语句是,执行肯定成功,哨兵Task。

select 0

Task Befroe sequence的sql语句是

insert into dbo.ptest(code)
values(1)

Task In sequence的sql语句是

insert into dbo.ptest(code)
values(2)

Task After sequence的sql语句是

insert into dbo.ptest(code)
values(3)

2,设置Package Property,以开启CheckPoint机制

3,执行package,查看CheckPoint文件

当Package执行成功时,不会生成CheckPointFile,即CheckPointFileName指定的文件不会生成。

修改Task Before Sequence的sql语句,当执行package时,Task Before Sequence会失败,但是CheckPoint文件还是没有生成,原因是没有设置Control Flow中Task的FailPackageOnFail或FailParentOnFailure属性,其保持默认值False。

insert into dbo.ptest(code)
values(‘a‘)

将Task Before Sequence的 FailPackageOnFail属性设置为true,重新执行,在指定的path下,生成CheckPointFile,内容是:

<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,这个ID是package重估执行的最后一个Task的ID。

4,修改Task Before Sequence的sql语句,重新执行,发现package从Task Before Sequence开始执行,在package执行成功后,SSIS将CheckPoint 文件删除。

insert into dbo.ptest(code)
values(1)

5,由于Task Before Sequence没有parent 组件,设置Control Flow中Task的FailPackageOnFail=true或FailParentOnFailure=true,其CheckPoint的行为是一样的;

6,修改Sequence container,增加一个task Post Sequence,设置FailPackageOnFail=true,其sql语句是

insert into dbo.ptest(code)
values(‘b‘)

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:Variables DTS:ContID="{9C621223-408D-46D5-8EC8-0B809ADDF9D4}"/>
<DTS:Container DTS:ContID="{3CADE007-26BC-44B2-87D9-480687085B6D}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{9F95AD28-9522-49E8-8470-B7D1C5069078}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{6AA5C196-805F-404F-A987-16D318C26E3E}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
</DTS:Checkpoint>

有用信息是第一个<DTS:Contrainer DTS:ContID=..../>,ContID是Task In Sequence的ID,是最后一个执行成功的Task,CheckPoint记录ID是逆序的。

7,修改Task Post Sequence的sql语句,查看执行情况,是从出错的Task开始执行。

insert into dbo.ptest(code)
values(5)

8,修改Task Post Sequence的sql 语句

insert into dbo.ptest(code)
values(‘c’)

将Task Post Sequence的属性 FailPackageOnFail=false,FailParentOnFailure=true,查看执行情况

发现没有CheckPoint文件生成,原因是Task PostSequence的parent 组件是Sequence Container没有设置属性 FailPackageOnFail=true或FailParentOnFailure=true,将Sequence Container的属性FailPackageOnFail=true,FailParentOnFailure=false。

重新执行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:Variables DTS:ContID="{9C621223-408D-46D5-8EC8-0B809ADDF9D4}"/>
<DTS:Container DTS:ContID="{3CADE007-26BC-44B2-87D9-480687085B6D}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{9F95AD28-9522-49E8-8470-B7D1C5069078}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{327EEB3F-D446-47E0-A593-DACF3FD96FB4}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{6AA5C196-805F-404F-A987-16D318C26E3E}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
</DTS:Checkpoint>

第一个<DTS:Container DTS:ContID=..../>记录的是Task In Sequence的ID,是最后一个成功执行的Task。

第二个<DTS:Container DTS:ContID=..../>记录的是Task Before Sequence的ID,DTS:Result=0表明其执行成功。

第三个<DTS:Container DTS:ContID=..../>记录的是Task Post Sequence的ID,DTS:Result=0表明其执行成功。

第四个<DTS:Container DTS:ContID=..../>记录的是Task Execute SQL Task的ID,DTS:Result=0表明其执行成功。

为什么第一个<DTS:Container DTS:ContID=..../>记录的是Task In Sequence的ID,是最后一个成功执行的Task?

这种情况是由于Task Post Sequence的属性 FailPackageOnFail=false,FailParentOnFailure=true设置造成的。虽然Task Post Sequence失败,但是由于FailParentOnFailure=true,那么失败会“归咎”于其父组件Sequence Container。

Sequence Container属性FailPackageOnFail=true,那么当内部的Task失败时,Sequence Container执行失败,CheckPoint会记录该组件失败。在Sequence Container之前最后一个执行成功的组件是Task In Sequence,所以第一个<DTS:Container DTS:ContID=..../>记录的是Task In Sequence的ID,是最后一个成功执行的Task。

Task Post Sequence执行失败,为什么在CheckPoint中却记录其执行成功?

这种情况是由于Task Post Sequence的属性 FailPackageOnFail=false,FailParentOnFailure=true设置造成的。虽然Task Post Sequence失败,但是由于FailPackageOnFailure=false,即使执行失败,也不会将状态记录为“Failure”,FailPackageOnFailure=false的设置会导致CheckPoint不能正确记录Task的执行情况,不管其执行成功与否,都会记作成功。

9,对package做任何修改,再次执行package,查看package的运行情况,很怪异,package不执行Sequence Container中的Task,继续执行Task Post Sequence。

CheckPoint机制可能的执行计划是:

step1,检查Checkpoint文件的日志,从Task In Sequence开始执行package

step2,在执行每一个task之前,先检查Checkpoint文件的日志,如果Task的状态为成功(DTS:Result=0表明执行成功),那么不再执行该task;如果Task的状态为失败,从该Task开始执行。

如果Task Post Sequence之后,存在一个task,那么是否会执行?

10,在Task Post Sequence之后,增加一个Task End Sequence,sql语句是

insert into dbo.ptest(code)
values(7)

查看CheckPoint文件,和上一个CheckPoint文件内容一致,结论:CheckPoint会记录已经执行成功的Task的ID。

<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:Variables DTS:ContID="{9C621223-408D-46D5-8EC8-0B809ADDF9D4}"/>
<DTS:Container DTS:ContID="{3CADE007-26BC-44B2-87D9-480687085B6D}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{9F95AD28-9522-49E8-8470-B7D1C5069078}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{327EEB3F-D446-47E0-A593-DACF3FD96FB4}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{6AA5C196-805F-404F-A987-16D318C26E3E}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
</DTS:Checkpoint>

不做任何修改,再次执行package,查看执行情况

CheckPoint机制可能的执行计划是:

step1,检查Checkpoint文件的日志,从最后一个成功执行的Task(Task In Sequence)之后的第一个Task开始执行package。

step2,在执行每一个task之前,先检查Checkpoint文件的日志,如果Task的状态为成功(DTS:Result=0表明执行成功),那么不再执行该task;如果Task的状态为失败或Task的ID不存在于CheckPoint中,那么执行该Task。

结论:package会检查CheckPoint文件,如果Task的状态为成功(DTS:Result=0表明执行成功),那么不再执行该task,跳过而检查下一个task的执行状态;如果Task的状态为失败或Task的ID不存在于CheckPoint中,那么执行该Task。

11,修改Task Post Sequence的属性FailPackageOnFail=true,FailParentOnFailure=true,查看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:Variables DTS:ContID="{9C621223-408D-46D5-8EC8-0B809ADDF9D4}"/>
<DTS:Container DTS:ContID="{3CADE007-26BC-44B2-87D9-480687085B6D}" DTS:Result="0" DTS:PrecedenceMap=""/>
<DTS:Container DTS:ContID="{9F95AD28-9522-49E8-8470-B7D1C5069078}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
<DTS:Container DTS:ContID="{6AA5C196-805F-404F-A987-16D318C26E3E}" DTS:Result="0" DTS:PrecedenceMap="Y"/>
</DTS:Checkpoint>

第一个<DTS:Container DTS:ContID=..../>记录的是Task Before Sequence的ID,是最后一个成功执行的Task。

第二个<DTS:Container DTS:ContID=..../>记录的是Task In Sequence的ID,DTS:Result=0表明其执行成功。

第三个<DTS:Container DTS:ContID=..../>记录的是Task Execute SQL Task的ID,DTS:Result=0表明其执行成功。

Task Post Sequence的执行状态没有记录到CheckPoint文件中,其执行状态是失败。

不做任何修改,再次执行package,查看执行情况

12,将Sequence Container的属性FailPackageOnFail=false,FailParentOnFailure=true,当package执行失败时,没有生成CheckPoint文件,原因是Package 的属性FailPackageOnFail=false,FailParentOnFailure=false。

由于Package的属性FailPackageOnFail=false是固定的,不能修改,所以当一个组件的parent组件是Package时,不能设置FailParentOnFailure=true。

时间: 2024-08-02 00:03:49

SSIS的CheckPoint用法的相关文章

SSIS之数据转换用法

当SSIS报错为:“无法在unicode和非unicode字符串数据类型之间转换”,可以考虑用数据转换器实现,很简单,如下图: 第一步,找到数据转换器: 第二步,编辑数据转换器: 第三步:编辑目标映射关系为“XXX 的副本”,即可. 错误排除,成功. 注:SSIS的数据连接管理器最好使用“SQL Server身份验证”,这样才可保证代理作业的正常执行,当然给Windows身份认证的帐号设定足够的权限也是可以的.

利用SSIS的ForcedExecutionResult 属性 和CheckPoint调试Package

1,ForcedExecutionResult 强制一个package或task执行的结果,共有四种值 None,Success,Failure,Completion,默认值是None,表示不强制返回值. 如果设置ForcedExecutionResult=Success,不管package执行过程中是否出现异常,package执行的结果都是Success. The default value of this property is None, which indicates that the

SSIS Design5:使用暂存

以数据流的方式来设计Package,将核心数据处理移动到数据流中,一般情况下,能够减少临时表的创建,获得较高的处理性能,在某些情况下,使用暂存表(staging table)能够优化package设计. 1,使用基于集合的更新操作 在大型系统中,数据更新通常是系统的bottleneck,因为SSIS不能在Data Flow 中执行基于集合的更新.在Data Flow中,OLEDB Command 转换组件是逐行对数据进行更新的,对每一行数据执行更新操作,会导致低下的性能.对于存在大量更新的数据流

SSIS 优化设计1:数据源的提取和使用暂存

在使用SSIS Package处理海量数据时,必须精心设计Package的各个Task组件,“锱铢必较”,以最快的速度和最小的资源消耗,完成既定的数据处理任务.在处理数据源提取时,数据的大小由两个方面决定:数据行的宽度和数据行的数量,为了减少ETL运行的时间,可以从源数据的提取上做优化设计,从数据源的输入上控制数据的数量和大小,以减少数据转换的次数,内存的消耗量,以及硬盘IO的次数. 一,减少行的宽度 1,只加载需要的数据列 在Data Flow中,数据源允许加载整个Table 或View,虽然

SSIS错误恢复利器:CheckPoint

?? 大家对使用SSIS做数据接口应该不陌生了吧,没听过的同学得努力补补了.就开发体验和效率来看,SSIS是款非常酷的软件,学会它的基本使用方法还是很有必要的.既然是数据接口就免不了要考虑灾难恢复这样的事情了.还好SSIS为我们提供了OOB的Feature-- CheckPoint,关键时候还是可以抱抱它大腿的. CheckPoint,SSIS的Failover组件.通过配置SSIS Package的CheckPoint,我们可以非常轻松的保证:不重复执行Control Flow,只在最后出错点

SSIS Execute SQL Task 用法

Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行select查询语句,返回结果集,结果集可以是一行,也可以是多行. 一,General 选项卡 1,返回结果集(Result Set) None:表示不返回结果,在执行Update,delete或insert命令时,使用该选项: Single row:返回单行结果,可以在Result Set 选项卡中,将

SSIS之Foreach循环容器用法

原文:SSIS之Foreach循环容器用法 要实现的业务:A数据库服务器上某库的T_GOODS_DECL的状态字段“Is_Delete”标记为“1”的时候删除B数据库服务器上对应库的T_GOODS_DECL表中的记录,二者的主键为“DECL_NO”. 总体设计图,实现原理:上一步骤将结果集传递到循环容器中,容器逐行取数据来执行容器里面的SQL任务. 第一步:建立“获取标记为已删除的DECL_NO”执行SQL任务 选择正确的数据连接器. 填写查询SQL语句. 结果集选项一定要选择“完整结果集”.

SSIS Parameter用法

Parameters能够在Project Deployment Model下使用,不能在Package Deployment Model使用.在Package Deployment Model下,使用Package Configurations来传递属性值:在Project Deployment Model下,使用Parameters来传递值. 1,Parameters and Package Deployment Model In general, if you are deploying a

SSIS: Lookup组件高级用法,生成推断成员(inferred member)

将数据导入事实表如果无法匹配维度表的记录一般有两种处理方式. 一是将不匹配记录输出到一个表中待后续处理,然后重新导入.二是先生成维度Key,后续再完善维度key,本文指导各位使用第二种方式. 背景 比如下图StoreID为1的经销商不存在于我们经销商维度表中,我们现在要使用lookup组件进行匹配,并生成维度key. 操作步骤 1. 先添加一个派生列组件,将StoreID转为字符,等会儿生成键值会用到. 2. 先进行匹配一次,然后把无法匹配到的记录传到下一个Lookup 组件  Insert