유지 관리 계획 작업에서 로컬 서버 연결을 변경하거나 업데이트하는 방법


15

이틀 전에 클라이언트가 개발자 서버 이름 중 하나를 변경했습니다.

서버 이름이 바뀐 후 서버 이름이 일치하지 않아 모든 유지 관리 작업 및 기타 작업이 실패합니다.

우리는 SQL Server 2012 버전과 Server 2008 OS를 사용하고 있습니다.

오늘 아침에 SQL Server 2012 이름을 지정된 이름으로 업데이트하고 테이블을 만들고 절차를 업데이트했습니다.

유지 관리 작업에서 로컬 서버 연결을 업데이트하려고했지만 편집 할 수 없습니다. 그런 다음 새 서버 연결을 추가했지만 여전히 작업을 실행하는 동안 오류가 발생합니다.

작업 속성 옵션의 대상 페이지로 시도한 후에도 대상 서버 만 선택되고 여러 대상 서버가 비활성화됩니다.

아래 오류

사용자로 실행 : NT Service \ SQLSERVERAGENT. 64 비트 저작권 (C) Microsoft Corporation 용 Microsoft SQL Server Execute Package Utility 버전 11.0.2100.60. 판권 소유.
시작 : 12:01:28 AM 오류 : 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가 원격 연결을 허용하도록 구성되었습니다 (제공자 : 명명 된 파이프 공급자, 오류 : 40-SQL Server에 대한 연결을 열 수 없음). Execute 메소드는 성공해야하며 "out"매개 변수를 사용하여 결과를 표시해야합니다. 종료 오류
오류 : 2013-12-16 00 : 02 : 15.00
코드 : 0xC0024104
소스 : {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
설명 : 작업의 Execute 메서드가 오류 코드 0x80131904를 반환했습니다 (SQL Server에 연결하는 동안 네트워크 관련 또는 인스턴스 관련 오류가 발생했습니다. 서버를 찾을 수 없거나 액세스 할 수 없습니다. 인스턴스 이름이 올바른지 확인하십시오. SQL Server가 원격 연결을 허용하도록 구성되었습니다 (제공자 : 명명 된 파이프 공급자, 오류 : 40-SQL Server에 대한 연결을 열 수 없음). Execute 메소드는 성공해야하며 "out"매개 변수를 사용하여 결과를 표시해야합니다.
End Error DTExec : 패키지 실행이 DTSER_FAILURE (1)을 반환했습니다.
시작 : 12:01:28 AM
완료 : 12:02:15 AM
경과 : 46.641 초
패키지 실행이 실패했습니다.
단계가 실패했습니다.

이 사람들을 도와주세요, 미리 감사드립니다


나는 같은 문제를 겪었다. 유지 보수 계획을 다시 작성했습니다.
Sarathi Reddy

답변:


14

유지 관리 계획은 MSDB에 저장된 SSIS 패키지를 사용합니다. 이 패키지는 서버 이름을 바꾼 후에도 변경되지 않는 연결 문자열을 사용합니다.

방법 : SQL Server의 독립 실행 형 인스턴스를 호스팅하는 컴퓨터 이름 바꾸기 에 대한 설명에서 NancySon 이 게시 한 스크립트 (아래에서 재생)를 사용하여 이러한 연결 문자열을 변경하는 방법에 대한 영감을 얻으십시오. 또는 유지 보수 계획을 다시 작성하십시오.

유지 관리 계획에서 연결이 새 서버 이름으로 변경되지 않아 연결이 끊어 질 수 있습니다. 이름을 바꾼 후에는 기존 유지 보수 계획을 삭제하거나 이름을 바꿀 수 없으므로 서버 이름을 바꾸기 전에 삭제하고 나중에 다시 작성하거나 다음 스크립트를 실행하여 수정하십시오.

   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 서버 명칭 변경, :

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 Server의 이름을 바꾸는 경우 (예 : Windows NetBIOS 이름 변경) 내부적으로 이름을 바꾸려면 SQL Server 내부에서이 작은 수동 단계를 수행해야합니다. 이 MSKB 기사의 세부 사항 .


1

나는 이것이 오래된 스레드 / 질문이라는 것을 알고 있지만 오늘 비슷한 문제가 있었고 위의 스크립트를 적용하여 해결 했으므로 DarkS0ul에게 감사드립니다. 그리고 프로세스 에서이 문제를 해결하는 또 다른 방법을 찾았습니다. 작업의 단계를 편집하고 데이터 소스에서 로컬 서버 연결을 확인하고 데이터 소스 = 서버 이름 부분을 편집하십시오. 그리고 짜잔!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.