|
通过management studio 连接到本地的integration service, 将maintenance package 导出成文件.
用文本编辑器打开导出的包文件, 修改其中的'Server'的值为新的服务器地址, 然后保存.
将修改后的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, 找到以下一段:
将其中ObjectName, DTSID和 Description的值拷贝出来. 他们就是以下语句中@subplan_name,@subplan_id,@subplan_description三个变量的值
再找到以下一段
将其中的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_idFROM msdb.dbo.sysjobsWHERE name = @Job_name SELECT @schedule_id = schedule_idFROM dbo.sysjobschedulesWHERE job_id = @job_id INSERT INTO dbo.sysmaintplan_subplansSELECT @subplan_id, @subplan_name, @subplan_description, @plan_id, @job_id, NULL, @schedule_id, 0
执行成功后, 再执行job, 就不会报上述的错误了.
其实package,就是一个xml文件, 如果读者对xml的处理比较熟悉, 可以将获得@subplan_id等的过程, 用sql语句写出来, 这样迁移就更方便了.
|
|