如何在维护计划作业中更改或更新本地服务器连接


15

两天前,我们的客户更改了我们的Dev Server名称之一

重命名服务器后,由于服务器名称不匹配,所有我的维护作业和其他作业都失败了。

我们正在使用sql server 2012版本和 Server 2008 OS

所以今天早上我将我的Sql Server 2012名称重命名为更新的给定名称,并进行了表,程序更新

我试图在维护作业中更新本地服务器连接,但是无法编辑。然后我添加了新的服务器连接,但仍无用,执行作业时出现错误。

我尝试了作业属性选项中的目标页面后,也仅选择了目标服务器,并且禁用了多个目标服务器。

错误如下

以用户身份执行:NT Service \ SQLSERVERAGENT。用于64位版权(C)Microsoft Corporation的Microsoft(R)SQL Server执行软件包实用程序版本11.0.2100.60。版权所有。
开始时间:12:01:28 AM错误:2013-12-16 00:01:43.98代码:0xC00291EC源:{410F7661-F71A-4B68-9584-BA422AB00F02}执行SQL任务
说明:无法获取连接“本地服务器连接” 。连接可能配置不正确,或者您对此连接没有正确的权限。结束错误
错误:2013-12-16 00:02:00.00
代码:0xC0024104
源:Territory_Update
说明:任务上的Execute方法返回错误代码0x80131904(建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称是否正确以及该实例名称是否正确。 SQL Server配置为允许远程连接(提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)。Execute方法必须成功,并使用“ out”参数指示结果。结束错误
错误:2013-12-16 00:02:15.00
代码:0xC0024104
源:{4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
说明:任务上的Execute方法返回错误代码0x80131904(建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称是否正确以及该实例名称是否正确。 SQL Server配置为允许远程连接(提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)。Execute方法必须成功,并使用“ out”参数指示结果。
结束错误DTExec:程序包执行返回DTSER_FAILURE(1)。
开始:12:01:28 AM
完成:12
:02:15 AM 经过:46.641秒。
程序包执行失败。
该步骤失败。

帮我这个家伙,在此先感谢


我有同样的问题。重新创建维护计划。
Sarathi Reddy

Answers:


14

维护计划使用存储在MSDB中的SSIS包。这些程序包使用连接字符串,服务器重命名后不会更改。

使用NancySon如何:重命名承载SQL Server独立实例的计算机的注释中使用NancySon发布的脚本(如下所示),以获取有关如何更改这些连接字符串的一些启发。或重新创建维护计划。

维护计划不会将其连接更改为新的服务器名称,因此可能会中断。重命名后,您可能会发现您无法删除或重命名现有的维护计划,因此请在重命名服务器之前将其删除,然后再创建它们,或者运行以下脚本对其进行修复:

   use msdb

   DECLARE @oldservername as varchar(max)
    SET @oldservername='<server name>\<instance name>'

   -- set the new server name to the current server name

   declare @newservername as varchar(max)
    set @newservername=@@servername

   declare @xml as varchar(max)
    declare @packagedata as varbinary(max)
    -- get all the plans that have the old server name in their connection string
    DECLARE PlansToFix Cursor
    FOR
    SELECT    id
    FROM         sysssispackages
    WHERE     (CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) LIKE '%server=''' + @oldservername + '%')

   OPEN PlansToFix


   declare @planid uniqueidentifier
    fetch next from PlansToFix into @planid

   while (@@fetch_status<>-1)  -- for each plan

   begin
    if (@@fetch_status<>-2)
    begin
    select @xml=cast(cast(packagedata as varbinary(max)) as varchar(max)) from sysssispackages where id= @planid  -- get the plan's xml converted to an xml string

   declare @planname varchar(max)
    select @planname=[name] from  sysssispackages where id= @planid  -- get the plan name
    print 'Changing ' + @planname + ' server from ' + @oldservername + ' to ' + @newservername  -- print out what change is happening

   set @xml=replace(@xml,'server=''' + @oldservername + '''','server=''' + @newservername +'''')  -- replace the old server name with the new server name in the connection string
    select @packagedata=cast(@xml as varbinary(max))  -- convert the xml back to binary
    UPDATE    sysssispackages SET packagedata = @packagedata WHERE (id= @planid)  -- update the plan

   end
    fetch next from PlansToFix into @planid  -- get the next plan

   end

   close PlansToFix
    deallocate PlansToFix
  ----- This will also handle the packages that have a tag such as 
    ----- <DTS:Property DTS:Name="ConnectionString">Data Source=servername;Integrated Security=SSPI;Connect Timeout=30;</DTS:Property>



   DECLARE @oldservername as varchar(max)
    SET @oldservername='<server name>\<instance name>'-- set the new server name to the current server name
    declare @newservername as varchar(max)
    set @newservername = @@servername
    declare @xml as varchar(max)
    declare @packagedata as varbinary(max)-- get all the plans that have the old server name in their connection string
    DECLARE PlansToFix Cursor FOR 
    SELECT id
    FROM sysssispackages
    WHERE (CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) LIKE '%Data Source=' + @oldservername + '%')

   OPEN PlansToFix
    declare @planid uniqueidentifier
    fetch next from PlansToFix into @planid 
    while (@@fetch_status<>-1) -- for each plan 
    begin
    if (@@fetch_status<>-2)
    begin
    select @xml=cast(cast(packagedata as varbinary(max)) as varchar(max)) 
    from sysssispackages where id= @planid -- get the plan's xml converted to an xml string
    declare @planname varchar(max)select @planname=[name] from sysssispackages where id= @planid -- get the plan name
    print 'Changing ' + @planname + ' server from ' + @oldservername + ' to ' + @newservername -- print out what change is happening
    set @xml=replace(@xml,'Data Source=' + @oldservername,'Data Source=' + @newservername) -- replace the old server name with the new server name in the connection string
    select @packagedata=cast(@xml as varbinary(max)) -- convert the xml back to binary
    UPDATE sysssispackages SET packagedata = @packagedata WHERE (id= @planid) -- update the plan
    end
    fetch next from PlansToFix into @planid -- get the next plan
    end
    close PlansToFix
    deallocate PlansToFix

3

我从此答案中使用了此代码,以解决服务器故障问题,将其重命名为SQL Server,但是维护计划仍然使用旧名称

SELECT  x.*,
        LocalServerConnectionString = cm.value('declare namespace DTS="www.microsoft.com/SqlServer/Dts";DTS:ObjectData[1]/DTS:ConnectionManager[1]/@DTS:ConnectionString', 'varchar(1000)')
FROM (
    SELECT  id, name, packageXML = CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML)
    FROM dbo.sysssispackages
    WHERE id IN (SELECT id FROM dbo.sysmaintplan_plans)
) x
CROSS APPLY packageXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts";/DTS:Executable/DTS:ConnectionManagers/DTS:ConnectionManager[@DTS:ObjectName="Local server connection"]') p(cm)

并重命名:

UPDATE dbo.sysssispackages SET packagedata = CAST(CAST(REPLACE(CAST(CAST(packagedata AS VARBINARY(MAX)) AS VARCHAR(MAX)), 'OldServerName', 'NewServerName') AS XML) AS VARBINARY(MAX))
WHERE id = 'package GUID'


1

我知道这是一个旧的线程/问题,但是今天有一个类似的问题,可以通过应用上面的脚本来解决,所以谢谢DarkS0ul。在此过程中,我找到了解决此问题的另一种方法:编辑作业中的步骤,在“数据源”下,选中“本地服务器连接”,然后编辑“数据源=服务器名”部分。瞧!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.