Establecer la base de datos del modo USUARIO ÚNICO a USUARIO MÚLTIPLE

189

Necesito ayuda para configurar una base de datos que se restauró en SINGLE_USERmodo a MULTI_USER. Cada vez que corro

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Me sale este error:

Los cambios en el estado o las opciones de la base de datos 'BARDABARD' no se pueden realizar en este momento.

La base de datos está en modo de usuario único y actualmente hay un usuario conectado a ella.

Debe estar en SINGLE_USERmodo no para configurarlo en otro modo, pero no puedo configurar la base de datos en ningún otro modo mientras esté en SINGLE_USERmodo.

Rahna1970418
fuente

Respuestas:

114

El "usuario actualmente está conectado a él" podría ser la ventana de SQL Server Management Studio. Intente seleccionar la base de datos maestra y ALTERvuelva a ejecutar la consulta.

Pablo
fuente
1
Además de esto: parece que se puede adjuntar una ventana de consulta a la base de datos aunque alguna otra base de datos (como master) esté seleccionada en el menú desplegable de la barra de herramientas Bases de datos disponibles cuando la ventana de consulta esté activa. Si le sigue dando dolores de cabeza, cierre todas las demás ventanas de consulta y seleccione alguna base de datos de sistema inocente como mastero tempdben el menú desplegable de la ventana que le queda.
un CVn
Intente desconectar la base de datos y volver a conectarse en el estudio de administración de Microsoft SQL Server. Luego ejecute el comando nuevamente.
Isuru Madusanka
El primer comentario es muy útil y podría agregarse a la respuesta, en realidad. No pude ejecutar la consulta antes de cerrar todas las demás consultas.
user2216
88

Ese mensaje de error generalmente significa que hay otros procesos conectados a la base de datos. Intente ejecutar esto para ver cuáles están conectados:

exec sp_who

Eso le devolverá el proceso y luego podrá ejecutar:

kill [XXX]

Donde [xxx] es spidel proceso que estás tratando de matar.

Entonces puede ejecutar su declaración anterior.

Buena suerte.

sgeddes
fuente
kill [xxx] se deshace del proceso, pero cuando trato de ejecutar mi comando, ¡vuelve!
colmde
74

Puede agregar la opción de deshacer su cambio de inmediato.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
LG1
fuente
1
¿Qué hace ROLLBACK IMMEDIATEexactamente?
dakab
3
@dakab Obliga a todas las transacciones pendientes a revertir inmediatamente al inicio de la ALTER DATABASEtransacción del estado de cuenta, en lugar de WITH ROLLBACK X SECONDSesperar a que finalicen las transacciones antes de obligarlas a revertir o esperar indefinidamente hasta que no haya transacciones pendientes (lo cual creo que es el valor predeterminado, pero Parece que no puedo encontrar en el documento en este momento). Es el equivalente a "detener todo lo que está haciendo ahora y hacer esto".
Bacon Bits
39

SQL Server 2012:

haga clic derecho en DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_usery haga clic en Aceptar.

Voila!

Div2504
fuente
55
En realidad no, esto es lo que recibí cuando probé su solución: / "La base de datos 'XXX' ya está abierta y solo puede tener un usuario a la vez. (Microsoft SQL Server, Error: 924)"
Krzysztof Wolny
1
Además confirmado en SQL 2008R2.
codo-sapien
La mejor respuesta, trabajando incluso en casos en los que no tiene permiso para usar la declaración KILL
Marco Marsala
22

Tuve el mismo problema y se solucionó con los siguientes pasos: referencia: 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
fuente
13

Esto funcionó bien para mi.

Paso 1. Haga clic derecho en el motor de la base de datos, haga clic en el monitor de actividad y vea qué proceso tiene conexión. Mata a ese usuario en particular y ejecuta la consulta inmediatamente.

Paso 2.

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

y actualice la base de datos.

sunil guragol
fuente
9

De hecho, tuve un problema en el que mi db estaba prácticamente bloqueado por los procesos y una condición de carrera con ellos, para cuando ejecuté un comando actualizado y lo bloquearon nuevamente ... Tuve que ejecutar los siguientes comandos de forma consecutiva en SSMS y me desconecté y desde allí hice mi restauración y volví a estar en línea muy bien, las dos consultas fueron:

Primero corrió:

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

Luego, inmediatamente después (en la segunda ventana de consulta):

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

Hice lo que necesitaba y luego lo volví a poner en línea. Gracias a todos los que escribieron estas piezas para que combine y resuelva mi problema.

Shane G.
fuente
7

Puede ser mejor iniciar sesión directamente en el servidor en lugar de usar SQL Management Studio

Asegúrese de que la cuenta con la que inicia sesión sea dbowner para la base de datos que desea establecer en MULTI_USER. Inicie sesión como sa (utilizando la autenticación del servidor SQL) si puede

Si IIS usa su base de datos, detenga el sitio web y el grupo de aplicaciones que lo usan ; este puede ser el proceso que está conectado y le impide configurar 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

Consulte aquí si aún tiene problemas:

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

COMO ÚLTIMA ALTERNATIVA : si ha intentado todo lo anterior y se está desesperando, puede intentar detener la instancia del servidor SQL y volver a iniciarla

Chris Halcrow
fuente
5

Acabo de arreglarlo usando los siguientes pasos, puede ayudarte.

Paso 1

haga clic derecho en la base de datos de un solo usuario


Paso 2

desconectar


Paso 3

Desconecte la conexión y desconéctela


Paso 4

Tomar en línea


Paso 5

Luego ejecute la siguiente consulta.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Disfrutar...!

Rikin Patel
fuente
2

El siguiente código me funcionó cuando no conocía el SPID específico que se utilizó para cambiar al singleusermodo.

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
fuente
1
  1. Intenté que todo no funcionara
  2. Inicie sesión en ese servidor de forma remota ya que vamos a eliminar todas las conexiones
  3. ejecute el siguiente código más de una vez hasta que regrese completado y ya no haya una prueba de "proceso de eliminación"
  4. reactivarlo nuevamente usando el código debajo del siguiente código

use master GO declare @sql como varchar (20), @spid como int

seleccione @spid = min (spid) de master..sysprocesses donde dbid = db_id ('DB_NAME') y spid! = @@ spid

while (@spid no es nulo) comienza a imprimir 'Proceso de asesinato' + cast (@spid como varchar) + '...' set @sql = 'kill' + cast (@spid como varchar) exec (@sql)

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

luego traerlo de vuelta con vida

ALTER DATABASE DB_NAME SET MULTI_USER; VAMOS

Bishoy Hanna
fuente
1

Esto funcionó bien para mi

  1. Tomar una copia de seguridad
  2. Cree una nueva base de datos y restaure la copia de seguridad.
  3. Luego Propiedades> Opciones> [Desplazar hacia abajo] Estado> Restringir acceso> seleccione Multi_usuario y haga clic en Aceptar
  4. Eliminar la base de datos anterior

Espero que esto funcione para todos Gracias Ramesh Kumar

Ramesh Kumar
fuente
1

Si lo anterior no funciona, busque el nombre de usuario del spid y desactívelo en Seguridad - Inicios de sesión

Aileen Gregg
fuente
1

No podría hacer eso porque la base de datos en modo único. Sobre todo bien, pero debe saber que: cuando abrió el estudio de administración de SQL no conoce a ningún usuario en la base de datos, pero cuando hace clic en la base de datos, lo considera el usuario único y su comando no funciona. Solo haz eso: cierra el estudio de administración y vuelve a abrirlo. nueva ventana de consulta sin seleccionar ninguna base de datos, escriba el script de comando.

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

hacer f5 wolla todo bien!

Hamit YILDIRIM
fuente
0

He resuelto el problema fácilmente

  1. Haga clic derecho en el nombre de la base de datos, cámbiele el nombre

  2. Después de cambiar, haga clic derecho en el nombre de la base de datos -> propiedades -> opciones -> vaya al final del desplazamiento RestrictAccess (SINGLE_USER a MULTI_USER)

  3. Ahora, de nuevo, puede cambiar el nombre de la base de datos como su nombre anterior.

Vamsi
fuente
0

En más de 3 ocasiones trabajando con SQL Server 2014, he convertido una base de datos al modo de usuario único sin que yo cambie nada. Debe haber ocurrido durante la creación de la base de datos de alguna manera. Todos los métodos anteriores nunca funcionaron, ya que siempre recibí un error de que la base de datos estaba en modo de usuario único y no podía conectarse.

Lo único que pude trabajar fue reiniciar el servicio de Windows del servidor SQL. Eso me permitió conectarme a la base de datos y hacer los cambios necesarios o eliminar la base de datos y comenzar de nuevo.

epak96
fuente
0

simplemente vaya a las propiedades de la base de datos y cambie el modo de USUARIO ÚNICO a USUARIO MÚLTIPLE

ingrese la descripción de la imagen aquí

NOTA: si no funciona para usted, haga una copia de seguridad de Db y restaure nuevamente y vuelva a hacer el método anterior

* Individual = SINGLE_USER

Múltiple = MULTI_USER

Restringido = RESTRICTED_USER

Hassan Saeed
fuente
¿En qué se diferencia esto de la consulta que OP está usando?
Squazz
sí, ambos funcionarán igual, esto es lo mismo que, en lugar de usar la consulta CREATE Table, utilizamos el Diseñador de tablas de la GUI del servidor sql para hacer Table, BTS funcionarán igual, uno es el método de consulta y el otro es el método GUI. usa lo que quieras.
Hassan Saeed
OP indica claramente que la consulta resulta en un error. Como está diciendo que esto es exactamente lo mismo que usar la consulta, no está respondiendo en absoluto, simplemente está abarrotando y agregando a las muchas respuestas incorrectas aquí
Squazz el
0

Después de pasar al modo de usuario único, un cliente puede establecer solo UNA conexión con el servidor SQL, recuerde que "Object Explorer" toma una conexión (separada), por lo que si está intentando ejecutar una declaración multiusuario en una consulta ventana, recibirá un error que en el modo de usuario único no puede establecer otra conexión.

Sin embargo, para mí este no era el problema, en mi caso, había pocos procesos automatizados que establecían conexiones de manera persistente (en cada pocos segundos), así que tan pronto como llevé la base de datos al modo de usuario único y me desconecté, uno de los procesos establecieron / ocuparon la conexión (antes de que pudiera comenzar mi operación de Restauración). Tan pronto como matara esas conexiones, se volverían a conectar y cuando ejecutara el comando Restaurar, obtendría el error de que la conexión ya está ocupada.

Para resolver esto, tuve que escribir las killdeclaraciones, el cambio de las User-Modedeclaraciones y las Restoreoperaciones, todo en una ventana de consulta y, cuando los ejecuté de una vez, ¡listo! funcionó.

Espero que esto ayude a otros.

Eddie Kumar
fuente
0

Estaba teniendo problemas con un DB local.

Pude resolver este problema deteniendo el servidor SQL, y luego iniciando el servidor SQL, y luego usando la interfaz de usuario SSMS para cambiar las propiedades de la base de datos a Multi_User.

La base de datos entró en modo "Usuario único" cuando intentaba restaurar una copia de seguridad. No había creado una copia de seguridad de la base de datos de destino antes de intentar restaurar (SQL 2017). esto te atrapará todo el tiempo.

Detenga SQL Server, inicie SQL Server, luego ejecute los scripts anteriores o use la interfaz de usuario.

hanzolo
fuente
0

Busqué en Google la solución por un tiempo y finalmente encontré la solución a continuación,

SSMS en general usa varias conexiones a la base de datos detrás de escena.

Deberá eliminar estas conexiones antes de cambiar el modo de acceso. (Lo he hecho con EXEC (@kill); en la plantilla de código a continuación).

Luego,

Ejecute el siguiente SQL para configurar la base de datos en modo 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

Para volver al modo de usuario único, puede usar:

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Esto debería funcionar. Feliz codificación !!

¡¡Gracias!!

Trilok Pathak
fuente