SQL Server 2008 R2: Problemy po zmianie nazwy komputera

10

Mam kłopotliwy problem po zmianie nazwy komputera zdalnego serwera obsługującego lokalną instancję SQL Server.

Zasadniczo serwer zdalny został przeniesiony z jednej witryny do drugiej. Aby to ułatwić, utworzyłem kopię zapasową starej bazy danych i przywróciłem nową nazwę, usuwając dane, dzięki czemu można je wykorzystać jako świeżą bazę danych dla oprogramowania klienckiego. Zmieniłem także nazwę komputera, ponieważ zawsze robimy to, aby zidentyfikować każdy serwer według numeru strony.

Do bazy danych można dobrze podłączyć oprogramowanie klienckie, a ja mogę zalogować się bezpośrednio do SQL Server w porządku. Jednak jedno z moich zadań agenta programu SQL Server kończy się niepowodzeniem z błędem w dzienniku zdarzeń:

Zaplanowane zadanie programu SQL Server „Nocne resetowanie” (0x4F76FDFFF6DFFE4EA0DE4A70252AD3BD) - Status: Nieudane - Wywołane: 2012-02-07 08:10:05 - Komunikat: Zadanie nie powiodło się. Nie można ustalić, czy właściciel (Site-19 \ Admin) zadania Nightly Reset ma dostęp do serwera (powód: Nie można uzyskać informacji o grupie / użytkowniku Windows NT „Site-19 \ Admin”, kod błędu 0x534. [SQLSTATE 42000] ( Błąd 15404)).

Teraz „Site-19” to stara nazwa komputera, która została zmieniona, a serwer zresetowany. Łączę się ręcznie przy użyciu „Site-28”, nowego numeru witryny, i pokazuje mi to jako połączenie z SQL Server z Site-28 \ Admin. Jednak gdy patrzę na właściwości zadania Agenta, pokazuje właściciela jako Site-19 \ Admin, a kiedy próbuję przeglądać użytkowników, aby go zmienić, Site-28 \ Admin nie pojawia się jako opcja , tylko Site-19 \ Admin. Jeśli utworzę skrypt z nowego zadania i ręcznie zmienię właściciela na „Site-28 \ Admin”, nowe zadanie zostanie utworzone za pomocą właściciela „Site-19 \ Admin”.

Przeglądając sys.servers (lub przez sp_helpserver), mam tylko jeden wpis: bieżącą nazwę komputera. Jednak SELECT @@ SERVERNAME zwraca oryginalną nazwę komputera programistycznego (dwie zmiany nazwy wcześniej).

Krótko mówiąc, nie mogę uruchomić tego ważnego zadania SQL Server Agent, ponieważ należy ono do użytkownika, który już nie istnieje, i nie mogę wymyślić, jak to zmienić lub utworzyć jako właściwy użytkownik.

Geo Ego
źródło
Dzięki za link. Zgodnie z twoją sugestią też o to poprosiłem. Wydaje mi się, że jest to również ważne tutaj, ponieważ chociaż pytanie jest bardziej związane z infrastrukturą, odpowiedź najprawdopodobniej będzie obejmować kod, a także tutaj jest wiele pytań dotyczących metodologii SQL Server.
Geo Ego
A co się stanie, jeśli upuścisz serwer „Site-28”? Co wyświetla sp_helpserver? Nie możesz po prostu usunąć starej pracy i utworzyć nowej?
1
Co ciekawe, kiedy próbuję upuścić „Site-28”, mówi mi, że nie można go znaleźć. Kiedy próbuję go dodać, mówi, że już istnieje. Jeśli utworzę nowe zadanie, czy to za pomocą kreatora, czy skryptu z oryginału, zawsze tworzy ono z właścicielem „Site-19 \ Admin”.
Geo Ego
Więc stary, fizyczny serwer otrzymał nową nazwę (i ta zmiana została również wprowadzona w DNS), a SELECT @@ SERVERNAME w polu o zmienionej nazwie zwraca nową nazwę?
jl01
1
Połączyłem przeniesione pytanie w to, więc wszystkie odpowiedzi są skonsolidowane.
jcolebrand

Odpowiedzi:

7

Kiedy dodałeś nową nazwę serwera za pomocą sp_addserver, pamiętasz o dołączeniu oznaczenia „lokalnego”. To ten tag aktualizuje metadane dla @@ SERVERNAME. Więcej informacji.

sp_addserver 'servername', local
Brian Knight
źródło
Tylko notatka, która @@ServerNamenie została zaktualizowana, dopóki nie zrestartowałem SQL Servera
fiat
7

Znalazłem odpowiedź wczoraj z pomocą mojego przyjaciela. Musiałem zalogować się przez SSMS z użytkownikiem innym niż login Windows, którego próbowałem użyć, usunąć stary login i ponownie dodać mój login Windows. Potem mogłem poprawnie przenieść własność zadania, SQL mógł pobrać dane użytkownika z systemu Windows i wszystko było w porządku na całym świecie.

Geo Ego
źródło
Zastosowałem odpowiedź AND @ brian-knight. Użyłem tego do zmiany własności db SELECT 'use ' + DB_NAME(database_id) + ';EXEC sp_changedbowner ''sa'';' FROM sys.databases where DB_NAME(database_id) like 'MyDbs%';. Potem mogłem porzucić złe logowanie
fiat
4

Używam następujących do zidentyfikowania problemów i zbudowania poprawnej instrukcji drop i add, jeśli otrzymasz WSZYSTKIE OK, to nie musisz nic robić, w przeciwnym razie musisz uruchomić polecenia.

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'
Mike Miller
źródło
Za pomocą tego skryptu udało mi się stwierdzić, że muszę ręcznie usunąć starą nazwę serwera i dodać nową. Zrobiłem to, ale nadal mam te same problemy.
Geo Ego
Czy zrestartowałeś instancję?
Tak, instancja została ponownie uruchomiona później.
Geo Ego
Przepraszam, koleś musi się zgiąć, nie jestem pewien, na czym polega problem.
0

Miał podobny problem: zmienił nazwę hosta komputera, na którym działa SQL Server i SQL Server Agent. Zadania zostały przypisane do. Po utworzeniu tymczasowego użytkownika / logowania do SSMS za pomocą tego nowego tymczasowego użytkownika / upuść i utwórz nazwę logowania (public i sysadmin privs!) / Ponownie przypisz zadania do tego ponownie utworzonego logowania. Wszystko było w porządku. Może mógłbyś manipulować tabelą systemową, aby odzwierciedlić tę samą zmianę; ale powyższa metoda nie jest tak ryzykowna.

Martin Bruegger
źródło