Esci dalla modalità utente singolo


208

Attualmente, il mio database è in modalità utente singolo. Quando provo ad espandere il database, ricevo un errore:

Il database "my_db" non è accessibile. (ObjectExplorer)

Inoltre, quando provo a eliminare il database, ottengo l'errore:

Al momento non è possibile apportare modifiche allo stato o alle opzioni del database 'my_db'. Il database è in modalità utente singolo e un utente è attualmente connesso ad esso.

Come uscire dalla modalità utente singolo? Non ho nessun utente che utilizza questo database.

Quando provo a navigare nel mio sito con IIS, l'errore che ottengo è:

È stata generata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Le informazioni relative all'origine e alla posizione dell'eccezione possono essere identificate utilizzando la traccia dello stack delle eccezioni riportata di seguito.

Sento che la modalità monoutente sta causando questo.

Risposte:


381

SSMS in generale utilizza diverse connessioni al database dietro le quinte.

Sarà necessario interrompere queste connessioni prima di modificare la modalità di accesso.

Innanzitutto, assicurati che Esplora oggetti sia indirizzato a un database di sistema come master.

In secondo luogo, eseguire uno sp_who2 e trovare tutte le connessioni al database 'my_db'. Uccidere tutte le connessioni facendo KILL { session id }dove ID sessione è SPIDelencato da sp_who2.

In terzo luogo, aprire una nuova finestra di query.

Eseguire il codice seguente.

-- Start in master
USE MASTER;

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

Vedi il mio articolo sul blog sulla gestione dei file di database. Questo è stato scritto per lo spostamento di file, ma la gestione degli utenti è la stessa.


2
Quando ho usato il comando 'sp_who2', non ho visto alcun DBName collegato a 'my_db', non ho ucciso nessuna di quelle connessioni. Dopo aver eseguito i comandi ottengo lo stesso errore = [: 'Al momento non è possibile apportare modifiche allo stato o alle opzioni del database' my_db '. Il database è in modalità utente singolo e un utente è attualmente connesso ad esso. Messaggio 5069, livello 16, stato 1, riga 1 istruzione ALTER DATABASE non riuscita "
Liondancer

2
Ti sei assicurato di essere nel master, sp_who2 non mostra alcuna riga con database = my_db e il tuo esploratore di oggetti non si trova su my_db.
CRAFTY DBA,

1
Prova, disconnetti e connetti SSMS. Qualcosa deve essere collegato a quel database. L'altra opzione è connettersi con la console di amministrazione dedicata (DAC). Questo presuppone che tu sia un amministratore di sistema. Quindi uccidi lo spid offensivo.
CRAFTY DBA,

1
Inoltre, scarica il mio script usp_who2 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Eseguilo. Posiziona l'utilità in msdb.dbo.usp_who2. Salva i risultati di sp_who2 in una tabella in tempdb sotto il tuo ID utente, filtrando per il nome del database. Pubblica un'immagine dell'errore per aiutarci di più. In bocca al lupo.
CRAFTY DBA,

3
Trova lo SPID, utilizza quanto segue: Uccidi 100. Il 100 è il numero della sessione (SPID).
CRAFTY DBA,

45

Innanzitutto, trova e KILLtutti i processi che sono stati attualmente in esecuzione.

Quindi, eseguire quanto segue T-SQLper impostare il database in MULTI_USERmodalità.

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

Questa soluzione non funzionerebbe per me su SQL Server 2016. Se eseguo una query sui processi master..sys, visualizzo diverse righe, ma le righe vengono sostituite con un messaggio di errore che il database specificato è in modalità utente singolo, ecc.
youcantryreachingme

@youcantryreachingme, fornisci qui il messaggio di errore che hai visualizzato in SQL Server 2016 in modo che io / qualcun altro sia in grado di aiutarti a risolverlo.
Sathish,

lo stesso dell'OP: al momento non è possibile apportare modifiche allo stato o alle opzioni del database "my_db". Il database è in modalità utente singolo e un utente è attualmente connesso ad esso.
youcantryreachingme,

25

Per uscire dalla modalità Utente singolo, prova:

ALTER DATABASE [my_db] SET MULTI_USER

Per tornare alla modalità Utente singolo, è possibile utilizzare:

ALTER DATABASE [my_db] SET SINGLE_USER


1
Viene visualizzato l'errore: "Al momento non è possibile apportare modifiche allo stato o alle opzioni del database" my_db ". Il database è in modalità utente singolo e un utente è attualmente connesso ad esso. Messaggio 5069, livello 16, stato 1, riga 1 istruzione ALTER DATABASE non riuscita. "
Liondancer,

1
Puoi arrestare e riavviare il database (ovviamente se questo non è un sistema di produzione che interesserà altri utenti) e quindi riprovare il comando? E come indicato da @CRAFTYDBA, il comando deve essere eseguito dal database principale.
rsbarro,

1
Ho ampliato "Database di sistema" e ho fatto clic con il pulsante destro del mouse su "master", ho selezionato "Nuova query" e ho provato sia con i tuoi che con @ CRAFTYDBA. Stesso errore = [
Liondancer

1
Hai provato a interrompere e riavviare il database per interrompere la connessione esistente? È anche possibile cercare qui per più possibilità di uccidere le connessioni a un database: stackoverflow.com/questions/11620/...
rsbarro

2
Fare clic destro sul server nel riquadro sinistro e fare clic su "Disconnetti". Assicurati di avere una sola scheda SSMS aperta sul tuo database (fai clic con il pulsante destro del mouse e scegli "Disconnetti altre connessioni"), quindi esegui l'istruzione. Ogni esploratore di schede e oggetti è una connessione; puoi avere solo una connessione aperta al database (quindi, 'single-mode mode'). L'utente singolo dovrebbe essere "connessione singola" :) Buona fortuna
tommy_o

20
  1. Fare clic con il tasto destro del mouse sul database nella sezione database
  2. Seleziona "Proprietà"
  3. Seleziona la pagina "Opzioni"
  4. Scorri verso il basso "Altre opzioni" e modifica il campo "Limita accesso"

screenshot della pagina delle opzioni del server sql


1
Questa soluzione non funzionerebbe per me su SQL Server 2016. Il tentativo di accedere alle proprietà mostra un errore nel fatto che il database è in modalità utente singolo e ha già un utente connesso.
Youcantryreachingme,


8

Ho avuto lo stesso problema e il session_id da uccidere è stato trovato usando questa query:

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

Questo è stato perfetto Ho trovato il fastidioso SPID e ho riportato il DB online. Molte grazie!
Russell Speight,

8

Premi CTRL + 1

trova il processo che blocca il tuo database. Cerca nella colonna dbname il tuo db e osserva lo spid. Ora devi eseguire questa affermazione:

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

CTRL + 1 è una scorciatoia molto utile che non conoscevo!
Tyler Forsythe,

7

Per me ha funzionato:

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

Un'altra opzione è:

  • portare offline il database; in SMSS, fai clic con il pulsante destro del mouse sul database e scegli Porta offline, seleziona "Elimina tutte le connessioni"
  • correre ALTER DATABASE [Your_Db] SET MULTI_USER

Il mio non mi permetteva di portarlo offline, continuava a dire che era in modalità utente singolo e che un utente era connesso! (sì, ho spuntato "drop all connections"). Ho finito invece per staccare il database!
TabbyCool

Ho dovuto usare questa opzione perché non c'erano utenti connessi e il comando KILL non funzionava sulla connessione sa.
Derek K,

6

Nel caso in cui qualcuno si imbatta in questo thread, ecco una soluzione a prova di proiettile a SQL Server bloccata in MODALITÀ UTENTE SINGOLO

- Ottieni l'ID del processo (spid) della connessione che devi
interrompere - Sostituisci 'DBName' con il nome effettivo del 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'

In alternativa, puoi anche usare il comando "sp_who" per ottenere lo "spid" della connessione aperta:

- Oppure usa questo SP invece

exec sp_who

- Quindi eseguire quanto segue e sostituire [spid] e [DBName] con i valori corretti

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Grazie per le informazioni aggiuntive, ha fatto una grande differenza!
Daniel,

5

Non sono sicuro che questo aiuti qualcuno, ma ho avuto lo stesso problema e non sono riuscito a trovare il processo che mi stava trattenendo. Ho chiuso SSMS e ho interrotto tutti i servizi colpendo l'istanza locale. Poi una volta rientrato e ho eseguito il comando exec sp_who2, mi ha mostrato il colpevole. Ho interrotto il processo e sono riuscito a far funzionare Multi_User, quindi ho riavviato i servizi. Abbiamo avuto IIS a colpirlo ogni pochi minuti / secondi alla ricerca di determinati pacchetti.


3

Ho riscontrato lo stesso problema questa mattina. Si è rivelato essere un problema semplice. Avevo una finestra di query aperta che era impostata sul database utente singolo in Esplora oggetti. La procedura memorizzata sp_who2 non ha mostrato quindi la connessione. Una volta chiuso, sono stato in grado di impostarlo su


3

Aggiungendo alla risposta di Jespers , per essere ancora più efficace:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHusi DEADLOCK_PRIORITYdi 5.

Quello che sta succedendo è che gli altri processi ottengono una crepa nel database e, se il processo ha un valore inferiore DEADLOCK_PRIORITY, allora perde la corsa.

Ciò evita di trovare e uccidere l'altro spid (che potrebbe essere necessario eseguire più volte).

È possibile che tu debba correre ALTER DATABASEpiù di una volta (ma lo fa Jesper). Codice modificato:

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

3

Usa questo script

exec sp_who

Trova la colonna dbname e spid

ora esegui

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

Oggi ho affrontato lo stesso problema in cui il mio database è stato cambiato dalla modalità multiutente alla modalità utente singolo e questo alla fine mi ha impedito di pubblicare il database.

Per risolvere questo problema, ho dovuto chiudere tutte le istanze di Visual Studio ed eseguire il comando seguente nella finestra delle query di SQL Server -

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

Questo comando ha cambiato il DB da Utente singolo a Utente multiplo e, successivamente, sono stato in grado di pubblicare con successo.


1

Anche io mi imbatto nello stesso problema, non riesco a trovare connessioni attive a my_db per ucciderlo ma mostra ancora lo stesso errore. Finisco per disconnettere tutte le possibili connessioni SSMS per qualsiasi database sul Server, creo una nuova connessione da SSMS e la cambio in Multiutente.

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

Nota: questo sembra essere un possibile bug in SQL Server 2005!


1

L'abbiamo appena sperimentato in SQL 2012. È iniziato un processo di replica quando abbiamo interrotto la sessione originale che lo ha impostato su singolo utente. Ma sp_who2 non ha mostrato quel nuovo processo collegato al DB. La chiusura di SSMS e la riapertura ci hanno quindi permesso di vedere questo processo sul database e quindi abbiamo potuto ucciderlo e passare immediatamente alla modalità multiutente e ha funzionato.

Non riesco a capire la logica dietro questo, ma sembra essere un bug in SSMS e si sta ancora manifestando in SQL 2012.


0

usa il maestro

PARTIRE

selezionare d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame da sysprocesses p interno sysdatabase d su p.dbid = d.dbid dove d.name = 'nome database'

kill 568 - kill spid

Nome database ALTER DATABASE '

SET MULTI_USER vai

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.