在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,这个属性用以确定CheckPoint文件记录Task的ID的行为,确定重新执行的Task。如果这个属性都设置为False,不会触发CheckPoint机制。
FailPackageOnFail是当Executable失败时,指定整个Package是否失败。
FailPackageOnFail=True,当组件失败时,CheckPoint不会记录到CheckPoint文件中,如果该Control Flow组件出现异常了,中断运行,下次在该Control Flow上继续执行。
FailPackageOnFail=false,当组件失败时,CheckPoint会将该Task的ID记录到CheckPoint文件中,如果一个Task的ID被记录到CheckPoint文件中,那么SSIS不会认为该Task执行失败,重新运行整个package不会执行这个Package。
FailParentOnFailure是当Executable失败时,指定Executable的Parent Task是否失败。
将属性FailParentOnFailure=ture,当Task失败,将失败状态向上传递到其父组件,将属性FailParentOnFailure=false,当Task失败,不会将失败状态向上传递到其父组件。传递给父组件的失败状态是一个指标,行为受到父组件的FailPackageOnFail属性的影响,父组件能够继续传递失败状态。
三,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:StudyProjectsTestISCK_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属性,其保持默认值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,修改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,查看执行情况
发现没有CheckPoint文件生成,原因是Task PostSequence组件和其parent 组件Sequence Container都没有设置属性 FailPackageOnFail=true,将Sequence Container的属性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: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设置造成的,子组件的失败向上传递给其父组件Sequence Container。虽然Task Post Sequence失败,属性FailPackageOnFail=false的设置,使得Task失败不会导致Package失败,但是这种失败的信息向上传递到父组件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设置造成的。虽然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,查看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,当package执行失败时,没有生成CheckPoint文件,原因是Sequence Container的父组件是Package ,Package的属性FailPackageOnFail=false是固定的,不能修改。
Package是所有control flow组件root 组件。