Sair do modo de usuário único

208

Atualmente, meu banco de dados está no modo de usuário único. Quando tento expandir meu banco de dados, recebo um erro:

O banco de dados 'my_db' não está acessível. (ObjectExplorer)

Além disso, quando tento excluir o banco de dados, recebo o erro:

Alterações no estado ou nas opções do banco de dados 'my_db' não podem ser feitas no momento. O banco de dados está no modo de usuário único e um usuário está atualmente conectado a ele.

Como saio do modo de usuário único? Não tenho nenhum usuário usando esse banco de dados.

Quando tento navegar no meu site com o IIS, o erro que recebo é:

Uma exceção não tratada foi gerada durante a execução da solicitação da web atual. Informações sobre a origem e o local da exceção podem ser identificadas usando o rastreamento da pilha de exceções abaixo.

Sinto como se o modo de usuário único estivesse causando isso.

Liondancer
fonte

Respostas:

381

O SSMS em geral usa várias conexões com o banco de dados nos bastidores.

Você precisará eliminar essas conexões antes de alterar o modo de acesso.

Primeiro, verifique se o gerenciador de objetos está apontado para um banco de dados do sistema como mestre.

Segundo, execute um sp_who2 e encontre todas as conexões com o banco de dados 'my_db'. Mate todas as conexões fazendo KILL { session id }onde a identificação da sessão está SPIDlistada por sp_who2.

Terceiro, abra uma nova janela de consulta.

Execute o seguinte código.

-- Start in master
USE MASTER;

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

Veja o artigo do meu blog sobre gerenciamento de arquivos de banco de dados. Isso foi escrito para mover arquivos, mas o gerenciamento de usuários é o mesmo.

DBA CRAFTY
fonte
2
Quando usei o comando 'sp_who2', não vi nenhum DBName conectado ao 'my_db'. Não destruí nenhuma dessas conexões. Depois de executar os comandos, recebo o mesmo erro = [: 'As alterações no estado ou nas opções do banco de dados' my_db 'não podem ser feitas no momento. O banco de dados está no modo de usuário único e um usuário está atualmente conectado a ele. Mensagem 5069, nível 16, estado 1, linha 1 A instrução ALTER DATABASE falhou '
Liondancer 23/09
2
Você se certificou de estar no mestre, sp_who2 não mostra nenhuma linha com database = my_db e seu explorador de objetos não está no my_db.
CRAFTY DBA
1
Tente desconectar e conectar o SSMS. Algo precisa estar conectado a esse banco de dados. A outra opção é conectar-se ao console administrativo dedicado (DAC). Isso pressupõe que você é um administrador de sistemas. Então mate o spid ofensivo.
CRAFTY DBA
1
Além disso, carregue meu script usp_who2 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Execute. Ele coloca o utilitário em msdb.dbo.usp_who2. Ele salva os resultados de sp_who2 em uma tabela no tempdb com seu ID de usuário, filtre pelo nome do banco de dados. Poste uma imagem do erro para nos ajudar mais. Boa sorte.
CRAFTY DBA
3
Encontre o SPID, use o seguinte: Mate 100. O 100 é o número da sessão (SPID).
CRAFTY DBA
45

Primeiro, encontre e KILLtodos os processos em execução no momento.

Em seguida, execute o seguinte T-SQLpara definir o banco de dados no 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
Sathish
fonte
Esta solução não funcionaria para mim no SQL Server 2016. Se eu consultar os processos mestre ..., vejo várias linhas aparecerem, mas as linhas serão substituídas por uma mensagem de erro informando que o banco de dados especificado está no modo de usuário único etc.
youcantryreachingme
@youcantryreachingme, forneça aqui a mensagem de erro que você estava recebendo no SQL Server 2016 para que eu / outra pessoa possa ajudá-lo a resolvê-lo.
Sathish
o mesmo que no OP: alterações no estado ou nas opções do banco de dados 'my_db' não podem ser feitas no momento. O banco de dados está no modo de usuário único e um usuário está atualmente conectado a ele.
Youcantryreachingme
25

Para sair do modo de usuário único, tente:

ALTER DATABASE [my_db] SET MULTI_USER

Para voltar ao modo de usuário único, você pode usar:

ALTER DATABASE [my_db] SET SINGLE_USER

rsbarro
fonte
1
Eu recebo o erro: 'Alterações no estado ou nas opções do banco de dados' my_db 'não podem ser feitas no momento. O banco de dados está no modo de usuário único e um usuário está atualmente conectado a ele. A mensagem 5069, nível 16, estado 1, linha 1 da instrução ALTER DATABASE falhou. '
Liondancer 23/09
1
Você pode parar e reiniciar o banco de dados (obviamente, se este não for um sistema de produção que afetará outros usuários) e tentar o comando novamente? E como o @CRAFTYDBA declarou, o comando deve ser executado no banco de dados mestre.
rsbarro
1
Expandi 'Bancos de dados do sistema' e cliquei com o botão direito do mouse em 'mestre' e selecionei 'Nova consulta' e tentei nos seus e nos vírgulas do @ CRAFTYDBA. Mesmo erro = [
Liondancer 23/09
1
Você tentou parar e reiniciar o banco de dados para eliminar a conexão existente? Você também pode procurar aqui outras maneiras de eliminar conexões com um banco de dados: stackoverflow.com/questions/11620/…
rsbarro
2
Clique com o botão direito do mouse no servidor no painel esquerdo e clique em 'Desconectar'. Verifique se você possui apenas uma guia SSMS aberta no seu banco de dados (clique com o botão direito do mouse e escolha 'Desconectar outras conexões') e, em seguida, execute a instrução. Cada guia e explorador de objetos é uma conexão; você só pode ter uma conexão aberta com o banco de dados (portanto, 'modo de usuário único'). Único usuário deve ser 'conexão single' :) Boa sorte
tommy_o
20
  1. Clique com o botão direito do mouse no seu banco de dados na seção de bancos de dados
  2. Selecione "Propriedades"
  3. Selecione a página "Opções"
  4. Role para baixo "Outras opções" e altere o campo "Restringir acesso"

captura de tela da página de opções do servidor sql

Tomas
fonte
1
Esta solução não funcionaria para mim no SQL Server 2016. Tentar acessar propriedades mostra um erro de que o banco de dados está no modo de usuário único e já possui um usuário conectado.
usar o seguinte comando
15

Eu tentei isso está funcionando

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
Elanchezhian Narayanasamy
fonte
8

Eu tive o mesmo problema, e o session_id to kill foi encontrado usando esta consulta:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Geri Reshef
fonte
Isso foi perfeito. Encontrei o SPID traquina e coloquei o banco de dados online novamente. Muito obrigado!
Russell Speight
8

Pressione CTRL + 1

encontre o processo que bloqueia seu banco de dados. Procure na coluna dbname pelo seu db e observe o spid. Agora você precisa executar essa instrução:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
greg121
fonte
CTRL + 1 é um atalho muito útil que eu não conhecia!
Tyler Forsythe
7

O seguinte funcionou para mim:

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
Jesper Lehtinen
fonte
7

Outra opção é:

  • colocar o banco de dados offline; no SMSS, clique com o botão direito do mouse no banco de dados e escolha Desligar, marque 'Descartar todas as conexões'
  • corre ALTER DATABASE [Your_Db] SET MULTI_USER
Padrão de teste
fonte
O meu não me deixou ficar offline, continuava dizendo que estava no modo de usuário único e que um usuário estava conectado! (sim, marquei "largar todas as conexões"). Acabei desanexando o banco de dados!
TabbyCool
Eu tive que usar esta opção, pois não havia usuários conectados, e o comando KILL não funcionaria na conexão sa.
Derek K
6

Caso alguém se depare com esse segmento, aqui está uma solução à prova de balas para o SQL Server presa no MODO DE USUÁRIO ÚNICO

- Obtenha o ID do processo (spid) da conexão que você precisa matar
- Substitua 'DBName' pelo nome real do banco de dados

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, você também pode usar o comando "sp_who" para obter o "spid" da conexão aberta:

- Ou use esse SP

exec sp_who

- Em seguida, execute o seguinte e substitua [spid] e [DBName] pelos valores corretos

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Einar Larusson
fonte
Obrigado pela informação adicional, fez uma grande diferença!
Daniel
5

Não tenho certeza se isso ajuda alguém, mas eu tive o mesmo problema e não consegui encontrar o processo que estava me atrasando. Fechei o SSMS e parei todos os serviços que atingiam a instância local. Então, quando voltei e executei o exec sp_who2, ele me mostrou o culpado. Eu matei o processo e consegui fazer o Multi_User funcionar e, em seguida, reinicie os serviços. Tivemos o IIS acessando-o a cada poucos minutos / segundos, procurando por determinados pacotes.

Bindum
fonte
3

Encontrei o mesmo problema esta manhã. Acabou sendo um problema simples. Eu tinha uma janela de consulta aberta, definida como o banco de dados de usuário único no explorador de objetos. O procedimento armazenado sp_who2 não mostrou a conexão. Depois de fechado, pude configurá-lo para

Mysti
fonte
3

Adicionando à resposta de Jespers , para ser ainda mais eficaz:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHusos DEADLOCK_PRIORITYde 5.

O que está acontecendo é que os outros processos ficam com uma fenda no banco de dados e, se o seu processo tiver um valor mais baixo DEADLOCK_PRIORITY, ele perde a corrida.

Isso evita encontrar e matar o outro spid (que pode precisar ser feito várias vezes).

É possível que você precise executar ALTER DATABASEmais de uma vez (mas Jesper faz isso). 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
Roy Latham
fonte
3

Use este script

exec sp_who

Encontre a coluna dbname e spid

agora execute

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

Hoje, enfrentei o mesmo problema em que meu banco de dados foi alterado do modo Multiusuário para Usuário Único e isso acabou me impedindo de publicar o banco de dados.

Para corrigir esse problema, tive que fechar todas as instâncias do Visual Studio e executar o comando abaixo na janela de consulta do Sql Server -

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

Este comando alterou o banco de dados de Usuário único para Usuário múltiplo e, posteriormente, consegui publicar.

Vivek
fonte
1

Até me deparo com o mesmo problema, incapaz de encontrar conexões ativas com o my_db para matá-lo, mas ainda mostra o mesmo erro. Acabo desconectando todas as conexões SSMS possíveis para qualquer banco de dados no servidor, crio uma nova conexão a partir do SSMS e altero para Multiusuário.

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

Nota: Este parece ser um erro possível no SQL Server 2005!

Vijred
fonte
1

Acabamos de experimentar isso no SQL 2012. Um processo de replicação entrou em cena quando matamos a sessão original que a definiu como usuário único. Mas sp_who2 não mostrou esse novo processo anexado ao banco de dados. Fechar o SSMS e reabrir nos permitiu ver esse processo no banco de dados e, em seguida, poderíamos matá-lo e mudar para o modo multiusuário imediatamente e isso funcionou.

Não consigo descobrir a lógica por trás disso, mas parece ser um bug no SSMS e ainda está se manifestando no SQL 2012.

Mr McGoo
fonte
0

use mestre

IR

selecione d.name, d.dbid, spid, login_time, nt_domain, nt_username, nome de login de sysprocesses p sysdatabases de junção interna d em p.dbid = d.dbid em que d.name = 'nome do banco de dados'

matar 568 - matar spid

ALTER DATABASE database name '

SET MULTI_USER ir

ARYA
fonte