risposta-alla-domanda-sullo-sviluppo-web-bd.com

Esci dalla modalità utente singolo

Attualmente, il mio database è in modalità Utente singolo. Quando provo ad espandere il database, ottengo 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 collegato ad esso.

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

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

Un'eccezione non gestita è stata generata 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 di eccezioni di seguito.

Mi sembra che la modalità utente singolo stia causando questo.

173
Liondancer

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 l'oggetto Explorer sia puntato su un database di sistema come master.

Secondo, esegui uno sp_who2 e trova tutte le connessioni al database 'my_db'. Uccidete tutte le connessioni facendo KILL { session id } dove ID di sessione è il SPID elencato da sp_who2.

In terzo luogo, apri una nuova finestra di query.

Esegui il seguente codice.

-- Start in master
USE MASTER;

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

Vedi il mio articolo del blog sulla gestione dei file di database. Questo è stato scritto per spostare i file, ma la gestione degli utenti è la stessa.

323
CRAFTY DBA

Per prima cosa, trova e KILL tutti i processi che sono attualmente in esecuzione.

Quindi, eseguire il seguente T-SQL per impostare il database in modalità MULTI_USER.

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
31
Sathish

Per uscire dalla modalità Utente singolo, prova:

ALTER DATABASE [my_db] SET MULTI_USER

Per tornare alla modalità Utente singolo, puoi utilizzare:

ALTER DATABASE [my_db] SET SINGLE_USER

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

screenshot of options page of sql server

14
Tomas

Ho provato questo funziona

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

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');
8
Geri Reshef

Quanto segue ha funzionato per me:

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

Premere CTRL + 1

trova il processo che blocca il tuo database. Cerca nella colonna dbname per il tuo db e nota lo spid. Ora devi eseguire quella dichiarazione:

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

Non sono sicuro se questo aiuti qualcuno, ma ho avuto lo stesso problema e non sono riuscito a trovare il processo che mi tratteneva. Ho chiuso SSMS e ho interrotto tutti i servizi colpendo l'istanza locale. Poi, una volta rientrato e ho eseguito il exec sp_who2, mi ha mostrato il colpevole. Ho ucciso il processo e sono riuscito a far funzionare il Multi_User, quindi a riavviare i servizi. Avevamo IIS che lo colpiva ogni pochi minuti/secondi cercando determinati pacchetti.

5
Bindum

Usa questo Script

exec sp_who

Trova la colonna dbname e spid

ora esegui

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

Ho incontrato lo stesso problema stamattina. Si è rivelato essere un problema semplice. Ho avuto una finestra di query aperta che è stata impostata sul database utente singolo nell'Explorer dell'oggetto. La procedura sp_who2 memorizzata non mostrava la connessione. Una volta chiuso, sono stato in grado di impostarlo

3
Mysti

Un'altra opzione è:

  • eseguire ALTER DATABASE [Your_Db] SET MULTI_USER
3
testpattern

Nel caso in cui qualcuno si imbatta in questo thread, ecco una soluzione a prova di proiettile per SQL Server bloccato in modalità utente singolo

- Ottieni l'ID di processo (spid) della connessione che devi uccidere
- Sostituire '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

- Esegui quindi quanto segue e sostituisci [spid] e [DBName] con valori corretti

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

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

Aggiunta a Risposta di Jespers , per essere ancora più efficace:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH utilizza DEADLOCK_PRIORITY di 5.

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

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

È possibile che tu debba eseguire ALTER DATABASE più di una volta, (ma Jesper lo fa). 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
2
Roy Latham

Oggi ho affrontato lo stesso problema in cui il mio database è stato modificato dalla modalità Multi User a Single User 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 di query di Sql Server:

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

Questo comando ha cambiato il DB da Single user a Multi User e successivamente, sono riuscito a pubblicare con successo.

2
Vivek

Anche io mi imbatto nello stesso problema, non riesco a trovare connessioni attive a my_db per ucciderlo, ma continua a mostrare lo stesso errore. Finisco per disconnettere tutte le possibili connessioni SSMS per qualsiasi database sul server, creare una nuova connessione da SSMS e cambiarla 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 errore in SQL Server 2005!

1
Vijred

L'abbiamo appena sperimentato in SQL 2012. Un processo di replica è saltato quando abbiamo ucciso la sessione originale che l'ha impostata come utente singolo. Ma sp_who2 non ha mostrato quel nuovo processo collegato al DB. La chiusura di SSMS e la riapertura ci hanno permesso di vedere questo processo sul database e quindi abbiamo potuto ucciderlo e passare immediatamente alla modalità multiutente e questo ha funzionato.

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

1
Mr McGoo