it-swarm.com.de

Beenden Sie den Einzelbenutzermodus

Derzeit befindet sich meine Datenbank im Einzelbenutzermodus. Wenn ich versuche, meine Datenbank zu erweitern, erhalte ich eine Fehlermeldung:

Auf die Datenbank 'my_db' kann nicht zugegriffen werden. (ObjectExplorer)

Wenn ich versuche, die Datenbank zu löschen, wird der folgende Fehler angezeigt:

Änderungen am Status oder an den Optionen der Datenbank 'my_db' sind derzeit nicht möglich. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden.

Wie verlasse ich den Einzelbenutzermodus? Ich habe keinen Benutzer, der diese Datenbank verwendet.

Wenn ich versuche, meine Website mit IIS zu durchsuchen, wird der folgende Fehler angezeigt:

Während der Ausführung der aktuellen Webanforderung wurde eine nicht behandelte Ausnahme generiert. Informationen zu Ursprung und Speicherort der Ausnahme können mithilfe der folgenden Ablaufverfolgung des Ausnahmestapels identifiziert werden.

Ich habe das Gefühl, dass der Einzelbenutzermodus dies verursacht.

183
Liondancer

SSMS verwendet im Allgemeinen mehrere Verbindungen zur Datenbank im Hintergrund.

Sie müssen diese Verbindungen trennen, bevor Sie den Zugriffsmodus ändern können.

Stellen Sie zunächst sicher, dass der Objekt-Explorer auf eine Systemdatenbank wie master verweist.

Führen Sie anschließend sp_who2 aus und suchen Sie alle Verbindungen zur Datenbank 'my_db'. Beenden Sie alle Verbindungen, indem Sie KILL { session id } ausführen, wobei die Sitzungs-ID die SPID ist, die von sp_who2 aufgelistet wird.

Drittens öffnen Sie ein neues Abfragefenster.

Führen Sie den folgenden Code aus.

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

Weitere Informationen zum Verwalten von Datenbankdateien finden Sie in meinem Blogartikel . Dies wurde für das Verschieben von Dateien geschrieben, die Benutzerverwaltung ist jedoch dieselbe.

335
CRAFTY DBA

Suchen Sie zuerst und KILL alle Prozesse, die aktuell ausgeführt wurden.

Führen Sie dann den folgenden T-SQL aus, um die Datenbank in den MULTI_USER -Modus zu versetzen.

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
34
Sathish

Versuchen Sie Folgendes, um den Einzelbenutzermodus zu beenden:

ALTER DATABASE [my_db] SET MULTI_USER

Um wieder in den Einzelbenutzermodus zu wechseln, können Sie Folgendes verwenden:

ALTER DATABASE [my_db] SET SINGLE_USER

22
rsbarro
  1. Klicken Sie mit der rechten Maustaste auf Ihre Datenbank im Abschnitt "Datenbanken"
  2. Wählen Sie "Eigenschaften"
  3. Wählen Sie die Seite "Optionen"
  4. Scrollen Sie nach unten und ändern Sie das Feld "Zugriff einschränken"

screenshot of options page of sql server

15
Tomas

Ich habe versucht, das funktioniert

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

Ich hatte das gleiche Problem und die zu tötende session_id wurde mit folgender Abfrage gefunden:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
7
Geri Reshef

Folgendes hat für mich funktioniert:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
7
Jesper Lehtinen

Drücken Sie STRG + 1

finden Sie den Prozess, der Ihre Datenbank sperrt. Suchen Sie in der Spalte dbname nach Ihrer db und notieren Sie sich die spid. Nun müssen Sie diese Anweisung ausführen:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
6
greg121

Ich bin mir nicht sicher, ob dies jemandem hilft, aber ich hatte das gleiche Problem und konnte den Prozess, der mich aufhielt, nicht finden. Ich habe SSMS geschlossen und alle Dienste gestoppt, die auf die lokale Instanz zutreffen. Als ich dann wieder reinging und den exec sp_who2 ausführte, zeigte er mir den Täter. Ich habe den Prozess abgebrochen und konnte den Multi_User zum Funktionieren bringen und dann die Dienste neu starten. Wir mussten IIS alle paar Minuten/Sekunden nach bestimmten Paketen suchen.

5
Bindum

Nur für den Fall, dass jemand auf diesen Thread stößt, finden Sie hier eine kugelsichere Lösung für SQL Server, die im EINZELNUTZER-MODUS steckt

- Rufen Sie die Prozess-ID (spid) der Verbindung ab, die Sie beenden möchten
- Ersetzen Sie 'DBName' durch den tatsächlichen Namen der DB

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

Alternativ können Sie auch den Befehl "sp_who" verwenden, um die "spid" der offenen Verbindung abzurufen:

- Oder verwenden Sie stattdessen dieses SP

exec sp_who

- Führen Sie dann Folgendes aus und ersetzen Sie [spid] und [DBName] durch die korrekten Werte

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
3
Einar Larusson

Verwenden Sie dieses Skript

exec sp_who

Suchen Sie die Spalte dbname und spid

jetzt ausführen

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;
3
Aminur Rahman

Ich bin heute Morgen auf dasselbe Problem gestoßen. Es stellte sich als einfaches Problem heraus. Ich hatte ein Abfragefenster geöffnet, das im Objekt-Explorer auf die Einzelbenutzerdatenbank eingestellt war. Die gespeicherte Prozedur sp_who2 zeigte dann keine Verbindung an. Sobald ich es geschlossen hatte, konnte ich es auf einstellen

3
Mysti

Eine andere Möglichkeit ist:

  • führe ALTER DATABASE [Your_Db] SET MULTI_USER aus
3
testpattern

Hinzufügen zu Jespers Antwort , um noch effektiver zu sein:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH verwendet DEADLOCK_PRIORITY von 5.

Was passiert ist, dass die anderen Prozesse einen Riss in der Datenbank bekommen und wenn Ihr Prozess einen niedrigeren DEADLOCK_PRIORITY hat, dann verliert er das Rennen.

Dies vermeidet das Auffinden und Töten der anderen Spinne (was möglicherweise mehrmals durchgeführt werden muss).

Es ist möglich, dass Sie ALTER DATABASE mehr als einmal ausführen müssen (aber Jesper tut das). Geänderter Code:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
2
Roy Latham

Heute stand ich vor dem gleichen Problem, bei dem meine Datenbank vom Mehrbenutzermodus in den Einzelbenutzermodus geändert wurde und dies mich schließlich daran hinderte, die Datenbank zu veröffentlichen.

Um dieses Problem zu beheben, musste ich alle Visual Studio-Instanzen schließen und den folgenden Befehl im SQL Server-Abfragefenster ausführen:

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

Dieser Befehl hat die Datenbank von Einzelbenutzer auf Mehrbenutzer geändert, und danach konnte ich erfolgreich veröffentlichen.

2
Vivek

Selbst wenn ich auf dasselbe Problem stoße, kann ich keine aktiven Verbindungen zu my_db finden, um es zu beenden, aber es wird immer noch derselbe Fehler angezeigt. Am Ende trenne ich alle möglichen SSMS-Verbindungen für eine Datenbank auf dem Server, erstelle eine neue Verbindung von SSMS und ändere sie in Multi-User.

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

Hinweis: Dies scheint ein möglicher Fehler in SQL Server 2005 zu sein!

1
Vijred

Wir haben dies gerade in SQL 2012 erlebt. Ein Replikationsprozess hat eingesetzt, als wir die ursprüngliche Sitzung beendet haben, die sie auf einen einzelnen Benutzer festgelegt hat. Aber sp_who2 hat diesen neuen Prozess, der an die Datenbank angehängt ist, nicht angezeigt. Das Schließen von SSMS und das erneute Öffnen ermöglichten es uns, diesen Prozess in der Datenbank zu sehen. Anschließend konnten wir ihn beenden und sofort in den Multi-User-Modus wechseln, und das funktionierte.

Ich kann die Logik dahinter nicht herausfinden, aber es scheint ein Fehler in SSMS zu sein und manifestiert sich immer noch in SQL 2012.

1
Mr McGoo