Proces „TASK MANAGER” przejmuje bazę danych w trybie pojedynczego użytkownika. Co to jest?

13

To jest duplikat pytania, które zadałem przy przepełnieniu stosu , ale doradzono mi, że ktoś tutaj może mieć lepszy pomysł na to, co się dzieje.

Mam sporadyczny problem, gdy aktualizuję SQL Server w trybie pojedynczego użytkownika, używając .NET SqlConnection, jakaś inna aplikacja w jakiś sposób loguje się do bazy danych, podczas gdy kod SQL jest wykonywany i wyrzuca mój proces. SqlConnection nie jest w żaden sposób zamykany ani usuwany. Ale jakaś inna aplikacja w jakiś sposób zostaje połączona z bazą danych i to powoduje moje połączenie.

Kiedy uruchamiam sp_who, widziałem, że proces, który przejął kontrolę nad bazą danych to Command = "TASK MANAGER".

Każdy może mi powiedzieć, co to jest ten proces, jaki jest jego cel i jak na świecie może dostać się do bazy danych, która jest w trybie pojedynczego użytkownika i istnieje aktywne połączenie?

galety
źródło
Czy wyłączasz agenta SQL podczas tego procesu? Zadania o nazwie „TASK MANAGER” (o niskiej liczbie spid) są procesami wewnętrznymi.
Jon Seigel,
@JonSeigel nie, nie zrobiłem tego. Czy mówisz, że SQL Agent jest rzeczywistym procesem, który uruchamia TASK MANAGER?
galets
Nie jestem w 100% pewien. Wiem tylko, że SQL Agent łączy się z instancją, gdy jest uruchomiona, co może uniemożliwić zalogowanie się, gdy serwer jest w trybie pojedynczego użytkownika. Wczoraj miałem ten problem i naprawiłem go za pomocą zatrzymania agenta SQL.
Jon Seigel,
2
Żeby było jasne, nie jest to ten sam Menedżer zadań, którego używasz w systemie Windows do przeglądania procesów i wydajności systemu.
Aaron Bertrand

Odpowiedzi:

10

Miałeś dzisiaj ten sam problem, jeśli nie wyłączyłeś AUTOMATYCZNEJ ASYNCU AUTO_UPDATE_STATISTICS, nie będziesz mógł wejść do swojej bazy danych, możesz rozwiązać ten problem, przełączając bazę danych w tryb offline. Ważne jest, aby wiedzieć, że musisz ustawić priorytet zakleszczenia na wysoki, w przeciwnym razie nastąpi zakleszczenie polecenia. Użyj następujących poleceń, aby wyjść z POJEDYNCZEGO trybu użytkownika

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET OFFLINE WITH ROLLBACK IMMEDIATE

Śledzony przez

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET ONLINE WITH ROLLBACK IMMEDIATE

Śledzony przez

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Stijn Wynants
źródło
3
Bardzo ci za to dziękuję. Stwierdziłem jednak, że krok OFFLINE / ONLINE nie był wymagany; SET MULTIUSER WITH ROLLBACK IMMEDIATEpracował tylko przez siebie, kiedy SET DEADLOCK_PRIORITY HIGHzostała wykonana pierwsza
Ross dociskową
6

Myślę, że tajemnica w końcu została rozwiązana :

Przed ustawieniem bazy danych na SINGLE_USER sprawdź, czy opcja AUTO_UPDATE_STATISTICS_ASYNC jest ustawiona na OFF. Po ustawieniu na WŁ. Wątek w tle używany do aktualizacji statystyk nawiązuje połączenie z bazą danych i nie będzie można uzyskać dostępu do bazy danych w trybie pojedynczego użytkownika.

galety
źródło
6

Zatrzymaj śledzenie zdarzeń rozszerzonych „system_health”. Zostanie on wymieniony w sekcji

SQL Server Management Studio
-> [ServerName]
-> Management
-> Extended Events
-> Right-Click on 'System_health'
-> Hit Stop Session

Po zablokowaniu blokady zrestartuj sesję.

Raghu Nair
źródło
Chociaż druga odpowiedź wyjaśnia, dlaczego tak się dzieje, ta wyjaśnia, jak to rozwiązać.
Boris Callens
Idealna rozdzielczość dla mnie. Działa zgodnie z oczekiwaniami
Im88
0

Musisz wyłączyć agenta SQL przed uruchomieniem trybu jednorazowego użytku. W momencie, gdy agent będzie pobierał dostęp dla pojedynczego użytkownika. Pamiętaj, że pojedynczy użytkownik nie jest pierwszym użytkownikiem / procesem do połączenia.

Nick Winstanley
źródło