Cách thay đổi hoặc cập nhật kết nối máy chủ cục bộ trong công việc Kế hoạch bảo trì


15

Hai ngày trước, khách hàng của chúng tôi đã thay đổi một trong những tên máy chủ Dev của chúng tôi

Sau khi đổi tên máy chủ, tất cả các công việc bảo trì của tôi và các công việc khác đều thất bại vì tên máy chủ không khớp.

Chúng tôi đang sử dụng phiên bản máy chủ sql 2012 hệ điều hành máy chủ 2008

Vì vậy, sáng hôm nay tôi đã đổi tên tên máy chủ Sql 2012 của mình thành tên đã cập nhật và tạo bảng, cập nhật thủ tục

Tôi đã cố cập nhật kết nối máy chủ cục bộ trong công việc bảo trì nhưng không thể thực hiện được. Sau đó, tôi đã thêm kết nối máy chủ mới, vẫn không sử dụng được. Tôi đang gặp lỗi dưới đây, trong khi thực thi công việc.

Sau khi tôi đã thử với trang đích trong tùy chọn thuộc tính công việc, cũng chỉ có máy chủ đích được chọn và nhiều máy chủ đích bị vô hiệu hóa.

Lỗi bên dưới

Được thực thi với tư cách là người dùng: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Thực thi gói tiện ích Phiên bản 11.0.2100.60 cho Bản quyền 64 bit (C) Microsoft Corporation. Đã đăng ký Bản quyền.
Bắt đầu: 12:01:28 Lỗi: 2013/12/16 00: 01: 43,98 Code: 0xC00291EC Nguồn: {410F7661-F71A-4B68-9584-BA422AB00F02} Execute SQL công tác
Mô tả: Không thể kết nối được "kết nối máy chủ địa phương" . Kết nối có thể không được cấu hình đúng hoặc bạn có thể không có quyền phù hợp với kết nối này. Lỗi kết thúc
: 2013-12-16 00: 02: 00.00
Mã: 0xC0024104
Nguồn: Lãnh địa_Update
Mô tả: Phương thức Execute trên tác vụ trả về mã lỗi 0x80131904 (Đã xảy ra lỗi liên quan đến mạng cụ thể hoặc liên quan đến cá thể trong khi thiết lập kết nối với SQL Server. Máy chủ không tìm thấy hoặc không truy cập được. Xác minh rằng tên ví dụ là chính xác và đó là SQL Server được cấu hình để cho phép các kết nối từ xa. (Nhà cung cấp: Nhà cung cấp ống có tên, lỗi: 40 - Không thể mở kết nối với SQL Server)). Phương thức Execute phải thành công và cho biết kết quả bằng tham số "out". Lỗi kết thúc
: 2013-12-16 00: 02: 15.00
Mã: 0xC0024104
Nguồn: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Mô tả: Phương thức Execute trên tác vụ trả về mã lỗi 0x80131904 (Xảy ra lỗi liên quan đến cá thể hoặc liên quan đến cá thể trong khi thiết lập kết nối với SQL Server. Không tìm thấy máy chủ hoặc không thể truy cập được. SQL Server được cấu hình để cho phép các kết nối từ xa. (Nhà cung cấp: Nhà cung cấp ống có tên, lỗi: 40 - Không thể mở kết nối với SQL Server)). Phương thức Execute phải thành công và cho biết kết quả bằng tham số "out".
Lỗi kết thúc DTExec: Việc thực thi gói trả về DTSER_FAILURE (1).
Bắt đầu: 12:01:28 AM
Kết thúc: 12:02:15 AM Đã qua
: 46.641 giây.
Việc thực hiện gói không thành công.
Bước thất bại.

Giúp tôi với những người này, Cảm ơn trước


Tôi đã có cùng một vấn đề. Kế hoạch bảo trì tái tạo.
Sarathi Reddy

Câu trả lời:


14

Các kế hoạch bảo trì sử dụng các gói SSIS được lưu trữ trong MSDB. Các gói này sử dụng các chuỗi kết nối, không được thay đổi sau khi đổi tên máy chủ.

Sử dụng tập lệnh (được sao chép dưới đây) được đăng bởi NancySon trong các bình luận về Cách thực hiện: Đổi tên một Máy tính lưu trữ Phiên bản độc lập của SQL Server để lấy cảm hứng về cách thay đổi các chuỗi kết nối này. Hoặc tạo lại các kế hoạch bảo trì.

Các kế hoạch bảo trì không làm cho các kết nối của họ bị thay đổi thành tên máy chủ mới và do đó chúng có thể bị hỏng. Sau khi đổi tên, bạn có thể thấy rằng bạn không thể xóa hoặc đổi tên các gói bảo trì hiện có, vì vậy hãy xóa chúng trước khi đổi tên máy chủ và tạo lại chúng sau đó hoặc chạy đoạn mã sau để sửa chúng:

   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

Tôi đã sử dụng mã này từ câu trả lời này cho câu hỏi Lỗi Máy chủ Đổi tên thành Máy chủ SQL, tuy nhiên các gói bảo trì vẫn có tên cũ :

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)

Và đổi tên:

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

Khi bạn đổi tên SQL Server (nghĩa là thay đổi tên Windows NetBIOS), bạn cũng cần thực hiện bước thủ công nhỏ này trong SQL Server để đổi tên bên trong. Chi tiết trong bài viết MSKB này .


1

Tôi biết đây là một chủ đề / câu hỏi cũ nhưng đã có một vấn đề tương tự ngày hôm nay và giải quyết nó bằng cách áp dụng các kịch bản ở trên, vì vậy cảm ơn DarkS0ul. Và trong quá trình tôi tìm thấy một cách khác để giải quyết điều này: chỉnh sửa bước trong công việc, bên dưới Nguồn dữ liệu, kiểm tra kết nối máy chủ cục bộ và chỉnh sửa phần Nguồn dữ liệu = Tên máy chủ. Và Voila!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.