Cómo cambiar o actualizar la conexión del servidor local en el trabajo del plan de mantenimiento

15

Hace dos días, nuestro cliente cambió uno de los nombres de nuestro servidor de desarrollo

Después de cambiar el nombre del servidor, todos mis trabajos de mantenimiento y otros trabajos fallan porque el nombre del servidor no coincide.

Estamos utilizando la versión 2012 del servidor SQL y el sistema operativo del servidor 2008

Así que hoy por la mañana renombré mi nombre de servidor SQL 2012 a nombre de pila actualizado e hice tabla, actualizaciones de procedimientos

Traté de actualizar la conexión del servidor local en el trabajo de mantenimiento, pero no se puede editar. Luego agregué una nueva conexión de servidor, todavía no uso, obtengo un error inferior al ejecutar trabajos.

Después de probar con la página de destino en la opción de propiedad de trabajos, también solo se selecciona el servidor de destino y se deshabilitan varios servidores de destino.

Error abajo

Ejecutado como usuario: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility Versión 11.0.2100.60 para Copyright de 64 bits (C) Microsoft Corporation. Todos los derechos reservados.
Iniciado: 12:01:28 AM Error: 2013-12-16 00: 01: 43.98 Código: 0xC00291EC Fuente: {410F7661-F71A-4B68-9584-BA422AB00F02} Ejecutar SQL
Descripción de la tarea : Error al adquirir la conexión "Conexión al servidor local" . Es posible que la conexión no esté configurada correctamente o que no tenga los permisos correctos en esta conexión. Error de
finalización Error: 2013-12-16 00: 02: 00.00
Código: 0xC0024104
Fuente: Territory_Update
Descripción: El método Ejecutar en la tarea devolvió el código de error 0x80131904 (Se produjo un error relacionado con la red o específico de la instancia al establecer una conexión con SQL Server. El servidor no se encontró o no fue accesible. Verifique que el nombre de la instancia sea correcto y que SQL Server está configurado para permitir conexiones remotas. (Proveedor: proveedor de canalizaciones con nombre, error: 40 - No se pudo abrir una conexión a SQL Server)). El método Execute debe tener éxito e indicar el resultado utilizando un parámetro "out". Error de
finalización Error: 2013-12-16 00: 02: 15.00
Código: 0xC0024104
Fuente: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Descripción: El método Ejecutar en la tarea devolvió el código de error 0x80131904 (Se produjo un error relacionado con la red o específico de la instancia al establecer una conexión con SQL Server. El servidor no se encontró o no fue accesible. Verifique que el nombre de la instancia sea correcto y que SQL Server está configurado para permitir conexiones remotas. (Proveedor: proveedor de canalizaciones con nombre, error: 40 - No se pudo abrir una conexión a SQL Server)). El método Execute debe tener éxito e indicar el resultado utilizando un parámetro "out".
Error final DTExec: la ejecución del paquete devolvió DTSER_FAILURE (1).
Iniciado: 12:01:28 AM
Finalizado: 12:02:15 AM
Transcurrido: 46.641 segundos.
La ejecución del paquete falló.
El paso falló.

Ayúdenme en esto chicos, gracias de antemano

sairam
fuente
Tengo el mismo problema. Plan de mantenimiento recreado.
Sarathi Reddy

Respuestas:

14

Los planes de mantenimiento utilizan paquetes SSIS que están almacenados en MSDB. Estos paquetes usan cadenas de conexión, que no cambian después de cambiar el nombre del servidor.

Utilice el script (reproducido a continuación) publicado por NancySon en los comentarios de Cómo: Cambiar el nombre de una computadora que aloja una instancia independiente de SQL Server para obtener inspiración sobre cómo cambiar estas cadenas de conexión. O recrear los planes de mantenimiento.

Los planes de mantenimiento no cambian sus conexiones al nuevo nombre del servidor, por lo que pueden interrumpirse. Después de un cambio de nombre, es posible que no pueda eliminar o cambiar el nombre de los planes de mantenimiento existentes, por lo tanto, elimínelos antes de cambiar el nombre del servidor y vuelva a crearlos más tarde o ejecute el siguiente script para solucionarlos:

   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
fuente
3

Utilicé este código de esta respuesta a la pregunta de error del servidor. Renombré un servidor SQL, sin embargo, los planes de mantenimiento todavía tienen un nombre antiguo :

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)

Y renombrar:

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
fuente
1

Cuando cambia el nombre de un servidor SQL (es decir, cambia el nombre NetBIOS de Windows), también debe llevar a cabo este pequeño paso manual dentro de SQL Server para cambiarle el nombre internamente. Detalles en este artículo de MSKB .

Thomas Pullen
fuente
1

Sé que este es un viejo hilo / pregunta, pero tuve un problema similar hoy y lo resolví aplicando los scripts anteriores, así que gracias DarkS0ul. Y en el proceso encontré otra forma de resolver esto: edite el paso en el trabajo, en Orígenes de datos, verifique la conexión del servidor local y edite la parte Origen de datos = Nombre del servidor. ¡Y voilá!

JohnnyP
fuente