วิธีการเปลี่ยนแปลงหรืออัปเดตการเชื่อมต่อเซิร์ฟเวอร์ท้องถิ่นในงานแผนการบำรุงรักษา


15

สองวันหลังลูกค้าของเราเปลี่ยนชื่อเซิร์ฟเวอร์ Dev ของเรา

หลังจากเปลี่ยนชื่อเซิร์ฟเวอร์แล้วงานบำรุงรักษาของฉันและงานอื่นทั้งหมดจะล้มเหลวเนื่องจากชื่อเซิร์ฟเวอร์ไม่ตรงกัน

เรากำลังใช้เวอร์ชันsql server 2012และเซิร์ฟเวอร์ 2008 OS

ดังนั้นเช้าวันนี้ฉันจึงเปลี่ยนชื่อเซิร์ฟเวอร์ SQL ของฉันเป็นชื่อที่ได้รับการอัพเดตและสร้างตาราง

ฉันพยายามอัปเดตการเชื่อมต่อเซิร์ฟเวอร์ภายในในงานบำรุงรักษา แต่ไม่สามารถแก้ไขได้ จากนั้นฉันเพิ่มการเชื่อมต่อเซิร์ฟเวอร์ใหม่ยังคงไม่มีประโยชน์ฉันได้รับข้อผิดพลาดด้านล่างขณะดำเนินงาน

หลังจากที่ฉันลองกับหน้าเป้าหมายในตัวเลือกคุณสมบัติงานมีเฉพาะเซิร์ฟเวอร์เป้าหมายเท่านั้นที่ถูกเลือกและเซิร์ฟเวอร์เป้าหมายหลายตัวถูกปิดใช้งาน

ข้อผิดพลาดด้านล่าง

ดำเนินการในฐานะผู้ใช้: NT Service \ SQLSERVERAGENT Microsoft (R) SQL Server Execute Package Utility เวอร์ชัน 11.0.2100.60 สำหรับ 64- บิตลิขสิทธิ์ (C) Microsoft Corporation สงวนลิขสิทธิ์.
เริ่มต้น: 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
คำอธิบาย: วิธีการดำเนินการในงานที่ส่งคืนรหัสข้อผิดพลาด 0x80131904 (ข้อผิดพลาดเกี่ยวกับเครือข่ายหรือข้อผิดพลาดเฉพาะกรณีเกิดขึ้นในขณะที่ทำการเชื่อมต่อกับ SQL Server ไม่พบเซิร์ฟเวอร์หรือไม่สามารถเข้าถึงได้ตรวจสอบว่าชื่ออินสแตนซ์ถูกต้อง SQL Server ถูกกำหนดค่าให้อนุญาตการเชื่อมต่อระยะไกล (ผู้ให้บริการ: ผู้ให้บริการไปป์ที่มีชื่อข้อผิดพลาด: 40 - ไม่สามารถเปิดการเชื่อมต่อกับ SQL Server) กระบวนการเรียกใช้งานจะต้องสำเร็จและระบุผลลัพธ์โดยใช้พารามิเตอร์ "out" ข้อผิดพลาดในตอนท้าย
: 2013-12-16 00: 02: 15.00
รหัส: 0xC0024104
ที่มา: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
คำอธิบาย: วิธีการดำเนินการในงานที่ส่งคืนรหัสข้อผิดพลาด 0x80131904 (ข้อผิดพลาดเกี่ยวกับเครือข่ายหรือข้อผิดพลาดเฉพาะกรณีเกิดขึ้นในขณะที่ทำการเชื่อมต่อกับ SQL Server ไม่พบเซิร์ฟเวอร์หรือไม่สามารถเข้าถึงได้ตรวจสอบว่าชื่ออินสแตนซ์ถูกต้อง SQL Server ถูกกำหนดค่าให้อนุญาตการเชื่อมต่อระยะไกล (ผู้ให้บริการ: ผู้ให้บริการไปป์ที่มีชื่อข้อผิดพลาด: 40 - ไม่สามารถเปิดการเชื่อมต่อกับ SQL Server) กระบวนการเรียกใช้งานต้องสำเร็จและระบุผลลัพธ์โดยใช้พารามิเตอร์ "out"
ข้อผิดพลาดที่สิ้นสุด DTExec: การดำเนินการแพคเกจส่งกลับ DTSER_FAILURE (1)
เริ่มต้น: 12:01:28 น
เสร็จแล้ว: 12:02:15 น. ผ่านไป
: 46.641 วินาที
การดำเนินการแพคเกจล้มเหลว
ขั้นตอนล้มเหลว

ช่วยฉันด้วยในคนนี้ขอบคุณล่วงหน้า


ฉันได้รับปัญหาเดียวกัน สร้างแผนการซ่อมบำรุงใหม่
Sarathi Reddy

คำตอบ:


14

แผนการบำรุงรักษาใช้ประโยชน์จากแพคเกจ SSIS ที่เก็บไว้ใน MSDB แพ็คเกจเหล่านี้ใช้สายอักขระการเชื่อมต่อซึ่งจะไม่เปลี่ยนแปลงหลังจากเปลี่ยนชื่อเซิร์ฟเวอร์

ใช้สคริปต์ (ทำซ้ำด้านล่าง) โพสต์โดยNancySonในความคิดเห็นของวิธีการ: เปลี่ยนชื่อคอมพิวเตอร์ที่โฮสต์อินสแตนซ์ของเซิร์ฟเวอร์ SQL แบบสแตนด์อะโลนเพื่อรับแรงบันดาลใจบางอย่างเกี่ยวกับวิธีการเปลี่ยนสตริงการเชื่อมต่อเหล่านี้ หรือสร้างแผนการซ่อมบำรุงใหม่

แผนการบำรุงรักษาจะไม่ทำให้การเชื่อมต่อเปลี่ยนไปใช้ชื่อเซิร์ฟเวอร์ใหม่ดังนั้นจึงอาจแตกหักได้ หลังจากเปลี่ยนชื่อคุณอาจพบว่าคุณไม่สามารถลบหรือเปลี่ยนชื่อแผนการบำรุงรักษาที่มีอยู่ให้ลบออกก่อนที่จะเปลี่ยนชื่อเซิร์ฟเวอร์และสร้างใหม่ในภายหลังหรือรันสคริปต์ต่อไปนี้เพื่อแก้ไข:

   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 Server อย่างไรก็ตามแผนการบำรุงรักษายังคงมีชื่อเดิม :

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 และในกระบวนการฉันพบวิธีอื่นในการแก้ปัญหานี้: แก้ไขขั้นตอนในงานภายใต้แหล่งข้อมูลตรวจสอบการเชื่อมต่อเซิร์ฟเวอร์ภายในและแก้ไขส่วนแหล่งข้อมูล = ชื่อเซิร์ฟเวอร์ และ voila!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.