メンテナンスプランジョブでローカルサーバー接続を変更または更新する方法


15

2日前に、クライアントが開発サーバー名の1つを変更しました

サーバーの名前が変更された後、サーバー名が一致しないため、すべてのメンテナンスジョブおよびその他のジョブが失敗します。

私たちは、使用しているSQL Server 2012のバージョンとサーバー2008 OSを

だから今日の朝、私はSQL Server 2012の名前を名前を更新して名前を変更し、テーブル、手順を更新しました

メンテナンスジョブでローカルサーバー接続を更新しようとしましたが、編集できません。次に、新しいサーバー接続を追加しましたが、ジョブを実行中にエラーが発生することはありません。

ジョブプロパティオプションのターゲットページで試した後、ターゲットサーバーのみが選択され、複数のターゲットサーバーが無効になっています。

以下のエラー

ユーザーとして実行:NT Service \ SQLSERVERAGENT。64ビット版Microsoft(R)SQL Server Execute Package Utilityバージョン11.0.2100.60 Copyright(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
説明:タスクの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」パラメーターを使用して結果を示す必要があります。
終了エラーDTExec:パッケージ実行はDTSER_FAILURE(1)を返しました。
開始:12:01:28 AM
終了:12:02:15 AM
経過:46.641秒。
パッケージの実行に失敗しました。
ステップは失敗しました。

この人たちを助けてくれて、よろしくお願いします


同じ問題が発生しました。メンテナンスプランを再作成しました。
サラティレディ

回答:


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

私はこれが古いスレッド/質問であることを知っていますが、今日同様の問題があり、上記のスクリプトを適用することで解決しましたので、DarkS0ulに感謝します。そして、プロセスでこれを解決する別の方法を見つけました:ジョブのステップを編集し、データソースでローカルサーバー接続をチェックし、データソース=サーバー名の部分を編集します。そして出来上がり!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.