Як змінити або оновити підключення до локального сервера в роботі плану технічного обслуговування


15

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

Після того, як сервер перейменований, усі мої завдання з обслуговування та інші завдання закінчуються невдачею, оскільки ім'я сервера не відповідає.

Ми використовуємо версію sql сервера 2012 та ОС 2008 сервера

Тому сьогодні вранці я перейменував своє ім’я сервера Sql 2012 на оновлене ім'я та зробив таблицю, оновлення процедур

Я намагався оновити підключення локального сервера в роботі з технічного обслуговування, але це неможливо. Тоді я додав нове підключення до сервера, все ще не використовуючи, я отримую нижче помилки під час виконання завдань.

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

Помилка нижче

Виконується як користувач: NT Service \ SQLSERVERAGENT. Microsoft (R) сервер SQL Server Execute Package Utility Версія 11.0.2100.60 для 64-розрядних авторських прав (C) Microsoft Corporation. Всі права захищені.
Почато: 00:01:28 Помилка: 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 налаштований на віддалене підключення (постачальник: Named Pipes Provider, помилка: 40 - Не вдалося відкрити з'єднання з SQL Server)). Метод Execute повинен досягти успіху та вказати результат за допомогою параметра "out". Помилка завершення помилки
: 2013-12-16 00: 02: 15.00
Код: 0xC0024104
Джерело: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Опис: Метод Execute у завданні повернув код помилки 0x80131904 (Помилка, пов’язана з мережею або конкретним екземпляром, сталася під час встановлення з'єднання з SQL Server. Сервер не знайдено або недоступний. Перевірте, чи ім'я екземпляра правильне і що SQL Server налаштований на віддалене підключення (постачальник: Named Pipes Provider, помилка: 40 - Не вдалося відкрити з'єднання з SQL Server)). Метод Execute повинен досягти успіху та вказати результат за допомогою параметра "out".
Кінцева помилка DTExec: Виконання пакета повернуло DTSER_FAILURE (1).
Почато: 00:01:28
Закінчено: 00: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'

1

Під час перейменування SQL-сервера (тобто змінити ім’я Windows NetBIOS) вам також потрібно виконати цей невеликий вручну крок у SQL Server, щоб внутрішньо перейменувати його. Деталі в цій статті MSKB .


1

Я знаю, що це стара тема / питання, але сьогодні була схожа проблема, і я вирішив її, застосувавши вищезазначені сценарії, тож дякую DarkS0ul. І в процесі я знайшов інший спосіб вирішення цього питання: відредагуйте крок у завданні, в розділі Джерела даних, перевірте підключення локального сервера та відредагуйте Джерело даних = Ім'я сервера. І вуаля!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.