SQL Server 2008 maintenance plan package (维护计划包) 迁移步骤

通过management studio 连接到本地的integration service, 将maintenance package 导出成文件.

SQL Server 2008 maintenance plan package (维护计划包) 迁移步骤_第1张图片


用文本编辑器打开导出的包文件, 修改其中的'Server'的值为新的服务器地址, 然后保存.


SQL Server 2008 maintenance plan package (维护计划包) 迁移步骤_第2张图片

将修改后的package导入到新的服务器上, 也是用management studio连接到目的服务器的integration service导入.




这样就完成了pakcage的导入.

由于package的调度一般使用SQL Agent的job, 所以,需要同时把package对应的job迁移过来.

对于job的迁移有两种办法, 一种是在目的服务器上修改package的界面中, 直接创建和源服务器上job一致的schedule,保存package后会生成一个调用package的job.

另一种就是把源服务器上的job导出, 导入到目的服务器中,并修改系统表,使之和目的服务器上的package相关联.

第一种可以用management studio的界面直接操作, 就不作介绍. 

第二种方法麻烦一些, 这里只介绍一下手动的办法, 如果读者有精力,可以写成批量的脚本.

首先将源服务器上package对应的job, script out 出来, 然后在目的服务器上创建这个job.

如果这时执行job, 虽然job和package都迁移了过来, 但是执行会报以下的错误:


'The INSERT statement conflicted with the FOREIGN KEY constraint "FK_sysmaintplan_log_subplan_id". The conflict occurred in database "msdb", table "dbo.sysmaintplan_subplans", column 'subplan_id''

经过一番研究, 解决办法如下:

用文本编辑器打开package, 找到以下一段:


SQL Server 2008 maintenance plan package (维护计划包) 迁移步骤_第3张图片

将其中ObjectName, DTSID和 Description的值拷贝出来. 他们就是以下语句中 @subplan_name,@subplan_id,@subplan_description三个变量的值

再找到以下一段

SQL Server 2008 maintenance plan package (维护计划包) 迁移步骤_第4张图片

将其中的DTSID也拷贝出来, 即是以下语句中@plan_id的值

执行以下的语句.


  DECLARE @Job_id UNIQUEIDENTIFIER
  , @subplan_id UNIQUEIDENTIFIER
  , @plan_id UNIQUEIDENTIFIER
  , @job_name VARCHAR(1000)
  , @subplan_name VARCHAR(1000)
  , @subplan_description VARCHAR(1000)
  , @schedule_id INT 
  
  set @job_name = 'your job name'
  set @subplan_id = '722AFED8-C5A6-4D19-88E9-E9936D456931'
  set @plan_id = '42E1FC8D-7183-49FB-933E-8B6A9C72507F'
  set @subplan_name = 'Subplan_1'
  set @subplan_description = 'Subplan_1'

  SELECT  @job_id = job_id
  FROM    msdb.dbo.sysjobs
  WHERE   name = @Job_name 
  SELECT  @schedule_id = schedule_id
  FROM    dbo.sysjobschedules
  WHERE   job_id = @job_id 
  INSERT  INTO dbo.sysmaintplan_subplans
          SELECT  @subplan_id
                , @subplan_name
                , @subplan_description
                , @plan_id
                , @job_id
                , NULL
                , @schedule_id
                , 0

执行成功后, 再执行job, 就不会报上述的错误了.

其实package,就是一个xml文件,  如果读者对xml的处理比较熟悉, 可以将获得@subplan_id等的过程, 用sql语句写出来, 这样迁移就更方便了.




你可能感兴趣的:(sql,server,服务器,service,insert,文本编辑,conflict)