Beenden Sie den Einzelbenutzermodus

208

Derzeit befindet sich meine Datenbank im Einzelbenutzermodus. Wenn ich versuche, meine Datenbank zu erweitern, wird folgende Fehlermeldung angezeigt:

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

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

Änderungen am Status oder an den Optionen der Datenbank 'my_db' können derzeit nicht vorgenommen werden. 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 Site mit IIS zu durchsuchen, wird folgender Fehler angezeigt:

Während der Ausführung der aktuellen Webanforderung wurde eine nicht behandelte Ausnahme generiert. Informationen zum Ursprung und Ort der Ausnahme können mithilfe der folgenden Ausnahmestapelverfolgung identifiziert werden.

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

Löwentänzerin
quelle

Antworten:

381

SSMS verwendet im Allgemeinen hinter den Kulissen mehrere Verbindungen zur Datenbank.

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

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

Führen Sie zweitens sp_who2 aus und suchen Sie alle Verbindungen zur Datenbank 'my_db'. Beenden Sie alle Verbindungen, indem Sie tun, KILL { session id }wo die Sitzungs-ID von SPIDaufgeführt ist sp_who2.

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

Siehe meinen Blog-Artikel zum Verwalten von Datenbankdateien. Dies wurde für das Verschieben von Dateien geschrieben, aber die Benutzerverwaltung ist dieselbe.

CRAFTY DBA
quelle
2
Als ich den Befehl 'sp_who2' verwendet habe, habe ich keinen DBName gesehen, der mit 'my_db' verbunden ist. Ich habe keine dieser Verbindungen beendet. Nachdem ich die Befehle ausgeführt habe, erhalte ich den gleichen Fehler = [: 'Änderungen am Status oder an den Optionen der Datenbank' my_db 'können derzeit nicht vorgenommen werden. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden. Nachricht 5069, Ebene 16,
Status
2
Haben Sie sichergestellt, dass Sie sich im Master befinden, zeigt sp_who2 keine Zeilen mit database = my_db an und Ihr Objekt-Explorer befindet sich nicht in my_db.
CRAFTY DBA
1
Versuchen Sie, SSMS zu trennen und zu verbinden. Es muss etwas mit dieser Datenbank verbunden sein. Die andere Option besteht darin, eine Verbindung mit der dedizierten Administratorkonsole (DAC) herzustellen. Dies setzt voraus, dass Sie ein Systemadministrator sind. Dann töte die beleidigende Spid.
CRAFTY DBA
1
Laden Sie auch mein usp_who2-Skript herunter ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Führ es aus. Das Dienstprogramm wird in msdb.dbo.usp_who2 abgelegt. Die Ergebnisse von sp_who2 werden in einer Tabelle in tempdb unter Ihrer Benutzer-ID gespeichert und nach dem Datenbanknamen gefiltert. Veröffentlichen Sie ein Bild des Fehlers, um uns mehr zu helfen. Viel Glück.
CRAFTY DBA
3
Suchen Sie die SPID und verwenden Sie Folgendes: Kill 100. Die 100 ist die Nummer der Sitzung (SPID).
CRAFTY DBA
45

Suchen Sie zunächst KILLalle aktuell ausgeführten Prozesse.

Führen Sie dann die folgenden T-SQLSchritte aus, um die Datenbank in den MULTI_USERModus 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
Sathish
quelle
Diese Lösung würde unter SQL Server 2016 für mich nicht funktionieren. Wenn ich master..sysprocesses abfrage, werden mehrere Zeilen angezeigt, aber dann werden die Zeilen durch eine Fehlermeldung ersetzt, dass sich die angegebene Datenbank im Einzelbenutzermodus befindet usw.
youcantryreachingme
@youcantryreachingme, bitte geben Sie hier die Fehlermeldung ein, die Sie in SQL Server 2016 erhalten haben, damit ich / jemand anderes Ihnen bei der Lösung helfen kann.
Sathish
das gleiche wie im OP: Änderungen am Status oder an den Optionen der Datenbank 'my_db' können derzeit nicht vorgenommen werden. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden.
youcantryreachingme
25

Versuchen Sie Folgendes, um den Einzelbenutzermodus zu verlassen:

ALTER DATABASE [my_db] SET MULTI_USER

Um in den Einzelbenutzermodus zurückzukehren, können Sie Folgendes verwenden:

ALTER DATABASE [my_db] SET SINGLE_USER

rsbarro
quelle
1
Ich erhalte die Fehlermeldung: 'Änderungen am Status oder an den Optionen der Datenbank' my_db 'können derzeit nicht vorgenommen werden. Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden. Nachricht 5069, Ebene 16, Status 1, Zeile 1 ALTER DATABASE-Anweisung fehlgeschlagen. '
Löwentänzer
1
Können Sie die Datenbank stoppen und neu starten (offensichtlich, wenn dies kein Produktionssystem ist, das andere Benutzer betrifft) und dann den Befehl wiederholen? Und wie @CRAFTYDBA sagte, sollte der Befehl aus der Master-Datenbank ausgeführt werden.
Rsbarro
1
Ich habe 'Systemdatenbanken' erweitert und mit der rechten Maustaste auf 'Master' geklickt und 'Neue Abfrage' ausgewählt und sowohl in Ihren als auch in @ CRAFTYDBAs Commamds versucht. Gleicher Fehler = [
Liondancer
1
Haben Sie versucht, die Datenbank zu stoppen und neu zu starten, um die vorhandene Verbindung zu beenden? Sie können hier auch nach weiteren Möglichkeiten suchen, um Verbindungen zu einer Datenbank zu beenden
rsbarro
2
Klicken Sie mit der rechten Maustaste auf den Server im linken Bereich und klicken Sie auf "Verbindung trennen". Stellen Sie sicher, dass nur eine SSMS-Registerkarte in Ihrer Datenbank geöffnet ist (klicken Sie mit der rechten Maustaste und wählen Sie "Andere Verbindungen trennen"), und führen Sie dann die Anweisung aus. Jeder Registerkarten- und Objekt-Explorer ist eine Verbindung. Sie können nur eine Verbindung zur Datenbank öffnen (daher "Einzelbenutzermodus"). Einzelbenutzer sollte 'Einzelverbindung' sein :) Viel Glück
tommy_o
20
  1. Klicken Sie mit der rechten Maustaste auf Ihre Datenbank im Bereich Datenbanken
  2. Wählen Sie "Eigenschaften"
  3. Wählen Sie die Seite "Optionen"
  4. Scrollen Sie nach unten zu "Andere Optionen" und ändern Sie das Feld "Zugriff einschränken"

Screenshot der Optionsseite des SQL Servers

Tomas
quelle
1
Diese Lösung funktioniert unter SQL Server 2016 nicht. Beim Versuch, auf Eigenschaften zuzugreifen, wird der Fehler angezeigt, dass sich die Datenbank im Einzelbenutzermodus befindet und bereits ein Benutzer verbunden ist.
youcantryreachingme
15

Ich habe versucht, das funktioniert

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
Elanchezhian Narayanasamy
quelle
8

Ich hatte das gleiche Problem und die zu tötende Sitzungs-ID wurde mithilfe dieser Abfrage gefunden:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Geri Reshef
quelle
Das war perfekt. Fand die nervige SPID und brachte die DB wieder online. Vielen Dank!
Russell Speight
8

Drücken Sie STRG + 1

Suchen Sie den Prozess, der Ihre Datenbank sperrt. Suchen Sie in der Spalte Datenbankname nach Ihrer Datenbank und notieren Sie die Spid. Jetzt müssen Sie diese Anweisung ausführen:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
greg121
quelle
STRG + 1 ist eine sehr praktische Verknüpfung, von der ich nichts wusste!
Tyler Forsythe
7

Folgendes hat bei mir 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
Jesper Lehtinen
quelle
7

Eine andere Option ist:

  • Schalten Sie die Datenbank offline. Klicken Sie in SMSS mit der rechten Maustaste auf Datenbank und wählen Sie Offline nehmen. Aktivieren Sie "Alle Verbindungen trennen".
  • Lauf ALTER DATABASE [Your_Db] SET MULTI_USER
Testmuster
quelle
Meins ließ mich nicht offline schalten, es wurde nur immer wieder gesagt, dass es sich im Einzelbenutzermodus befindet und dass ein Benutzer verbunden ist! (Ja, ich habe "Alle Verbindungen trennen" angekreuzt). Ich habe stattdessen die Datenbank getrennt!
TabbyCool
Ich musste diese Option verwenden, da keine Benutzer verbunden waren und der Befehl KILL bei der sa-Verbindung nicht funktionieren würde.
Derek K
6

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 SINGLE USER MODE steckt

- Holen Sie sich die Prozess-ID (Spid) der Verbindung, die Sie beenden müssen.
- 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 diesen SP

exec sp_who

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

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Einar Larusson
quelle
Vielen Dank für die zusätzlichen Informationen, die einen großen Unterschied gemacht haben!
Daniel
5

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 treffen. Als ich dann wieder hineinging und den exec sp_who2 ausführte, zeigte er mir den Schuldigen. Ich habe den Prozess abgebrochen und konnte den Multi_User zum Laufen bringen und dann die Dienste neu starten. Wir ließen IIS alle paar Minuten / Sekunden nach bestimmten Paketen suchen.

Bindum
quelle
3

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. Nachdem ich es geschlossen hatte, konnte ich es einstellen

Mysti
quelle
3

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

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHVerwendungen DEADLOCK_PRIORITYvon 5.

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

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

Es ist möglich, dass Sie ALTER DATABASEmehr als einmal laufen müssen (aber Jesper macht 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
Roy Latham
quelle
3

Verwenden Sie dieses Skript

exec sp_who

Suchen Sie den Datenbanknamen und die Spid-Spalte

jetzt ausführen

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

Heute hatte ich das gleiche Problem, bei dem meine Datenbank vom Mehrbenutzer- in den Einzelbenutzermodus geändert wurde, und dies hinderte mich schließlich daran, 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.

Vivek
quelle
1

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 der gleiche 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 Mehrbenutzer.

-- 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!

Vijred
quelle
1

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

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

Herr McGoo
quelle
0

benutze Master

GEHEN

Wählen Sie d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame aus sysprocesses p inner join sysdatabases d auf p.dbid = d.dbid wobei d.name = 'database name'

töte 568 - töte Spid

ALTER DATABASE Datenbankname '

SET MULTI_USER gehen

ARYA
quelle