Salga del modo de usuario único


208

Actualmente, mi base de datos está en modo de usuario único. Cuando intento expandir mi base de datos, aparece un error:

La base de datos 'my_db' no es accesible. (ObjectExplorer)

Además, cuando intento eliminar la base de datos, aparece el error:

Los cambios en el estado u opciones de la base de datos 'my_db' 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.

¿Cómo salgo del modo de usuario único? No tengo ningún usuario usando esta base de datos.

Cuando intento navegar por mi sitio con IIS, el error que obtengo es:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de la pila de excepciones a continuación.

Siento que el modo de usuario único está causando esto.

Respuestas:


381

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.

Primero, asegúrese de que el explorador de objetos apunte a una base de datos del sistema como master.

En segundo lugar, ejecute un sp_who2 y encuentre todas las conexiones a la base de datos 'my_db'. Elimine todas las conexiones haciendo KILL { session id }donde la identificación de sesión es la SPIDlistada por sp_who2.

Tercero, abra una nueva ventana de consulta.

Ejecute el siguiente código.

-- Start in master
USE MASTER;

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

Vea mi artículo de blog sobre la gestión de archivos de bases de datos. Esto fue escrito para mover archivos, pero la administración de usuarios es la misma.


2
Cuando utilicé el comando 'sp_who2', no vi ningún DBName conectado a 'my_db'. No eliminé ninguna de esas conexiones. Después de ejecutar los comandos, aparece el mismo error = [: 'No se pueden realizar cambios en el estado u opciones de la base de datos' my_db 'en este momento. La base de datos está en modo de usuario único y actualmente hay un usuario conectado a ella. Msg 5069, Nivel 16, Estado 1, Línea 1
Fallo en la

2
¿Se aseguró de estar en master, sp_who2 no muestra ninguna fila con database = my_db, y su explorador de objetos no está en my_db?
DRA CRAFTY

1
Pruebe, desconectando y conectando SSMS. Algo tiene que estar conectado a esa base de datos. La otra opción es conectarse con la consola de administración dedicada (DAC). Esto supone que eres un administrador de sistemas. Luego mata al spid ofensor.
DRA CRAFTY

1
Además, descargue mi script usp_who2 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Ejecutalo. Coloca la utilidad en msdb.dbo.usp_who2. Guarda los resultados de sp_who2 en una tabla en tempdb bajo su identificación de usuario, filtre por el nombre de la base de datos. Publique una imagen del error para ayudarnos más. Buena suerte.
DRA CRAFTY

3
Encuentra el SPID, usa lo siguiente: Mata a 100. El 100 es el número de la sesión (SPID).
DRA CRAFTY

45

Primero, encuentre y KILLtodos los procesos que se han estado ejecutando actualmente.

Luego, ejecute lo siguiente T-SQLpara configurar la base de datos en MULTI_USERmodo.

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

Esta solución no me funcionaría en SQL Server 2016. Si consulto los procesos master..sys, veo que aparecen varias filas, pero luego las filas se reemplazan con un mensaje de error de que la base de datos dada está en modo de usuario único, etc.
youcantryreachingme

@youcantryreachingme, proporcione el mensaje de error que estaba recibiendo en SQL Server 2016 aquí para que yo / alguien más pueda ayudarlo a resolverlo.
Sathish

lo mismo que en el OP: los cambios en el estado o las opciones de la base de datos 'my_db' 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.
youcantryreachingme

25

Para salir del modo de usuario único, intente:

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER


1
Recibo el error: "No se pueden realizar cambios en el estado u opciones de la base de datos 'my_db' en este momento. La base de datos está en modo de usuario único y actualmente hay un usuario conectado a ella. Msg 5069, Nivel 16, Estado 1, Línea 1 Fallo en la instrucción ALTER DATABASE '.
Liondancer el

1
¿Puede detener y reiniciar la base de datos (obviamente si este no es un sistema de producción que afectará a otros usuarios) y luego volver a intentar el comando? Y como dijo @CRAFTYDBA, el comando debe ejecutarse desde la base de datos maestra.
rsbarro

1
Expandí 'Bases de datos del sistema' e hice clic derecho en 'maestro' y seleccioné 'Nueva consulta' e intenté en los comandos tuyos y de @ CRAFTYDBA. Mismo error = [
Liondancer el

1
¿Intentó detener y reiniciar la base de datos para eliminar la conexión existente? También puede buscar más formas de eliminar conexiones a una base de datos: stackoverflow.com/questions/11620/…
rsbarro

2
Haga clic derecho en el servidor en el panel izquierdo y haga clic en 'Desconectar'. Asegúrese de tener una sola pestaña SSMS abierta en su base de datos (haga clic con el botón derecho y elija 'Desconectar otras conexiones') y luego ejecute la declaración. Cada explorador de pestañas y objetos es una conexión; solo puede tener una conexión abierta a la base de datos (por lo tanto, 'modo de usuario único'). El usuario único debe ser 'conexión única' :) Buena suerte
tommy_o

20
  1. Haga clic derecho en su base de datos en la sección de bases de datos
  2. Seleccione "Propiedades"
  3. Seleccione la página "Opciones"
  4. Desplácese hacia abajo "Otras opciones" y modifique el campo "Restringir acceso"

captura de pantalla de la página de opciones del servidor sql


1
Esta solución no funcionaría para mí en SQL Server 2016. Intentar acceder a las propiedades muestra un error de que la base de datos está en modo de usuario único y ya tiene un usuario conectado.
youcantryreachingme


8

Tuve el mismo problema, y ​​se encontró el session_id para matar usando esta consulta:

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

Esto fue perfecto. Encontré el SPID molesto y recuperé la base de datos en línea. ¡Muchas gracias!
Russell Speight

8

Presione CTRL + 1

encuentra el proceso que bloquea tu base de datos. Busque en la columna dbname su db y observe el spid. Ahora tienes que ejecutar esa declaración:

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

CTRL + 1 es un atajo muy útil que no conocía.
Tyler Forsythe

7

Lo siguiente funcionó para mí:

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

Otra opción es:

  • desconectar la base de datos; en SMSS, haga clic con el botón derecho en la base de datos y seleccione Desconectar, marque 'Eliminar todas las conexiones'
  • correr ALTER DATABASE [Your_Db] SET MULTI_USER

¡El mío no me dejaba desconectarlo, solo decía que estaba en modo de usuario único y que un usuario estaba conectado! (sí, marqué "soltar todas las conexiones"). ¡Terminé separando la base de datos en su lugar!
TabbyCool

Tuve que usar esta opción ya que no había usuarios conectados y el comando KILL no funcionaría en la conexión sa.
Derek K

6

Solo en caso de que alguien tropiece con este hilo, aquí hay una solución a prueba de balas para SQL Server atascado en MODO DE USUARIO ÚNICO

- Obtenga el ID de proceso (spid) de la conexión que necesita eliminar
- Reemplace 'DBName' con el nombre real 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'

Como alternativa, también puede usar el comando "sp_who" para obtener el "spid" de la conexión abierta:

- O use este SP en su lugar

exec sp_who

- Luego ejecute lo siguiente y reemplace [spid] y [DBName] con los valores correctos

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Gracias por la información adicional, hizo una gran diferencia!
Daniel

5

No estoy seguro de si esto ayuda a alguien, pero tuve el mismo problema y no pude encontrar el proceso que me estaba deteniendo. Cerré SSMS y detuve todos los servicios que afectaban a la instancia local. Luego, una vez que volví y ejecuté el ejecutivo sp_who2, me mostró al culpable. Eliminé el proceso y pude hacer que Multi_User funcionara, luego reinicié los servicios. Tuvimos IIS golpeándolo cada pocos minutos / segundos buscando ciertos paquetes.


3

Me encontré con el mismo problema esta mañana. Resultó ser un problema simple. Tenía una ventana de consulta abierta que se configuró en la base de datos de un solo usuario en el explorador de objetos. El procedimiento almacenado sp_who2 no mostraba la conexión. Una vez que lo cerré, pude configurarlo en


3

Agregando a la respuesta de Jespers , para ser aún más efectivo:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH usos DEADLOCK_PRIORITY de 5.

Lo que está sucediendo es que los otros procesos tienen una grieta en la base de datos y, si su proceso tiene un menor DEADLOCK_PRIORITY , pierde la carrera.

Esto evita encontrar y matar al otro spid (lo que podría ser necesario hacer varias veces).

Es posible que necesite ejecutar ALTER DATABASEmás de una vez (pero Jesper lo hace). Código modificado:

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 este script

exec sp_who

Encuentra el dbname y la columna spid

ahora ejecuta

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

Hoy me enfrenté al mismo problema en el que mi base de datos cambió de modo Multiusuario a Usuario único y esto finalmente me detuvo para publicar la base de datos.

Para solucionar este problema, tuve que cerrar todas las instancias de Visual Studio y ejecutar el siguiente comando en la ventana de consulta del Servidor SQL:

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

Este comando ha cambiado la base de datos de usuario único a usuario múltiple y luego pude publicar con éxito.


1

Incluso me encuentro con el mismo problema, no puedo encontrar conexiones activas a my_db para matarlo, pero todavía muestra el mismo error. Termino desconectando todas las conexiones SSMS posibles para cualquier base de datos en el Servidor, creo una nueva conexión desde SSMS y la cambio a Multiusuario.

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

Nota: ¡Esto parece ser un posible error en SQL Server 2005!


1

Acabamos de experimentar esto en SQL 2012. Un proceso de replicación se activó cuando cancelamos la sesión original que lo configuró como usuario único. Pero sp_who2 no mostró ese nuevo proceso adjunto a la base de datos. Cerrar SSMS y volver a abrirnos luego nos permitió ver este proceso en la base de datos y luego podríamos eliminarlo y cambiar al modo multiusuario inmediatamente y eso funcionó.

No puedo resolver la lógica detrás de esto, pero parece ser un error en SSMS y todavía se manifiesta en SQL 2012.


0

usar maestro

VAMOS

seleccione d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame de sysprocesses p inner join sysdatabases d en p.dbid = d.dbid donde d.name = 'nombre de base de datos'

kill 568 - kill spid

ALTER DATABASE nombre de la base de datos '

SET MULTI_USER ir

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.