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.
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.
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
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
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');
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
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;
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.
Usa questo Script
exec sp_who
Trova la colonna dbname e spid
ora esegui
kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;
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
Un'altra opzione è:
ALTER DATABASE [Your_Db] SET MULTI_USER
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
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
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.
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!
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.