Impostare il database dalla modalità SINGOLO UTENTE su MULTI UTENTE


189

Ho bisogno di aiuto con l'impostazione di un database che è stato ripristinato in SINGLE_USERmodalità su MULTI_USER. Ogni volta che corro

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Ottengo questo errore:

Al momento non è possibile apportare modifiche allo stato o alle opzioni del database "BARDABARD".

Il database è in modalità utente singolo e un utente è attualmente connesso ad esso.

Deve essere in non SINGLE_USERmodalità per impostarlo su un'altra modalità, ma non posso impostare il database in un'altra modalità mentre è SINGLE_USERmodalità.

Risposte:


114

L '"utente è attualmente connesso ad esso" potrebbe essere la stessa finestra di SQL Server Management Studio. Prova a selezionare il database principale ed eseguire ALTERnuovamente la query.


1
Aggiungendo a questo: sembra che una finestra di query possa essere collegata al database anche se qualche altro database (come master) è selezionato nel menu a discesa della barra degli strumenti Database disponibili quando la finestra di query è attiva. Se continua a causare mal di testa, chiudi tutte le altre finestre di query e seleziona alcuni database di sistema innocenti come mastero tempdbnel menu a discesa nell'unica finestra che ti è rimasta.
un CVn

Prova a disconnettere il DB e riconnetterti in microsoft SQL server management studio. Quindi eseguire nuovamente il comando.
Isuru Madusanka

Il primo commento è molto utile e potrebbe essere aggiunto alla risposta, in realtà. Non è stato possibile eseguire la query prima di aver chiuso tutte le altre query.
user2216

88

Questo messaggio di errore generalmente indica che ci sono altri processi collegati al DB. Prova a eseguirlo per vedere quali sono collegati:

exec sp_who

Questo ti restituirà il processo e quindi dovresti essere in grado di eseguire:

kill [XXX]

Dove [xxx] è spidil processo che stai tentando di uccidere.

Quindi è possibile eseguire la precedente dichiarazione.

In bocca al lupo.


kill [xxx] elimina il processo, ma quando provo a eseguire il mio comando, torna indietro!
Colmde,

74

È possibile aggiungere l'opzione per ripristinare immediatamente la modifica.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
Che cosa fa ROLLBACK IMMEDIATEesattamente?
Dakab,

3
@dakab Forza immediatamente il rollback di tutte le transazioni in sospeso a partire dall'inizio della ALTER DATABASEtransazione dell'estratto conto, al contrario delle WITH ROLLBACK X SECONDSquali attende il completamento delle transazioni prima di forzarle al rollback o ad attendere indefinitamente fino a quando non ci sono transazioni in sospeso (che ritengo sia l'impostazione predefinita ma non riesco a trovare nel documento al momento). È l'equivalente di "ferma tutto quello che stai facendo in questo momento e fai questo".
Bacon Bits

39

SQL Server 2012:

fare clic con il tasto destro del mouse DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_usere fare clic su OK.

Ecco!


5
Non proprio, questo è quello che ho ricevuto quando ho provato la tua soluzione: / "Database 'XXX' è già aperto e può avere solo un utente alla volta. (Microsoft SQL Server, Errore: 924)"
Krzysztof Wolny,

1
Inoltre confermato in SQL 2008R2.
codo-sapien,

La migliore risposta, funzionante anche nei casi in cui non sei autorizzato a utilizzare la dichiarazione KILL
Marco Marsala,


13

Questo ha funzionato bene per me.

Passaggio 1. Fare clic con il pulsante destro del mouse sul motore di database, fare clic su Monitor attività e vedere quale processo sta avendo una connessione. Uccidi quel particolare utente ed esegui immediatamente la query.

Passo 2.

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

e aggiorna il database.


9

In realtà ho avuto un problema in cui il mio db era praticamente bloccato dai processi e da una condizione di competizione con loro, quando ho ottenuto un comando eseguito aggiornato e l'hanno bloccato di nuovo ... Ho dovuto eseguire i seguenti comandi back to back in SSMS e mi ha messo offline e da lì ho fatto il mio ripristino e sono tornato online bene, le due query in cui:

Prima corsa:

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);

Quindi immediatamente dopo (nella seconda finestra della query):

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

Ho fatto quello che mi serviva e poi l'ho riportato online. Grazie a tutti coloro che hanno scritto questi pezzi per me per combinare e risolvere il mio problema.


7

Potrebbe essere meglio accedere direttamente al server invece di utilizzare SQL Management Studio

Assicurarsi che l'account con cui si accede sia dbowner per il database che si desidera impostare su MULTI_USER. Accedi come sa (usando l'autenticazione del server SQL) se puoi

Se il tuo database viene utilizzato da IIS, interrompi il sito Web e il pool di app che lo utilizzano : questo potrebbe essere il processo collegato e che ti blocca dall'impostazione su MULTI_USER

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

Fai riferimento qui se hai ancora problemi:

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

COME ULTIMO ALTERNATIVA - Se hai provato tutto quanto sopra e stai diventando disperato, potresti provare a interrompere l'istanza del server SQL e riavviarlo


5

Ho appena risolto utilizzando i seguenti passaggi, può aiutarti.

Passo 1

fare clic con il tasto destro del mouse sul database utente singolo


Passo 2

portare offline


Step: 3

Abbandona la connessione e mettila offline


Step: 4

Porta online


Passaggio: 5

Quindi eseguire la seguente query.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Godere...!


2

Il codice qui sotto ha funzionato per me quando non conoscevo lo SPID specifico utilizzato per passare alla singleusermodalità.

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

1
  1. Ho provato che tutto non funzionava
  2. Accedi a quel server da remoto mentre elimineremo tutte le connessioni
  3. eseguire il codice seguente più di una volta fino a quando non viene completato e non viene più eseguito alcun test del "processo di uccisione"
  4. riattivarlo di nuovo usando il codice sotto il codice seguente

usa il master GO dichiara @sql come varchar (20), @spid come int

seleziona @spid = min (spid) da master..sysprocesses dove dbid = db_id ('DB_NAME') e spid! = @@ spid

mentre (@spid non è nullo) inizia a stampare 'Processo di uccisione' + cast (@spid come varchar) + '...' set @sql = 'kill' + cast (@spid as varchar) exec (@sql)

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

poi per riportarlo in vita

ALTER DATABASE DB_NAME SET MULTI_USER; PARTIRE


1

Questo ha funzionato bene per me

  1. Fai un backup
  2. Crea un nuovo database e ripristina il backup
  3. Quindi Proprietà> Opzioni> [Scorri verso il basso] Stato> Limita accesso> seleziona Multiutente e fai clic su OK
  4. Elimina il vecchio database

Spero che questo lavoro per tutti Grazie Ramesh Kumar


1

Se quanto sopra non funziona, trova il nome di accesso dello spid e disabilitalo in Sicurezza - Login


1

Non è possibile farlo perché il database è in modalità singola. Soprattutto, ma dovresti saperlo: quando hai aperto sql management studio non conosce alcun utente nel database ma quando fai clic sul database ti considera il singolo utente e il tuo comando non funziona. Fallo e basta: chiudi Management Studio e riaprilo. nuova finestra di query senza selezionare alcun database scrivere lo script dei comandi.

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

fai f5 wolla tutto ok!


0

Ho risolto facilmente il problema

  1. Fare clic destro sul nome del database rinominarlo

  2. Dopo la modifica, fai clic con il pulsante destro del mouse sul nome del database -> proprietà -> opzioni -> vai alla fine dello scorrimento di RestrictAccess (da SINGLE_USER a MULTI_USER)

  3. Ora puoi rinominare il database come il tuo vecchio nome.


0

In più di 3 occasioni, lavorando con SQL Server 2014, ho avuto un database convertito in modalità utente singolo senza che io cambiassi nulla. Deve essersi verificato in qualche modo durante la creazione del database. Tutti i metodi di cui sopra non hanno mai funzionato poiché ho sempre ricevuto un errore a causa del quale il database era in modalità utente singolo e non era possibile collegarlo.

L'unica cosa che ho avuto modo di lavorare è stato il riavvio del servizio Windows di SQL Server. Ciò mi ha permesso di connettermi al database e apportare le modifiche necessarie o di eliminare il database e ricominciare da capo.


0

vai alle proprietà del database e modifica la modalità UTENTE SINGOLO in UTENTE MULTI

inserisci qui la descrizione dell'immagine

NOTA: se non funziona per te, prendi il backup Db e ripristina di nuovo e fai di nuovo il metodo sopra

* Singolo = SINGLE_USER

Multipla = MULTI_USER

Limitato = RESTRICTED_USER


In che modo si differenzia dalla query OP?
Squazz,

sì, entrambi funzioneranno allo stesso modo, questo è lo stesso che invece di usare la query CREATE Table, abbiamo usato la progettazione della tabella della GUI del server sql per creare Table, BTS funzionerà allo stesso modo, uno è il metodo di query e l'altro è il metodo GUI. usa quello che ti piace.
Hassan Saeed,

L'OP sta chiaramente affermando che la sua query comporta un errore. Dato che stai dicendo che questa è esattamente la stessa cosa che usando la query a cui non stai dando una risposta, stai solo ingombrando e aggiungendo alle molte risposte sbagliate qui
Squazz

0

Dopo essere passati alla modalità Utente singolo, un client può stabilire solo UNA connessione con SQL Server, ricorda che "Esplora oggetti" utilizza una connessione (separata), quindi se stai provando a eseguire un'istruzione multiutente in una query finestra, visualizzerai l'errore che in modalità Utente singolo non è possibile stabilire un'altra connessione.

Per me questo non era il problema, tuttavia, nel mio caso, c'erano pochi processi automatizzati che stabilivano in modo persistente (in pochi secondi) le connessioni, quindi non appena ho portato il DB in modalità utente singolo e mi sono disconnesso, uno dei i processi hanno stabilito / occupato la connessione (prima che potessi iniziare l'operazione di ripristino). Non appena avessi ucciso quelle connessioni, si sarebbero ricollegate e quando avessi eseguito il comando Ripristina, avrei ricevuto l'errore che la connessione era già occupata.

Per risolvere questo problema, ho dovuto scrivere le killdichiarazioni, il cambio di User-Modeistruzioni e le Restoreoperazioni tutte in una finestra di query e quando le ho eseguite tutte in una volta, voilà !!! ha funzionato.

Spero che questo aiuti gli altri.


0

Ho avuto problemi con un DB locale.

Sono stato in grado di risolvere questo problema arrestando il server SQL, quindi avviando il server SQL e quindi utilizzando l'interfaccia utente SSMS per modificare le proprietà del database in Multi_User.

Il DB è entrato in modalità "Utente singolo" quando stavo tentando di ripristinare un backup. Non avevo creato un backup del database di destinazione prima di tentare di ripristinare (SQL 2017). questo ti porterà ogni volta.

Arrestare SQL Server, avviare SQL Server, quindi eseguire gli script sopra o utilizzare l'interfaccia utente.


0

Ho cercato su Google per la soluzione per un po 'e alla fine ho trovato la soluzione di seguito,

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

Sarà necessario interrompere queste connessioni prima di modificare la modalità di accesso. (L'ho fatto con EXEC (@kill); nel modello di codice in basso.)

Poi,

Eseguire il seguente 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 tornare alla modalità Utente singolo, è possibile utilizzare:

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Questo dovrebbe funzionare. Buona programmazione !!

Grazie!!

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.