Stellen Sie die Datenbank vom SINGLE USER-Modus auf MULTI USER

188

Ich benötige Hilfe beim Einstellen einer Datenbank, die im SINGLE_USERModus wiederhergestellt wurde MULTI_USER. Jedes Mal, wenn ich renne

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Ich bekomme diesen Fehler:

Änderungen am Status oder an den Optionen der Datenbank 'BARDABARD' können derzeit nicht vorgenommen werden.

Die Datenbank befindet sich im Einzelbenutzermodus und ein Benutzer ist derzeit mit ihr verbunden.

Es muss sich im Nicht- SINGLE_USERModus befinden, um es in einen anderen Modus zu versetzen, aber ich kann die Datenbank in keinem anderen Modus einstellen, solange es sich um einen SINGLE_USERModus handelt.

Rahna1970418
quelle

Antworten:

113

Der "Benutzer ist derzeit damit verbunden" ist möglicherweise das SQL Server Management Studio-Fenster selbst. Versuchen Sie, die Master-Datenbank auszuwählen und die ALTERAbfrage erneut auszuführen.

paul
quelle
1
Hinzufügen: Es scheint, dass ein Abfragefenster an die Datenbank angehängt wird, obwohl eine andere Datenbank (z. B. master) in der Dropdown- Liste Symbolleiste Verfügbare Datenbanken ausgewählt ist , wenn das Abfragefenster aktiv ist. Wenn es Ihnen weiterhin Kopfschmerzen bereitet, schließen Sie alle anderen Abfragefenster und wählen Sie eine unschuldige Systemdatenbank wie masteroder tempdbin der Dropdown-Liste in dem Fenster aus, das Sie noch haben.
Ein Lebenslauf vom
Versuchen Sie, die Datenbank zu trennen und erneut eine Verbindung in Microsoft SQL Server Management Studio herzustellen. Führen Sie dann den Befehl erneut aus.
Isuru Madusanka
Der erste Kommentar ist sehr hilfreich und könnte tatsächlich zur Antwort hinzugefügt werden. Ich konnte die Abfrage nicht ausführen, bevor ich alle anderen Abfragen geschlossen habe.
user2216
87

Diese Fehlermeldung bedeutet im Allgemeinen, dass andere Prozesse mit der Datenbank verbunden sind. Versuchen Sie dies auszuführen, um zu sehen, welche verbunden sind:

exec sp_who

Das gibt Ihnen den Prozess zurück und dann sollten Sie in der Lage sein:

kill [XXX]

Wo [xxx] ist der spidProzess, den Sie zu töten versuchen.

Dann können Sie Ihre obige Anweisung ausführen.

Viel Glück.

sgeddes
quelle
kill [xxx] wird den Prozess los, aber wenn ich versuche, meinen Befehl auszuführen, kommt er zurück!
Colmde
73

Sie können die Option hinzufügen, Ihre Änderung sofort zurückzusetzen.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
LG1
quelle
1
Was macht ROLLBACK IMMEDIATEgenau?
Dakab
3
@dakab Erzwingt, dass alle ausstehenden Transaktionen sofort ab dem Beginn der ALTER DATABASETransaktion der Anweisung zurückgesetzt werden. Im Gegensatz dazu wird WITH ROLLBACK X SECONDSdarauf gewartet , dass die Transaktionen beendet werden, bevor sie zum Rollback gezwungen werden oder auf unbestimmte Zeit gewartet werden, bis keine ausstehenden Transaktionen mehr vorhanden sind (was meiner Meinung nach die Standardeinstellung ist, aber kann im Moment nicht im Dokument gefunden werden). Es ist das Äquivalent von "Stoppen Sie alles, was Sie gerade tun, und tun Sie dies."
Bacon Bits
39

SQL Server 2012:

Klicken Sie mit der rechten Maustaste auf DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_userund klicken Sie auf OK.

Voila!

Div2504
quelle
5
Nicht wirklich, das habe ich erhalten, als ich Ihre Lösung ausprobiert habe: / "Datenbank 'XXX' ist bereits geöffnet und kann jeweils nur einen Benutzer haben. (Microsoft SQL Server, Fehler: 924)"
Krzysztof Wolny
1
Zusätzlich in SQL 2008R2 bestätigt.
Codo-Sapien
Beste Antwort, auch in Fällen, in denen Sie keine Berechtigung zur Verwendung der KILL-Anweisung haben
Marco Marsala
22

Ich hatte das gleiche Problem und es wurde durch die folgenden Schritte behoben - Referenz: http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and.html

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 56 --=> kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO
Azadeh Khojandi
quelle
13

Das hat bei mir gut funktioniert.

Schritt 1. Klicken Sie mit der rechten Maustaste auf das Datenbankmodul, klicken Sie auf Aktivitätsmonitor und sehen Sie, welcher Prozess eine Verbindung hat. Töte diesen bestimmten Benutzer und führe die Abfrage sofort aus.

Schritt 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

und aktualisieren Sie die Datenbank.

Sunil Guragol
quelle
9

Ich hatte tatsächlich ein Problem, bei dem meine Datenbank durch die Prozesse und eine Racebedingung mit ihnen ziemlich gesperrt war. Als ich einen Befehl aktualisiert bekam und sie ihn wieder gesperrt hatten, musste ich die folgenden Befehle hintereinander ausführen in SSMS und habe mich offline geschaltet und von dort aus habe ich meine Wiederherstellung durchgeführt und bin wieder gut online gegangen. Die beiden Abfragen waren:

Zuerst lief:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

Dann unmittelbar danach (im zweiten Abfragefenster):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

Habe getan, was ich brauchte und habe es dann wieder online gebracht. Vielen Dank an alle, die diese Stücke geschrieben haben, damit ich mein Problem kombinieren und lösen kann.

Shane G.
quelle
7

Es ist möglicherweise am besten, sich direkt am Server anzumelden, anstatt SQL Management Studio zu verwenden

Stellen Sie sicher, dass das Konto, als das Sie sich anmelden, dbowner für die Datenbank ist, die Sie auf MULTI_USER setzen möchten. Melden Sie sich als sa an (mithilfe der SQL Server-Authentifizierung), wenn Sie können

Wenn Ihre Datenbank von IIS verwendet wird, stoppen Sie die Website und den App-Pool, der sie verwendet. Dies ist möglicherweise der Prozess, der verbunden ist und Sie daran hindert, auf MULTI_USER zu setzen

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

Lesen Sie hier, wenn Sie immer noch Probleme haben:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

ALS LETZTE ALTERNATIVE - Wenn Sie alles oben Genannte ausprobiert haben und verzweifelt sind, können Sie versuchen, die SQL Server-Instanz zu stoppen und erneut zu starten

Chris Halcrow
quelle
5

Ich habe gerade mit folgenden Schritten behoben, es kann Ihnen helfen.

Schritt 1

Klicken Sie mit der rechten Maustaste auf die Einzelbenutzerdatenbank


Schritt 2

offline schalten


Schritt 3

Verbindung trennen und offline schalten


Schritt 4

Online nehmen


Schritt: 5

Führen Sie dann die folgende Abfrage aus.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Genießen...!

Rikin Patel
quelle
2

Der folgende Code hat bei mir funktioniert, als ich die spezifische SPID nicht kannte, die zum Wechseln in den singleuserModus verwendet wurde.

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO
Jaypal Reddy
quelle
1
  1. Versuchte alles hat nicht funktioniert
  2. Melden Sie sich remote bei diesem Server an, da alle Verbindungen unterbrochen werden
  3. Führen Sie den folgenden Code mehrmals aus, bis er abgeschlossen ist und kein "Killing Process" -Test mehr durchgeführt wird
  4. Reaktivieren Sie es erneut mit dem Code unter dem folgenden Code

benutze master GO deklariere @sql als varchar (20), @spid als int

Wählen Sie @spid = min (spid) aus master..sysprocesses aus, wobei dbid = db_id ('DB_NAME') und spid! = @@ spid

while (@spid ist nicht null) beginnt mit dem Drucken von 'Killing process' + cast (@spid als varchar) + '...' set @sql = 'kill' + cast (@spid als varchar) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

dann, um es lebend zurückzubringen

ALTER DATABASE DB_NAME SET MULTI_USER; GEHEN

Bishoy Hanna
quelle
1

Das hat bei mir gut funktioniert

  1. Machen Sie ein Backup
  2. Erstellen Sie eine neue Datenbank und stellen Sie die Sicherung wieder her
  3. Dann Eigenschaften> Optionen> [Bildlauf nach unten] Status> RestrictAccess> Wählen Sie Multi_user und klicken Sie auf OK
  4. Löschen Sie die alte Datenbank

Hoffe diese Arbeit für alle Danke Ramesh Kumar

Ramesh Kumar
quelle
1

Wenn das oben genannte nicht funktioniert, suchen Sie den Anmeldenamen des Spids und deaktivieren Sie ihn unter Sicherheit - Anmeldungen

Aileen Gregg
quelle
1

Sie konnten dies nicht tun, da die Datenbank im Einzelmodus war. Vor allem in Ordnung, aber Sie sollten Folgendes wissen: Wenn Sie das SQL Management Studio geöffnet haben, kennt es keinen Benutzer in der Datenbank, aber wenn Sie auf die Datenbank klicken, werden Sie als einzelner Benutzer betrachtet und Ihr Befehl funktioniert nicht. Tun Sie das einfach: Schließen Sie das Management Studio und öffnen Sie es erneut. Neues Abfragefenster ohne Auswahl einer Datenbank Schreiben Sie das Befehlsskript.

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

mach f5 wolla alles ok!

Hamit YILDIRIM
quelle
0

Ich habe das Problem leicht gelöst

  1. Klicken Sie mit der rechten Maustaste auf den Datenbanknamen und benennen Sie ihn um

  2. Klicken Sie nach dem Ändern mit der rechten Maustaste auf den Datenbanknamen -> Eigenschaften -> Optionen -> gehen Sie zum Ende des Bildlaufs RestrictAccess (SINGLE_USER zu MULTI_USER).

  3. Jetzt können Sie die Datenbank wieder in Ihren alten Namen umbenennen.

Vamsi
quelle
0

Bei mehr als drei Gelegenheiten mit SQL Server 2014 wurde eine Datenbank in den Einzelbenutzermodus konvertiert, ohne dass ich etwas geändert habe. Es muss irgendwie während der Datenbankerstellung aufgetreten sein. Alle oben genannten Methoden haben nie funktioniert, da ich immer den Fehler erhalten habe, dass sich die Datenbank im Einzelbenutzermodus befindet und keine Verbindung hergestellt werden kann.

Ich musste nur den SQL Server-Windows-Dienst neu starten. Dadurch konnte ich eine Verbindung zur Datenbank herstellen und die erforderlichen Änderungen vornehmen oder die Datenbank löschen und neu beginnen.

epak96
quelle
0

Gehen Sie einfach zu den Datenbankeigenschaften und ändern Sie den SINGLE USER-Modus in MULTI USER

Geben Sie hier die Bildbeschreibung ein

HINWEIS: Wenn dies bei Ihnen nicht funktioniert, führen Sie eine Db-Sicherung durch, stellen Sie sie wieder her und führen Sie die oben beschriebene Methode erneut aus

* Single = SINGLE_USER

Multiple = MULTI_USER

Eingeschränkt = RESTRICTED_USER

Hassan Saeed
quelle
Wie unterscheidet sich dies von der Abfrage, die OP verwendet?
Squazz
Ja, beide funktionieren gleich. Dies ist dasselbe wie anstelle der CREATE-Tabellenabfrage. Wir haben den SQL Server-GUI-Tabellen-Designer verwendet, um eine Tabelle zu erstellen. BTS funktioniert beide gleich. Eine ist die Abfragemethode und die andere die GUI-Methode. benutze was immer du willst.
Hassan Saeed
OP gibt eindeutig an, dass die Abfrage zu einem Fehler führt. Wie Sie sagen, ist dies genau das Gleiche wie die Verwendung der Abfrage, auf die Sie überhaupt keine Antwort geben. Sie sind nur durcheinander und
ergänzen
0

Nach dem Aufrufen des Einzelbenutzermodus kann ein Client nur EINE Verbindung mit dem SQL Server herstellen. Denken Sie daran, dass "Object Explorer" eine (separate) Verbindung aufnimmt. Wenn Sie also versuchen, eine Mehrbenutzeranweisung in einer Abfrage auszuführen Im Fenster wird die Fehlermeldung angezeigt, dass Sie im Einzelbenutzermodus keine weitere Verbindung herstellen können.

Für mich war dies jedoch nicht das Problem. In meinem Fall gab es nur wenige automatisierte Prozesse, die dauerhaft (alle paar Sekunden) Verbindungen herstellten. Sobald ich die Datenbank in den Einzelbenutzermodus versetzte und mich selbst trennte, war einer von Die Prozesse haben die Verbindung hergestellt / belegt (bevor ich meinen Wiederherstellungsvorgang starten konnte). Sobald ich diese Verbindungen beenden würde - sie würden sich wieder verbinden und wenn ich den Befehl Wiederherstellen ausführen würde, würde ich den Fehler erhalten, dass die Verbindung bereits besetzt ist.

Um dies zu beheben, musste ich die killAnweisungen, Änderungen von User-ModeAnweisungen und RestoreOperationen in einem Abfragefenster schreiben und als ich sie alle auf einmal ausführte, voila !!! es funktionierte.

Hoffe das hilft anderen.

Eddie Kumar
quelle
0

Ich hatte Probleme mit einer lokalen Datenbank.

Ich konnte dieses Problem lösen, indem ich SQL Server stoppte, dann SQL Server startete und dann die SSMS-Benutzeroberfläche verwendete, um die DB-Eigenschaften in Multi_User zu ändern.

Die Datenbank ging in den "Einzelbenutzer" -Modus, als ich versuchte, eine Sicherung wiederherzustellen. Ich hatte vor dem Wiederherstellungsversuch keine Sicherung der Zieldatenbank erstellt (SQL 2017). das wird dich jedes Mal bekommen.

Stoppen Sie SQL Server, starten Sie SQL Server und führen Sie die oben genannten Skripte aus oder verwenden Sie die Benutzeroberfläche.

Hanzolo
quelle
0

Ich habe eine Weile nach der Lösung gegoogelt und schließlich die folgende Lösung gefunden:

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

Sie müssen diese Verbindungen trennen, bevor Sie den Zugriffsmodus ändern. (Ich habe es mit EXEC (@kill) gemacht; in der unten.)

Dann,

Führen Sie die folgende 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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Das sollte funktionieren. Viel Spaß beim Codieren !!

Vielen Dank!!

Trilok Pathak
quelle