Cara mengubah atau memperbarui koneksi server lokal dalam pekerjaan rencana Pemeliharaan


15

Dua hari yang lalu, klien kami mengubah salah satu nama Server Dev kami

Setelah Server Berganti Nama, Semua pekerjaan pemeliharaan saya dan pekerjaan lainnya gagal karena nama server tidak sesuai.

Kami menggunakan versi sql server 2012 dan server 2008 OS

Jadi hari ini pagi saya mengganti nama server Sql 2012 saya untuk memperbarui nama yang diberikan dan membuat tabel, memperbarui prosedur

Saya mencoba memperbarui koneksi server lokal dalam pekerjaan pemeliharaan tetapi tidak dapat diedit. Kemudian saya menambahkan koneksi server baru, masih tidak digunakan saya mendapatkan kesalahan di bawah ini, saat melakukan pekerjaan.

Setelah saya mencoba dengan halaman target dalam opsi properti pekerjaan, di sana juga hanya server target yang dipilih dan beberapa server target dinonaktifkan.

Kesalahan di bawah ini

Dieksekusi sebagai pengguna: NT Service \ SQLSERVERAGENT. Microsoft (R) SQL Server Menjalankan Paket Utilitas Versi 11.0.2100.60 untuk 64-bit Copyright (C) Microsoft Corporation. Seluruh hak cipta.
Dimulai: 12:01:28. Kesalahan: 2013-12-16 00: 01: 43.98 Kode: 0xC00291EC Sumber: {410F7661-F71A-4B68-9584-BA422AB00F02} Jalankan Tugas SQL
Deskripsi: Gagal mendapatkan koneksi "Sambungan server lokal" . Koneksi mungkin tidak dikonfigurasi dengan benar atau Anda mungkin tidak memiliki izin yang tepat untuk koneksi ini. Kesalahan
Kesalahan Akhir : 2013-12-16 00: 02: 00.00
Kode: 0xC0024104
Sumber: Territory_Update
Deskripsi: Metode Execute pada tugas mengembalikan kode kesalahan 0x80131904 (Terjadi kesalahan terkait jaringan atau spesifik-contoh saat membuat koneksi ke SQL Server. Server tidak ditemukan atau tidak dapat diakses. Pastikan nama instance benar dan bahwa SQL Server dikonfigurasikan untuk memungkinkan koneksi jarak jauh (penyedia: Named Pipes Provider, error: 40 - Tidak dapat membuka koneksi ke SQL Server)). Metode Execute harus berhasil, dan menunjukkan hasilnya menggunakan parameter "out". Kesalahan
Kesalahan Akhir : 2013-12-16 00: 02: 15.00
Kode: 0xC0024104
Sumber: {4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
Deskripsi: Metode Execute pada tugas mengembalikan kode kesalahan 0x80131904 (Terjadi kesalahan terkait jaringan atau spesifik-contoh saat membuat koneksi ke SQL Server. Server tidak ditemukan atau tidak dapat diakses. Pastikan nama instance benar dan bahwa SQL Server dikonfigurasikan untuk memungkinkan koneksi jarak jauh (penyedia: Named Pipes Provider, error: 40 - Tidak dapat membuka koneksi ke SQL Server)). Metode Execute harus berhasil, dan menunjukkan hasilnya menggunakan parameter "out".
Kesalahan Akhir DTExec: Eksekusi paket mengembalikan DTSER_FAILURE (1).
Dimulai: 12:01:28.
Selesai: 12:02:15.
Berlalu: 46.641 detik.
Eksekusi paket gagal.
Langkah itu gagal.

Bantu aku dalam masalah ini, Terima kasih sebelumnya


Saya mendapat masalah yang sama. Rencana pemeliharaan yang dibuat ulang.
Sarathi Reddy

Jawaban:


14

Paket perawatan menggunakan paket SSIS yang disimpan di MSDB. Paket-paket ini menggunakan string koneksi, yang tidak diubah setelah server mengganti nama.

Gunakan skrip (direproduksi di bawah) yang diposting oleh NancySon dalam komentar di How to: Ubah nama Komputer yang Menjadi Tuan Rumah dari SQL Server Stand-Alone untuk mendapatkan beberapa inspirasi tentang cara mengubah string koneksi ini. Atau buat ulang rencana perawatan.

Paket perawatan tidak mengubah koneksinya menjadi nama server baru sehingga dapat rusak. Setelah mengganti nama, Anda mungkin menemukan bahwa Anda tidak dapat menghapus atau mengganti nama paket perawatan yang ada, jadi hapuslah sebelum mengganti nama server dan buat ulang setelahnya atau jalankan skrip berikut untuk memperbaikinya:

   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

Saya menggunakan kode ini dari jawaban ini untuk pertanyaan Server Fault Mengganti nama menjadi SQL Server, namun rencana pemeliharaan masih memiliki nama lama :

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)

Dan untuk mengganti nama:

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

Ketika Anda mengganti nama SQL Server (yaitu mengubah nama Windows NetBIOS), Anda juga perlu melakukan langkah manual kecil ini di dalam SQL Server untuk mengganti nama secara internal. Detail dalam artikel MSKB ini .


1

Saya tahu ini adalah utas lama / pertanyaan tetapi memiliki masalah yang sama hari ini dan menyelesaikannya dengan menerapkan skrip di atas, jadi terima kasih DarkS0ul. Dan dalam proses saya menemukan cara lain untuk menyelesaikan ini: edit langkah dalam pekerjaan, di bawah Sumber data, periksa koneksi server lokal dan edit Sumber Data = bagian Servername. Dan voila!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.