Como alterar ou atualizar a conexão do servidor local no trabalho do plano de manutenção

15

Dois dias atrás, nosso cliente alterou um de nosso nome de Servidor de Desenvolvimento

Após a renomeação do servidor, todos os meus trabalhos de manutenção e outros trabalhos estão falhando porque o nome do servidor é incompatível.

Estamos usando o sql server 2012 version e server 2008 OS

Então, hoje de manhã, renomeei o nome do meu servidor SQL 2012 para o nome atualizado e fiz a tabela, atualizações de procedimentos

Tentei atualizar a conexão do servidor local no trabalho de manutenção, mas não é editável. Em seguida, adicionei uma nova conexão ao servidor, ainda não adianto, estou ficando abaixo do erro durante a execução de trabalhos.

Depois de tentar com a opção de propriedade página de destino nos trabalhos, também há apenas o servidor de destino selecionado e o servidor de destino múltiplo desativado.

Erro abaixo

Executado como usuário: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Execute Package Utility versão 11.0.2100.60 para Copyright (C) Microsoft Corporation de 64 bits. Todos os direitos reservados.
Iniciado: 12:01:28 AM Erro: 2013-12-16 00: 01: 43.98 Código: 0xC00291EC Origem: {410F7661-F71A-4B68-9584-BA422AB00F02} Executar
Descrição da Tarefa SQL : Falha ao adquirir a conexão "Conexão do servidor local" . A conexão pode não estar configurada corretamente ou você pode não ter as permissões corretas nessa conexão. Erro de
erro final : 2013-12-16 00: 02: 00.00
Código: 0xC0024104
Origem: Territory_Update
Descrição: o método Execute na tarefa retornou o código de erro 0x80131904 (ocorreu um erro relacionado à rede ou específico da instância ao estabelecer uma conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se O SQL Server está configurado para permitir conexões remotas (provedor: Provedor de Canais Nomeados, erro: 40 - Não foi possível abrir uma conexão com o SQL Server). O método Execute deve ter êxito e indicar o resultado usando um parâmetro "out". Erro de
erro final : 2013-12-16 00: 02: 15.00
Código: 0xC0024104
Origem: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Descrição: o método Execute na tarefa retornou o código de erro 0x80131904 (ocorreu um erro relacionado à rede ou específico da instância ao estabelecer uma conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se O SQL Server está configurado para permitir conexões remotas (provedor: Provedor de Canais Nomeados, erro: 40 - Não foi possível abrir uma conexão com o SQL Server). O método Execute deve ter êxito e indicar o resultado usando um parâmetro "out".
Erro final DTExec: a execução do pacote retornou DTSER_FAILURE (1).
Iniciado: 12:01:28
Finalizado: 12:02:15
decorrido: 46,641 segundos.
A execução do pacote falhou.
A etapa falhou.

Me ajudem nessa galera, Agradecemos antecipadamente

sairam
fonte
Eu tenho o mesmo problema. Plano de manutenção recriado.
Sarathi Reddy

Respostas:

14

Os planos de manutenção usam pacotes SSIS armazenados no MSDB. Esses pacotes usam cadeias de conexão, que não são alteradas após a renomeação do servidor.

Use o script (reproduzido abaixo) postado por NancySon nos comentários de Como: Renomear um computador que hospeda uma instância autônoma do SQL Server para obter alguma inspiração sobre como alterar essas seqüências de conexão. Ou recrie os planos de manutenção.

Os planos de manutenção não alteram suas conexões para o novo nome do servidor e, portanto, podem ser interrompidos. Após uma renomeação, você pode descobrir que não pode excluir ou renomear os planos de manutenção existentes; portanto, exclua-os antes de renomear o servidor e recriá-los posteriormente ou execute o seguinte script para corrigi-los:

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

Eu usei esse código desta resposta para a pergunta de falha do servidor renomeada como SQL Server, no entanto, os planos de manutenção ainda têm nome antigo :

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 para renomear:

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

Ao renomear um SQL Server (ou seja, alterar o nome do Windows NetBIOS), você também precisa executar esta pequena etapa manual dentro do SQL Server para renomeá-lo internamente. Detalhes neste artigo do MSKB .

Thomas Pullen
fonte
1

Sei que esse é um tópico / pergunta antigo, mas que hoje tive um problema semelhante e o resolvi aplicando os scripts acima, então obrigado DarkS0ul. E, no processo, encontrei outra maneira de resolver isso: edite a etapa do trabalho, em Fontes de dados, marque Conexão do servidor local e edite a parte Fonte de dados = Nome do servidor. E pronto!

JohnnyP
fonte