Utknęło zadanie w studio zarządzania, jak sobie z nimi poradzić?

13

Po kliknięciu opcji „Przełącz bazę danych w trybie offline” w studiu zarządzania ta wiadomość pozostanie zawieszona i nie zamknie się, jeśli klikniesz Zamknij.

https://i.imgur.com/KD6AROv.png

Jaki jest dobry sposób radzenia sobie z takimi zablokowanymi zadaniami w studio zarządzania? Czy możesz ich zabić za pomocą monitora aktywności? Czy powinienem szukać procesu powstrzymującego tę pracę przed zakończeniem?

A_V
źródło
4
Najpierw dowiedz się, co go blokuje. Możesz uzyskać te informacje z sys.dm_exec_requests. Twoje zadanie może to zrobić w taki sposób, aby nie zostało zablokowane, np. Wydając ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;najpierw ... w przeciwnym razie po prostu siedzi i czeka, a na zajętą ​​bazę danych może to trwać wiecznie.
Aaron Bertrand
Ustawienie bazy danych w single_user rozwiązało problem, powinienem się domyślić ... SQLserver zawsze wymaga single_user do tego typu rzeczy.
A_V,

Odpowiedzi:

13

Powiedziałbym, że nigdy nie używaj w interfejsie GUI opcji „Przełącz offline”, chyba że wiesz, że baza danych nie jest używana. Cokolwiek Trudno to wiedzieć bez odrobiny pracy nóg, więc dlaczego nie zapisać gdzieś tego skryptu i zawsze go używać?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

A potem oczywiście odwrotność:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

Powodem, dla którego musisz ustawić go jako SINGLE_USERpierwszy, jest wykopanie wszystkich istniejących użytkowników (istnieje opcja, aby to zrobić w oknie dialogowym odłączania, ale nie w oknie dialogowym przejścia w tryb offline), ponieważ SQL Server potrzebuje wyłącznego dostępu do bazy danych, aby przejąć to offline. Teraz możesz wykonać dodatkowe czynności, aby zobaczyć, kto aktualnie korzysta z bazy danych, tak jakbyś robił to w trakcie dużej operacji tworzenia kopii zapasowej lub zadania ETL lub co masz, może to być problematyczne.

EDIT : I złożyli propozycję Połącz ten temat (patrz Połącz # 2687832 ), a także pisał go Trello (zaszufladkowany „Object Explorer”).

Aaron Bertrand
źródło
A jeśli ustawienie pojedynczego użytkownika również się nie powiedzie, ponieważ nie może on uzyskać blokady bazy danych?
StackOverthrow
@ user560822 Musisz poczekać, aż uzyskasz blokadę bazy danych. Jeśli to oznacza, że ​​musisz zacząć zabijać sesje ...
Aaron Bertrand
9

Kiedy już jesteś w stanie zawieszenia, nie zapomnij, że możesz przeszukiwać otwarte połączenia na serwerze za pomocą

sp_who2  

w innej bazie danych, takiej jak master.
Zeskanuj wyniki w poszukiwaniu bazy danych, w której próbujesz przejść w tryb offline.
Zanotuj wartość kolumny spid (identyfikator procesu) tych wierszy.

Biegnij pojedynczo

kill  ##

gdzie „##” to pająk.

Z całą pewnością upewnij się, że te procesy nie są ważne, aby pozostawić uruchomione ... zostaną zakończone nawet bez zakończenia ostatniego polecenia i bez ostrzeżenia.

Mike M.
źródło
1
Przyjęta odpowiedź nie pomogła mi. Błąd pierwszego polecenia. Ta odpowiedź działa idealnie. Dziękuję
Czeburek
to dobrze :) Tak, zaakceptowana odpowiedź naprawdę pozwala uniknąć problemu ... jeśli już jesteś zawieszony, potrzebujesz czegoś takiego, aby go zabić
Mike M