Как изменить или обновить подключение к локальному серверу в задании плана обслуживания

15

Два дня назад наш клиент изменил имя нашего сервера Dev

После переименования сервера все мои задания по обслуживанию и другие задания не выполняются из-за несоответствия имени сервера.

Мы используем версию SQL Server 2012 и ОС Server 2008

Итак, сегодня утром я переименовал имя моего сервера Sql 2012 в обновленное имя и сделал таблицу, обновления процедур

Я пытался обновить подключение к локальному серверу в процессе обслуживания, но оно не редактировалось. Затем я добавил новое подключение к серверу, все еще бесполезно, я получаю ошибку ниже, выполняя задания.

После того, как я попробовал использовать целевую страницу в параметре свойства jobs, там также выбран только целевой сервер, и несколько целевых серверов отключены.

Ошибка ниже

Выполнено от имени пользователя: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility Версия 11.0.2100.60 для 64-разрядных продуктов. Copyright (C) Microsoft Corporation. Все права защищены.
Начато: 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
Окончание: 12:02:15
Прошедшее: 46,641 секунд.
Не удалось выполнить пакет.
Шаг не удался.

Помогите мне в этом, ребята, заранее спасибо

Сайрам
источник
У меня та же проблема. Восстановленный план обслуживания.
Сарати Редди

Ответы:

14

В планах обслуживания используются пакеты служб SSIS, которые хранятся в MSDB. Эти пакеты используют строки подключения, которые не изменяются после переименования сервера.

Используйте сценарий (воспроизведенный ниже), опубликованный NancySon в комментариях « Как: переименовать компьютер, на котором размещен автономный экземпляр SQL Server», чтобы получить некоторое представление о том, как изменить эти строки подключения. Или воссоздать планы обслуживания.

Планы обслуживания не меняют свои соединения на новое имя сервера, поэтому они могут разорваться. После переименования вы можете обнаружить, что не можете удалить или переименовать существующие планы обслуживания, поэтому либо удалите их перед переименованием сервера, а затем заново создайте их или запустите следующий сценарий, чтобы исправить их:

   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'
AhsenB
источник
1

Когда вы переименовываете SQL Server (то есть меняете имя Windows NetBIOS), вам также необходимо выполнить этот небольшой шаг вручную в SQL Server, чтобы переименовать его внутри. Подробности в этой статье MSKB .

Томас Пуллен
источник
1

Я знаю, что это старая тема / вопрос, но сегодня у него была похожая проблема, и я решил ее, применив приведенные выше сценарии, так что спасибо DarkS0ul. И в процессе я нашел другой способ решения этой проблемы: отредактируйте шаг в задании, в разделе Источники данных, проверьте подключение к локальному серверу и отредактируйте часть Data Source = Servername. И вуаля!

JohnnyP
источник