Come modificare o aggiornare la connessione al server locale nel processo del piano di manutenzione


15

Due giorni fa il nostro client ha cambiato uno dei nostri nomi Dev Server

Dopo la ridenominazione del server, tutti i miei lavori di manutenzione e altri lavori non riescono a causa della mancata corrispondenza del nome del server.

Stiamo usando SQL Server versione 2012 e sistema operativo 2008 server

Così oggi mattina ho rinominato il nome del mio server SQL 2012 in nome aggiornato e fatto tabella, aggiornamenti delle procedure

Ho provato ad aggiornare la connessione al server locale nel lavoro di manutenzione ma non è modificabile. Poi ho aggiunto una nuova connessione al server, ancora inutile sto ottenendo un errore inferiore, durante l'esecuzione dei lavori.

Dopo aver provato con la pagina di destinazione nell'opzione di proprietà dei lavori, viene selezionato anche solo il server di destinazione e il server di destinazione multiplo è disabilitato.

Errore sotto

Eseguito come utente: Servizio NT \ SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility Versione 11.0.2100.60 per Copyright a 64 bit (C) Microsoft Corporation. Tutti i diritti riservati.
Avvio: 12:01:28 Errore AM: 2013-12-16 00: 01: 43.98 Codice: 0xC00291EC Origine: {410F7661-F71A-4B68-9584-BA422AB00F02} Esegui
descrizione attività SQL : Impossibile acquisire la connessione "Connessione al server locale" . La connessione potrebbe non essere configurata correttamente o potresti non avere le autorizzazioni giuste per questa connessione. Errore di fine errore
: 2013-12-16 00: 02: 00.00
Codice: 0xC0024104
Fonte: Territory_Update
Descrizione: il metodo Execute sull'attività ha restituito il codice di errore 0x80131904 (si è verificato un errore relativo alla rete o specifico dell'istanza durante la creazione di una connessione a SQL Server. Il server non è stato trovato o non era accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server è configurato per consentire connessioni remote (provider: Named Pipes Provider, errore: 40 - Impossibile aprire una connessione a SQL Server)). Il metodo Execute deve avere esito positivo e indicare il risultato utilizzando un parametro "out". Errore di fine errore
: 2013-12-16 00: 02: 15.00
Codice: 0xC0024104
Fonte: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Descrizione: il metodo Execute sull'attività ha restituito il codice di errore 0x80131904 (si è verificato un errore relativo alla rete o specifico dell'istanza durante la creazione di una connessione a SQL Server. Il server non è stato trovato o non era accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server è configurato per consentire connessioni remote (provider: Named Pipes Provider, errore: 40 - Impossibile aprire una connessione a SQL Server)). Il metodo Execute deve avere esito positivo e indicare il risultato utilizzando un parametro "out".
Errore di fine DTExec: l'esecuzione del pacchetto ha restituito DTSER_FAILURE (1).
Iniziato: 12:01:28 AM
Finito: 12:02:15 AM
Scaduto: 46.641 secondi.
L'esecuzione del pacchetto non è riuscita.
Il passo è fallito.

Aiutami in questi ragazzi, grazie in anticipo


Ho avuto lo stesso problema. Piano di manutenzione ricreato.
Sarathi Reddy,

Risposte:


14

I piani di manutenzione utilizzano pacchetti SSIS archiviati in MSDB. Questi pacchetti utilizzano stringhe di connessione, che non vengono modificate dopo la ridenominazione di un server.

Utilizzare lo script (riprodotto di seguito) pubblicato da NancySon nei commenti di Come: rinominare un computer che ospita un'istanza autonoma di SQL Server per trarre ispirazione su come modificare queste stringhe di connessione. O ricreare i piani di manutenzione.

I piani di manutenzione non ricevono le connessioni modificate con il nuovo nome del server e quindi potrebbero interrompersi. Dopo una ridenominazione potresti scoprire che non puoi eliminare o rinominare i piani di manutenzione esistenti, quindi eliminali prima di rinominare il server e ricrearli successivamente o esegui il seguente script per risolverli:

   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

Ho usato questo codice da questa risposta alla domanda di errore del server ribattezzata SQL Server, tuttavia i piani di manutenzione hanno ancora un vecchio nome :

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)

E per rinominare:

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

Quando si rinomina un SQL Server (ovvero si modifica il nome NetBIOS di Windows), è necessario eseguire anche questo piccolo passaggio manuale all'interno di SQL Server per rinominarlo internamente. Dettagli in questo articolo di MSKB .


1

So che questa è una vecchia discussione / domanda ma oggi ho avuto un problema simile e l'ho risolto applicando gli script sopra, quindi grazie DarkS0ul. E nel processo ho trovato un altro modo di risolvere questo problema: modificare il passaggio nel lavoro, in Origini dati, selezionare Connessione al server locale e modificare la parte Origine dati = Nome server. E voilà!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.