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?


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

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.


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ę.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.