Jak zmienić lub zaktualizować połączenie z lokalnym serwerem w zadaniu Planu konserwacji

15

Dwa dni temu nasz klient zmienił jedną z naszych nazw Dev Server

Po zmianie nazwy serwera wszystkie moje zadania konserwacji i inne zadania kończą się niepowodzeniem, ponieważ niedopasowana nazwa serwera.

Korzystamy z wersji SQL Server Server 2012 i Server 2008 OS

Więc dziś rano zmieniłem nazwę mojej nazwy serwera Sql 2012 na zaktualizowaną podaną nazwę i dokonałem aktualizacji tabel, procedur

Próbowałem zaktualizować połączenie z lokalnym serwerem w zadaniu konserwacji, ale jest to nieedytowalne. Następnie dodałem nowe połączenie z serwerem, nadal nie ma sensu dostaję błąd poniżej poziomu podczas wykonywania zadań.

Po próbowaniu z opcją właściwości strony docelowej w zadaniach wybrano również tylko serwer docelowy i wyłączono wiele serwerów docelowych.

Błąd poniżej

Wykonany jako użytkownik: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility wersja 11.0.2100.60 dla 64-bitowej wersji Microsoft Corporation (C) Wszelkie prawa zastrzeżone.
Rozpoczęto: 00:01:28 Błąd: 16.12.2013 00: 01: 43.98 Kod: 0xC00291EC Źródło: {410F7661-F71A-4B68-9584-BA422AB00F02} Wykonaj SQL
Opis zadania : Nie można uzyskać połączenia „Połączenie z serwerem lokalnym” . Połączenie może nie zostać poprawnie skonfigurowane lub możesz nie mieć odpowiednich uprawnień do tego połączenia. Błąd końca błędu
: 16.12.2013 00: 02: 00.00
Kod: 0xC0024104
Źródło: Territory_Update
Opis: Metoda wykonania zadania zwróciła kod błędu 0x80131904 (Wystąpił błąd związany z siecią lub specyficzny dla instancji podczas nawiązywania połączenia z programem SQL Server. Serwer nie został znaleziony lub był niedostępny. Sprawdź, czy nazwa instancji jest poprawna i czy Program SQL Server jest skonfigurowany tak, aby zezwalać na połączenia zdalne (dostawca: dostawca nazwanych potoków, błąd: 40 - Nie można otworzyć połączenia z programem SQL Server). Metoda Execute musi się powieść i wskazać wynik za pomocą parametru „out”. Błąd końca błędu
: 16.12.2013 00: 02: 15.00
Kod: 0xC0024104
Źródło: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Opis: Metoda wykonania zadania zwróciła kod błędu 0x80131904 (Wystąpił błąd związany z siecią lub specyficzny dla instancji podczas nawiązywania połączenia z programem SQL Server. Serwer nie został znaleziony lub był niedostępny. Sprawdź, czy nazwa instancji jest poprawna i czy Program SQL Server jest skonfigurowany tak, aby zezwalać na połączenia zdalne (dostawca: dostawca nazwanych potoków, błąd: 40 - Nie można otworzyć połączenia z programem SQL Server). Metoda Execute musi się powieść i wskazać wynik za pomocą parametru „out”.
Błąd zakończenia DTExec: Wykonanie pakietu zwróciło DTSER_FAILURE (1).
Rozpoczęty: 12:01:28
Zakończony: 12:02:15
Upłynął: 46,641 sekund.
Wykonanie pakietu nie powiodło się.
Krok nie powiódł się.

Pomóżcie mi w tym chłopaku, Z góry dziękuję

sairam
źródło
Mam ten sam problem. Odtworzony plan konserwacji.
Sarathi Reddy

Odpowiedzi:

14

Plany konserwacji wykorzystują pakiety SSIS przechowywane w MSDB. Te pakiety używają parametrów połączenia, które nie są zmieniane po zmianie nazwy serwera.

Skorzystaj ze skryptu (zamieszczonego poniżej) opublikowanego przez NancySon w komentarzach: Jak zmienić nazwę komputera obsługującego samodzielne wystąpienie programu SQL Server, aby uzyskać inspirację na temat zmiany tych parametrów połączenia. Lub odtwórz plany konserwacji.

Plany konserwacji nie zmieniają połączeń na nową nazwę serwera, więc mogą się zepsuć. Po zmianie nazwy może się okazać, że nie można usunąć ani zmienić nazwy istniejących planów konserwacji, więc albo usuń je przed zmianą nazwy serwera, a następnie utwórz je ponownie lub uruchom następujący skrypt, aby je naprawić:

   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
Edward Dortland
źródło
3

Użyłem tego kodu z tej odpowiedzi na pytanie o awarię serwera. Zmieniono nazwę programu SQL Server, jednak plany konserwacji nadal mają starą nazwę :

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)

I zmienić nazwę:

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
źródło
1

Kiedy zmieniasz nazwę programu SQL Server (tj. Zmieniasz nazwę NetBIOS systemu Windows), musisz również wykonać ten mały ręczny krok w programie SQL Server, aby zmienić nazwę wewnętrznie. Szczegóły w tym artykule MSKB .

Thomas Pullen
źródło
1

Wiem, że to stary wątek / pytanie, ale miałem dzisiaj podobny problem i rozwiązałem go, stosując powyższe skrypty, więc dziękuję DarkS0ul. I w tym procesie znalazłem inny sposób rozwiązania tego: edytuj krok w zadaniu, w obszarze Źródła danych, zaznacz Połączenie z lokalnym serwerem i edytuj część Źródło danych = nazwa serwera. I voila!

JohnnyP
źródło