Defina o banco de dados do modo SINGLE USER para MULTI USER

188

Preciso de ajuda para definir um banco de dados que foi restaurado no SINGLE_USERmodo para MULTI_USER. Toda vez que eu corro

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Eu recebo este erro:

Alterações no estado ou nas opções do banco de dados 'BARDABARD' 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.

Ele precisa estar no SINGLE_USERmodo não para configurá-lo para outro modo, mas não posso definir o banco de dados em nenhum outro modo enquanto estiver no SINGLE_USERmodo.

Rahna1970418
fonte

Respostas:

113

O "usuário está atualmente conectado a ele" pode ser a própria janela do SQL Server Management Studio. Tente selecionar o banco de dados mestre e executar a ALTERconsulta novamente.

Paulo
fonte
1
Adicionando a isso: Parece que uma janela de consulta pode estar anexada ao banco de dados, mesmo que outro banco de dados (como master) esteja selecionado na barra de ferramentas Bancos de Dados Disponíveis quando a janela de consulta está ativa. Se ele mantém dando-lhe dores de cabeça, perto todas as outras janelas de consulta e selecione algum banco de dados do sistema inocente como masterou tempdbno drop-down no uma janela que lhe resta.
um CVn
Tente desconectar o banco de dados e conectar-se novamente no Microsoft SQL Server Management Studio. Em seguida, execute o comando novamente.
Isuru Madusanka
O primeiro comentário é muito útil e pode ser adicionado à resposta, na verdade. Não consegui executar a consulta antes de fechar todas as outras consultas.
user2216 5/02
87

Essa mensagem de erro geralmente significa que existem outros processos conectados ao banco de dados. Tente executar isso para ver quais estão conectados:

exec sp_who

Isso retornará o processo e você poderá executar:

kill [XXX]

Onde [xxx] é spido processo que você está tentando matar.

Então você pode executar sua declaração acima.

Boa sorte.

sgeddes
fonte
kill [xxx] se livra do processo, mas quando tento executar meu comando, ele volta!
colmde 29/03/19
73

Você pode adicionar a opção de reverter sua alteração imediatamente.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
LG1
fonte
1
O que ROLLBACK IMMEDIATEexatamente faz?
Dakab
3
@dakab Força a reversão de todas as transações pendentes imediatamente no início da ALTER DATABASEtransação do extrato, ao contrário do WITH ROLLBACK X SECONDSque aguarda a conclusão das transações antes de forçá-las a retroceder ou a aguardar indefinidamente até que não haja transações pendentes (que eu acredito ser o padrão, mas não consigo encontrar no documento no momento). É o equivalente a "interrompa tudo o que você está fazendo agora e faça isso".
Bacon Bits
39

SQL Server 2012:

clique com o DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_userbotão direito do mouse no e clique em OK.

Voila!

Div2504
fonte
5
Na verdade, é isso que recebi quando tentei sua solução: / "O banco de dados 'XXX' já está aberto e pode ter apenas um usuário por vez. (Microsoft SQL Server, Erro: 924)"
Krzysztof Wolny
1
Adicionalmente confirmado no SQL 2008R2.
Codo-sapien
Melhor resposta, trabalhando, mesmo em casos em que você não tem permissão para usar instrução KILL
Marco Marsala
22

Eu tive o mesmo problema e foi corrigido pelas seguintes etapas - referência: 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
fonte
13

Isso funcionou bem pra mim.

Etapa 1. Clique com o botão direito do mouse no mecanismo de banco de dados, clique no monitor de atividades e veja qual processo está tendo conexão. Mate esse usuário específico e execute a consulta imediatamente.

Passo 2.

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

e atualize o banco de dados.

sunil guragol
fonte
9

Na verdade, eu tive um problema em que meu banco de dados estava praticamente bloqueado pelos processos e uma condição de corrida com eles, quando recebi um comando executado e eles o bloquearam novamente ... tive que executar os seguintes comandos novamente no SSMS e me desliguei e, a partir daí, fiz minha restauração e voltei a ficar online, as duas consultas em que:

Primeira execução:

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

Em seguida, imediatamente após (na segunda janela de consulta):

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

Fiz o que eu precisava e o trouxe novamente online. Obrigado a todos que escreveram essas peças para eu combinar e resolver meu problema.

Shane G.
fonte
7

Talvez seja melhor fazer logon no servidor diretamente, em vez de usar o SQL Management Studio

Certifique-se de que a conta que você efetua login seja dbowner do banco de dados que você deseja definir como MULTI_USER. Efetue login como sa (usando autenticação do servidor SQL), se puder

Se o seu banco de dados for usado pelo IIS, pare o site e o pool de aplicativos que o utilizam - este pode ser o processo que está conectado e impedindo que você defina como 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 aqui se você ainda tiver 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 - Se você tentou tudo acima e está ficando desesperado, tente parar a instância do servidor SQL e iniciá-la novamente

Chris Halcrow
fonte
5

Acabei de corrigir usando as etapas a seguir. Isso pode ajudá-lo.

Passo 1

clique com o botão direito do mouse no banco de dados de usuário único


Passo 2

ficar offline


Etapa 3

Abandone a conexão e fique offline


Passo 4

Tome online


Etapa: 5

Em seguida, execute a consulta a seguir.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Aproveitar...!

Rikin Patel
fonte
2

O código abaixo funcionou para mim quando eu não conhecia o SPID específico que foi usado para mudar para o 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
fonte
1
  1. Tentei que tudo não funcionou
  2. Entre nesse servidor remotamente, pois vamos matar todas as conexões
  3. execute o código abaixo mais de uma vez até que ele retorne completo e não mais teste de "processo de extermínio"
  4. reative-o novamente usando o código abaixo do código abaixo

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

selecione @spid = min (spid) no master..sysprocesses em que dbid = db_id ('DB_NAME') e spid! = @@ spid

while (@spid não é nulo) começa a imprimir 'Processo de matança' + conversão (@spid como varchar) + '...' set @sql = 'kill' + conversão (@spid como varchar) exec (@sql)

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

para trazê-lo de volta vivo

ALTER DATABASE DB_NAME SET MULTI_USER; IR

Bishoy Hanna
fonte
1

isso funcionou bem pra mim

  1. Faça um backup
  2. Crie um novo banco de dados e restaure o backup nele
  3. Em Propriedades> Opções> [Rolar para baixo] Estado> RestrictAccess> selecione Multi_user e clique em OK
  4. Excluir o banco de dados antigo

Espero que este trabalho para todos Obrigado Ramesh Kumar

Ramesh Kumar
fonte
1

Se o acima não funcionar, encontre o nome de login do spid e desative-o em Segurança - Logins

Aileen Gregg
fonte
1

Você não pode fazer isso porque o banco de dados está no modo único. Acima de tudo, mas você deve saber que: quando você abriu o sql management studio, ele não conhece nenhum usuário no banco de dados, mas quando você clica no banco de dados, ele é considerado o único usuário e seu comando não está funcionando. Faça o seguinte: feche o estúdio de gerenciamento e abra-o novamente. nova janela de consulta sem selecionar nenhum banco de dados, escreva o script de comando.

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

faça f5 wolla tudo ok!

Hamit YILDIRIM
fonte
0

Eu resolvi o problema facilmente

  1. Clique com o botão direito do mouse no nome do banco de dados e renomeie-o

  2. Depois de alterar, clique com o botão direito do mouse no nome do banco de dados -> propriedades -> opções -> vá para o final da rolagem RestrictAccess (SINGLE_USER para MULTI_USER)

  3. Agora, novamente, você pode renomear o banco de dados como seu nome antigo.

Vamsi
fonte
0

Em mais de três ocasiões trabalhando com o SQL Server 2014, tive um banco de dados convertido para o modo Usuário Único sem que eu alterasse nada. Deve ter ocorrido durante a criação do banco de dados de alguma forma. Todos os métodos acima nunca funcionaram, pois sempre recebi um erro ao qual o banco de dados estava no modo de usuário único e não podia ser conectado.

A única coisa que comecei a trabalhar foi reiniciar o serviço Windows Server do SQL Server. Isso me permitiu conectar-me ao banco de dados e fazer as alterações necessárias ou excluir o banco de dados e começar de novo.

epak96
fonte
0

basta acessar as propriedades do banco de dados e alterar o modo ÚNICO USUÁRIO para MULTI USUÁRIO

insira a descrição da imagem aqui

NOTA: se não funcionar, faça o backup e a restauração do banco de dados e faça o método acima novamente

* Único = SINGLE_USER

Vários = MULTI_USER

Restrito = RESTRICTED_USER

Hassan Saeed
fonte
Como isso é diferente da consulta que o OP está usando?
Squazz 5/09/17
sim, ambos funcionarão da mesma maneira, é o mesmo que, em vez de usar a consulta CREATE Table, usamos o designer de tabela GUI do sql server para fazer Table, o BTS funcionará da mesma forma, um é o método de consulta e o outro é o método da GUI. use o que quiser.
Hassan Saeed #
O OP está afirmando claramente que ele consulta resulta em um erro. Como você está dizendo que isso é exatamente o mesmo que usando a consulta você não está dando uma resposta em tudo, você está apenas bagunçando e adicionando às muitas respostas erradas aqui
Squazz
0

Depois de entrar no modo de usuário único, um cliente pode estabelecer apenas UMA conexão com o SQL Server, lembre-se de que o "Pesquisador de Objetos" ocupa uma conexão (separada); portanto, se você estiver tentando executar uma instrução de Multiusuários em uma consulta janela, você receberá um erro de que, no modo de usuário único, não pode estabelecer outra conexão.

Para mim, esse não era o problema, no entanto, no meu caso, havia poucos processos automatizados que persistentemente (em poucos segundos) estabeleciam conexões, assim que coloquei o banco de dados no modo de usuário único e me desconectei, um dos os processos estabelecidos / ocupados da conexão (antes que eu pudesse iniciar minha operação de restauração). Assim que eu matava essas conexões - elas se reconectavam e quando eu executava o comando Restaurar, recebia o erro de que a conexão já está ocupada.

Para resolver isso, tive que escrever as killinstruções, alterar as User-Modeinstruções e Restoreoperações em uma única janela de consulta e quando as executei de uma só vez, pronto! funcionou.

Espero que isso ajude os outros.

Eddie Kumar
fonte
0

Eu estava tendo problemas com um banco de dados local.

Consegui resolver esse problema parando o servidor SQL, iniciando o servidor SQL e usando a interface do usuário do SSMS para alterar as propriedades do banco de dados para Multi_User.

O banco de dados entrou no modo "Usuário único" quando eu estava tentando restaurar um backup. Eu não havia criado um backup do banco de dados de destino antes de tentar restaurar (SQL 2017). isso o levará sempre.

Pare o SQL Server, inicie o SQL Server e execute os scripts acima ou use a interface do usuário.

hanzolo
fonte
0

Pesquisei a solução por um tempo e finalmente encontrei a solução abaixo,

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. (Fiz isso com EXEC (@kill); no modelo de código abaixo.)

Então,

Execute o SQL a seguir para definir o banco de dados no 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 voltar ao modo de usuário único, você pode usar:

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Isso deve funcionar. Feliz codificação !!

Obrigado!!

Trilok Pathak
fonte