Skrajny czas oczekiwania przy wyłączaniu bazy danych SQL Server

278

Próbuję przeprowadzić konserwację offline (przywracanie bazy danych deweloperów z kopii zapasowej na żywo) w mojej bazie danych deweloperów, ale polecenie „Przejdź do trybu offline” za pośrednictwem programu SQL Server Management Studio działa bardzo wolno - już od 30 minut. Jestem już prawie gotowy i nie mogę znaleźć w Internecie żadnych odniesień do tego, co może powodować problem z szybkością lub jak to naprawić.

Niektóre strony sugerują, że otwarte połączenia z bazą danych powodują to spowolnienie, ale jedyną aplikacją, która korzysta z tej bazy danych jest instancja IIS mojego urządzenia deweloperskiego, a usługa jest zatrzymana - nie ma już żadnych otwartych połączeń.

Co może być przyczyną tego spowolnienia i co mogę zrobić, aby go przyspieszyć?

Erik Forbes
źródło

Odpowiedzi:

408

Po dodatkowym wyszukiwaniu (nowe wyszukiwane hasła inspirowane odpowiedzią gbn i komentarzem u07ch do odpowiedzi KMike) znalazłem to, które zakończyło się pomyślnie w ciągu 2 sekund:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Aktualizacja)

Jeśli nadal występuje błąd z następującym błędem, możesz go naprawić zgodnie z inspiracją tego postu na blogu :

ALTER DATABASE nie powiodło się, ponieważ nie można umieścić blokady w bazie danych „dbname” Spróbuj ponownie później.

możesz uruchomić następującą komendę, aby dowiedzieć się, kto blokuje bazę danych:

EXEC sp_who2

I użyj wszystkiego SPID, co znajdziesz w następującym poleceniu:

KILL <SPID>

Następnie uruchom ALTER DATABASEpolecenie ponownie. Powinno teraz działać.

Erik Forbes
źródło
35
Jeśli to nie działa (nie można umieścić blokady), spróbuj również rozwiązania na stronie stackoverflow.com/questions/4673065 .
dokładnie
3
Jeśli proces Take DB Offline nadal działa, w przypadku komputerów deweloperskich możesz go zabić z Menedżera zadań i uruchomić powyżej polecenia.
Null Head,
1
Jeśli uruchomisz polecenie KILL i pojawi się komunikat „Nie można użyć KILL do zabicia własnego procesu.”, Upewnij się, że używasz głównej bazy danych do uruchomienia komendy
Jarrod,
129

Najprawdopodobniej istnieje gdzieś połączenie z bazą danych (rzadki przykład: asynchroniczna aktualizacja statystyki )

Aby znaleźć połączenia, użyj sys.sysprocesses

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Aby wymusić rozłączenie, użyj NATYCHMIASTOWEGO ROLLBACK

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
gbn
źródło
7
+1, ponieważ zapytanie procesowe pozwala dowiedzieć się, co jest połączone z tą bazą danych. w moim przypadku był to nieuczciwy pracownik z otwartym SSMS :)
MikeMurko
3
W moim przypadku byłem nieuczciwy przy otwartym oknie analizatora zapytań
dellyjm
1
W moim przypadku twórcy miał produkcja główny strona bardzo dobrze znanym banku skierowaną w bazie danych lebelled OLD
ZZ9
3
Jeśli powie, że ALTER DATABASE failed because a lock could not be placed on databasepolecenie KILL <SPID>pomoże
Muflix,
28

Czy masz jakieś otwarte okna SQL Server Management Studio, które są podłączone do tej bazy danych?

Przełącz go w tryb pojedynczego użytkownika, a następnie spróbuj ponownie.

KM.
źródło
2
ZMIEŃ bazę danych <NAZWA_DB> Ustaw POJEDYNCZY_UŻYTKOWNIK Z Natychmiastowym wycofaniem
u07ch
KMike - jedyne połączenie, jakie mam, jest otwarte na bazę danych Master, a nie na bazę danych, którą próbuję przełączyć w tryb offline.
Erik Forbes
17

W moim przypadku, po tak długim oczekiwaniu na zakończenie, nie miałem cierpliwości i po prostu zamknąłem studio zarządzania. Przed wyjściem pokazał komunikat o powodzeniu, db jest w trybie offline. Pliki były dostępne do zmiany nazwy.

Rudy
źródło
7

wykonać procedurę przechowywaną sp_who2

Pozwoli ci to sprawdzić, czy są jakieś blokady blokujące. Zabij ich, powinien to naprawić.

woodwa
źródło
5

W SSMS: kliknij prawym przyciskiem myszy ikonę serwera SQL, Monitor aktywności. Otwarte procesy. Znajdź przetworzone połączenie. Kliknij proces prawym przyciskiem myszy, Zabij.

nzeemin
źródło
4

za każdym razem, gdy napotkasz tego rodzaju rzeczy, zawsze powinieneś pomyśleć o swoim dzienniku transakcji. Wskazuje to na zmianę instrukcji db db z natychmiastowym wycofaniem. Sprawdź to: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Kość na punktach kontrolnych itp. Musisz zdecydować, czy transakcje w twoim dzienniku są warte zapisania, czy nie, a następnie wybrać tryb, aby odpowiednio uruchomić db. Naprawdę nie ma powodu, abyś musiał czekać, ale także nie ma powodu, aby stracić dane - możesz mieć oba.

yetanotherdave
źródło
2
Mądra rada - dziękuję - ale w tym przypadku dane są zbędne, ponieważ jest to baza danych programowania, która jest przywracana.
Erik Forbes
3

Zamknięcie instancji SSMS (SQL Service Manager), z którego wysłano żądanie, rozwiązało problem dla mnie .....

Armand G.
źródło
3

W moim przypadku przejrzałem niektóre tabele w DB przed wykonaniem tej akcji. Moje konto użytkownika miało aktywne połączenie z tym DB w SSMS. Po rozłączeniu się z serwerem w SSMS (pozostawiając otwarte okno dialogowe „Przełącz bazę danych w tryb offline”) operacja zakończyła się powodzeniem.

RamenNoodle
źródło
To samo u mnie. Następnie ponownie się połączyłem, zmieniłem aktywną bazę danych na master i uruchom następującą komendę: ALTER DATABASE XXX SET OFFLINE WITH ROLLBACK NATYCHMIAST
cskwg
2

Aby obejść ten problem, zatrzymałem stronę internetową, która była podłączona do bazy danych w IIS i natychmiast panel „zamrożony” „przestaw db offline” został odmrożony.

Dan
źródło
2

Wypróbowałem wszystkie poniższe sugestie i nic nie działało.

  1. EXEC sp_who
  2. Zabij <SPID>

  3. ZMIEŃ ZESTAW BAZY DANYCH POJEDYNCZY_UŻYTKOWNIK Z Natychmiastowym wycofaniem

    ZMIEŃ BAZY DANYCH ZESTAW W TRYBIE OFFLINE Z NATYCHMIASTOWYM ROLLBACK

    Wynik: oba powyższe polecenia również zostały zablokowane.

4 Kliknij bazę danych prawym przyciskiem myszy -> Właściwości -> Opcje Ustaw bazę danych Tylko do odczytu na wartość True Kliknij „Tak” w oknie dialogowym z ostrzeżeniem SQL Server zamknie wszystkie połączenia z bazą danych.

Wynik: okno utknęło podczas wykonywania.

W ostateczności zrestartowałem usługę serwera SQL z menedżera konfiguracji, a następnie uruchomiłem ZMIENIĆ BAZY DANYCH USTAWIĆ ONLINE Z NATYCHMIASTOWYMI ROLLBACK. Działa jak urok

Viraj A.
źródło
1

Zamknij także wszystkie okna zapytań, które możesz otworzyć, które są podłączone do danej bazy danych;)

Steve Woods
źródło
1

W SSMS ustaw bazę danych jako tylko do odczytu, a następnie z powrotem. Połączenia zostaną zamknięte, co zwolni blokady.

W moim przypadku istniała strona internetowa, która miała otwarte połączenia z bazą danych. Ta metoda była dość łatwa:

  1. Kliknij bazę danych prawym przyciskiem myszy -> Właściwości -> Opcje
  2. Ustaw Database Read-Onlyna True
  3. Kliknij „Tak” w oknie dialogowym ostrzegającym, że SQL Server zamknie wszystkie połączenia z bazą danych.
  4. Otwórz ponownie Opcje i wyłącz tylko do odczytu
  5. Teraz spróbuj zmienić nazwę bazy danych lub przełączyć ją w tryb offline.
zacharydl
źródło
0

Dla mnie musiałem tylko przejść do Monitora aktywności zadania i zatrzymać dwie rzeczy, które były przetwarzane. Następnie natychmiast przełączyło się w tryb offline. W moim przypadku wiedziałem jednak, czym są te 2 procesy i że można je zatrzymać.

Craig
źródło
0

W moim przypadku baza danych była powiązana ze starą instalacją Sharepoint. Zatrzymanie i wyłączenie powiązanych usług w menedżerze serwerów „cofnęło” działanie w trybie offline, które działało przez 40 minut i zakończyło się natychmiast.

Możesz sprawdzić, czy z usług bazy danych korzystają obecnie jakieś usługi.

Jonathan
źródło
1
Uruchom, sp_who2aby zobaczyć, które procesy korzystają z bazy danych i użyj, kill <PID>aby je zatrzymać.
Eric Kigathi,
0

Następnym razem, w oknie dialogowym Przełącz offline, zaznacz pole wyboru „Usuń wszystkie aktywne połączenia”. Byłem też na SQL_EXPRESS na komputerze lokalnym bez połączeń, ale to spowolnienie nastąpiło dla mnie, chyba że zaznaczyłem to pole wyboru.

Brett Drake
źródło
-1

W moim przypadku zatrzymałem serwer Tomcat. wtedy natychmiast DB przeszło w tryb offline.

Java Main
źródło