Der Prozess „TASK MANAGER“ übernimmt eine Datenbank im Einzelbenutzermodus. Was ist es?

13

Dies ist ein Duplikat der Frage, die ich beim Stackoverflow gestellt habe , aber mir wurde geraten, dass jemand hier eine bessere Vorstellung davon haben könnte, was passiert.

Ich habe ein sporadisches Problem, wenn ich ein Upgrade von SQL Server in einem Einzelbenutzermodus mit .NET SqlConnection durchführe. Eine andere Anwendung meldet sich irgendwie bei der Datenbank an, während der SQL-Code ausgeführt wird, und startet meinen Prozess. SqlConnection wird in keiner Weise geschlossen oder entsorgt. Aber eine andere Anwendung ist irgendwie mit der Datenbank verbunden und das bringt meine Verbindung zum Erliegen.

Wenn ich sp_who ausführe, kann ich sehen, dass ein Prozess, der die Kontrolle über die Datenbank übernommen hat, Command = "TASK MANAGER" ist.

Jeder kann mir sagen, was dieser Prozess ist, wozu er dient und wie in aller Welt er in eine Datenbank gelangen kann, die sich im Einzelbenutzermodus befindet und eine aktive Verbindung besteht.

Galets
quelle
Fahren Sie SQL Agent während dieses Vorgangs herunter? Die Aufgaben mit dem Namen "TASK MANAGER" (mit niedrigen Spid-Zahlen) sind interne Prozesse.
Jon Seigel
@ JonSeigel nein, habe ich nicht. Wollen Sie damit sagen, dass SQL Agent ein tatsächlicher Prozess ist, auf dem TASK MANAGER ausgeführt wird?
Galets
Ich bin nicht 100% sicher. Ich weiß, dass SQL Agent während der Ausführung eine Verbindung zur Instanz herstellt. Dies kann dazu führen, dass Sie sich nicht anmelden können, während sich der Server im Einzelbenutzermodus befindet. Ich hatte dieses Problem gestern und das Beenden von SQL Agent hat es behoben.
Jon Seigel
2
Dies ist nicht derselbe Task-Manager, den Sie in Windows zum Anzeigen von Prozessen und Systemleistung verwenden.
Aaron Bertrand

Antworten:

9

Hatte heute das gleiche Problem: Wenn Sie Ihren AUTO_UPDATE_STATISTICS ASYNC nicht ausgeschaltet haben, können Sie Ihre Datenbank nicht eingeben. Sie können dies lösen, indem Sie Ihre Datenbank offline schalten. Es ist wichtig zu wissen, dass Sie Ihre Deadlock-Priorität auf hoch setzen müssen, da Sie sonst vom Befehl ausgeschlossen werden. Verwenden Sie die folgenden Befehle, um den EINZELNEN Benutzermodus zu verlassen

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET OFFLINE WITH ROLLBACK IMMEDIATE

gefolgt von

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET ONLINE WITH ROLLBACK IMMEDIATE

gefolgt von

SET DEADLOCK_PRIORITY HIGH

ALTER DATABASE [YourDBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Stijn Wynants
quelle
3
Vielen Dank dafür. Ich stellte jedoch fest, dass der OFFLINE / ONLINE-Schritt nicht erforderlich war. Das SET MULTIUSER WITH ROLLBACK IMMEDIATEhat ganz von alleine funktioniert, als SET DEADLOCK_PRIORITY HIGHes zuerst gemacht wurde
Ross Presser
6

Ich denke, das Rätsel wurde endlich gelöst :

Bevor Sie die Datenbank auf SINGLE_USER setzen, überprüfen Sie, ob die Option AUTO_UPDATE_STATISTICS_ASYNC auf OFF gesetzt ist. Wenn diese Option auf ON gesetzt ist, stellt der zum Aktualisieren von Statistiken verwendete Hintergrundthread eine Verbindung zur Datenbank her, und Sie können im Einzelbenutzermodus nicht auf die Datenbank zugreifen.

Galets
quelle
6

Stoppen Sie die erweiterte Ereignisverfolgung "system_health". Es wird unter aufgeführt

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

Starten Sie die Sitzung neu, sobald die Blocker behoben sind.

Raghu Nair
quelle
Obwohl die andere Antwort erklärt, warum dies geschieht, erklärt diese, wie es behoben werden kann.
Boris Callens
Perfekte Auflösung für mich. Es hat wie erwartet
funktioniert
0

Sie müssen SQL Agent deaktivieren, bevor Sie den Einwegmodus starten. Da der Agent accout den Einzelbenutzerzugriff erhält. Denken Sie daran, dass der einzelne Benutzer nicht der erste Benutzer / Prozess ist, der eine Verbindung herstellt.

Nick Winstanley
quelle