SQL Server 2008 R2:コンピューター名の変更後の問題


10

ローカルSQL Serverインスタンスをホストしているリモートサーバーのコンピューター名を変更すると、混乱する問題が発生します。

基本的に、リモートサーバーはサイト間で移動されました。これを容易にするために、古いデータベースをバックアップして新しいデータベース名に復元し、データを消去して、クライアントソフトウェアの新しいデータベースとして使用できるようにしました。コンピューター名も変更しました。これは、サイト番号で各サーバーを識別するために常に変更するためです。

データベースはクライアントソフトウェアから問題なく接続でき、SQL Serverに直接ログインできます。ただし、SQL Serverエージェントジョブの1つが失敗し、イベントログにエラーが記録されます。

SQL Serverのスケジュールされたジョブ 'Nightly Reset'(0x4F76FDFFF6DFFE4EA0DE4A70252AD3BD)-ステータス:失敗-起動日:2012-02-07 08:10:05-メッセージ:ジョブが失敗しました。ジョブNightly Resetの所有者(Site-19 \ Admin)にサーバーアクセスがあるかどうかを判別できません(理由:Windows NTグループ/ユーザー 'Site-19 \ Admin'に関する情報を取得できませんでした、エラーコード0x534。[SQLSTATE 42000](エラー15404))。

これで、「サイト-19」は変更された古いコンピューター名になり、サーバーがリセットされました。新しいサイト番号「Site-28」を使用して手動で接続すると、Site-28 \ Adminを使用してSQL Serverに接続されていることが表示されます。ただし、エージェントジョブのプロパティを見ると、所有者がSite-19 \ Adminであると表示され、ユーザーを参照して変更しようとすると、Site-28 \ Adminがオプションとして表示されません。 、Site-19 \ Adminのみ。このジョブから新しいジョブをスクリプト化し、所有者を手動で「Site-28 \ Admin」に変更すると、新しいジョブは所有者「Site-19 \ Admin」で作成されます。

sys.servers(またはsp_helpserver経由)を見ると、現在のコンピューター名という1つのエントリしかありません。ただし、SELECT @@ SERVERNAMEは元の開発マシン名を返します(2つ前の名前の変更)。

つまり、この重要なSQL Serverエージェントジョブは、存在しないユーザーに属しているため実行できず、変更または正しいユーザーとして作成する方法がわかりません。


リンクをありがとう。あなたの提案で、私もそこで尋ねました。質問はインフラストラクチャに関連していますが、答えにはコードが含まれている可能性が高いため、ここでも有効だと思います。SQLServerの方法論に関する質問もたくさんあります。
Geo Ego

サーバー「Site-28」をドロップするとどうなりますか?sp_helpserverは何を表示しますか?古いジョブを削除して新しいジョブを作成することはできませんか?

1
興味深いことに、「Site-28」をドロップしようとすると、見つからないことがわかります。追加しようとすると、すでに存在していると表示されます。ウィザードを使用するか、元のジョブからスクリプトを作成するかに関係なく、新しいジョブを作成すると、常に「Site-19 \ Admin」を所有者としてジョブが作成されます。
Geo Ego

したがって、古い物理サーバーに新しい名前が割り当てられ(この変更もDNSで行われました)、名前を変更したボックスのSELECT @@ SERVERNAMEが新しい名前を返しますか?
jl01

1
転送された質問をこの質問にマージしたので、すべての回答が統合されています。
jcolebrand

回答:


7

sp_addserverを使用して新しいサーバー名を追加したときに、「ローカル」の指定を含めることを覚えていますか。@@ SERVERNAMEのメタデータを更新するのはそのタグです。 詳しくは。

sp_addserver 'servername', local

@@ServerNameSQL Serverを再起動するまで更新されなかったメモ
フィアット

7

私は昨日、私の友人の助けを借りて答えを見つけました。使用しようとしたWindowsログイン以外のユーザーでSSMS経由でログインし、古いログインを削除して、Windowsログインを再度追加する必要がありました。その後、ジョブの所有権を適切に転送することができ、SQLはWindowsからユーザーデータを取得することができました。


私はこれと@ brian-knightの回答を適用しました。dbの所有権を変更するには、これを使用しましたSELECT 'use ' + DB_NAME(database_id) + ';EXEC sp_changedbowner ''sa'';' FROM sys.databases where DB_NAME(database_id) like 'MyDbs%';。その後、私は悪いログオンを落とすことができました
フィアット

4

以下を使用して問題を特定し、正しいドロップと追加のステートメントを構築します。すべて問題がなければ、コマンドを実行する必要があるので、何もする必要はありません。

declare @currentName as nvarchar(128)
declare @newName as varchar(max)
declare @serverName as varchar(max)
declare @serverInstance as varchar(max)

select  @currentName = @@SERVERNAME
select @serverInstance = cast(serverproperty('InstanceName') as varchar(max))
select  @serverName = cast(serverproperty('MachineName') as varchar(max))

set @newName = @serverName

if (@serverInstance <> '') 
begin
      set @newName = @serverName + '\' + @serverInstance
end

if (@currentName <> @newName)
Begin
      print 'sp_dropserver ''' + @currentName + '''';
      print 'go'
      print 'sp_addserver ''' + @newName + ''',local'
      print 'go'
end
else
Print 'ALL OK'

このスクリプトを使用して、古いサーバー名を手動で削除して新しいサーバー名を追加する必要があることを特定できました。私はそうしましたが、私はまだ同じ問題を抱えています。
Geo Ego

インスタンスを再起動しましたか?

はい、インスタンスは後で再起動されました。
Geo Ego

申し訳ありませんがお辞儀をしなければなりません。問題が何であるかはわかりません。

0

同様の問題がありました:SQL ServerとSQL Serverエージェントが実行されているコンピューターのホスト名を変更しました。にジョブが割り当てられました。一時ユーザーを作成した後、この新しい一時ユーザーを使用してSSMSにログオンしたり、ドロップしてログイン名を作成したり(publicおよびsysadmin privs!)/この再作成したログインにジョブを再度割り当てます。システムテーブルを操作して同じ変更を反映することもできます。しかし、上記の方法はそれほど危険ではありません。

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