Preciso reiniciar um banco de dados porque alguns processos não estão funcionando. Meu plano é colocá-lo offline e novamente online.
Estou tentando fazer isso no Sql Server Management Studio 2008:
use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go
Estou recebendo estes erros:
Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.
O que estou fazendo de errado?
sql
sql-server-2008
ssms
JOE SKEET
fonte
fonte
Respostas:
Depois de receber o erro, execute
Procure o banco de dados na lista. É possível que uma conexão não tenha sido encerrada. Se você encontrar alguma conexão com o banco de dados, execute
onde
<SPID>
é o SPID para as sessões conectadas ao banco de dados.Experimente o seu script depois que todas as conexões com o banco de dados forem removidas.
Infelizmente, não tenho uma razão para você estar vendo o problema, mas aqui está um link que mostra que o problema ocorreu em outro lugar.
http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-locklock-could-not-error-5061/
fonte
set single_user
tentativa ainda pendente.KILL
também não a resolveria.KILL (87)
resulta emMsg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.
erm ....Consegui reproduzir esse erro, fazendo o seguinte.
Conexão 1 (deixe em funcionamento por alguns minutos)
Conexões 2 e 3
fonte
Tente isso se estiver "em transição" ...
http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html
fonte
SET OFFLINE
declaração como mencionado pelo OP (talvez há situações em que trabalha, mas isso não aconteceu para mim)Vou adicionar isso aqui, caso alguém tenha a mesma sorte que eu.
Ao revisar a lista de processos sp_who2 , observe os processos que são executados não apenas no banco de dados afetado, mas também no mestre . No meu caso, o problema que estava bloqueando o banco de dados estava relacionado a um procedimento armazenado que iniciou um xp_cmdshell.
Verifique se você possui algum processo no estado KILL / RollBack para o banco de dados mestre
Se você tiver o mesmo problema, apenas o comando KILL provavelmente não ajudará. Você pode reiniciar o servidor SQL ou, melhor, encontrar o cmd.exe nos processos do Windows no sistema operacional SQL Server e matá-lo.
fonte
No SQL Management Studio, vá para Segurança -> Logins e clique duas vezes em seu Logon. Escolha Funções do servidor na coluna esquerda e verifique se sysadmin está marcado.
No meu caso, eu estava logado em uma conta sem esse privilégio.
HTH!
fonte
Matar o ID do processo funcionou muito bem para mim. Ao executar o comando "EXEC sp_who2" em uma nova janela de consulta ... e filtrar os resultados para o banco de dados "ocupado", a execução de processos com o comando "KILL" conseguiu executar o truque. Depois disso tudo funcionou novamente.
fonte
Só para adicionar meus dois centavos. Eu me coloquei na mesma situação, enquanto pesquisava os privilégios mínimos necessários de um login do db para executar com êxito a instrução:
Parece que a instrução ALTER é concluída com êxito , quando executada com um login sysadmin , mas requer a parte de limpeza de conexões, quando executada sob um login que possui "apenas" permissões limitadas, como:
PS: Passei horas tentando descobrir por que o "ALTER DATABASE .." não funciona quando executado sob um logon que possui privilégios de função dbcreator + ALTER ANY DATABASE . Aqui está o meu thread do MSDN !
fonte
Sei que este é um post antigo, mas recentemente tive um problema muito semelhante. Infelizmente, não pude usar nenhum dos comandos alter database porque um bloqueio exclusivo não pôde ser colocado. Mas nunca consegui encontrar uma conexão aberta com o db. Eventualmente, tive que excluir com força o estado de integridade do banco de dados para forçá-lo a um estado de restauração em vez de em recuperação.
fonte
Em casos raros (por exemplo, depois que uma transação pesada é confirmada), um processo do sistema CHECKPOINT em execução mantendo um bloqueio FILE no arquivo do banco de dados impede a transição para o modo MULTI_USER.
fonte
No meu cenário, não houve processo bloqueando o banco de dados em sp_who2. No entanto, descobrimos, porque o banco de dados é muito maior do que os outros bancos de dados, que os processos pendentes ainda estavam em execução, e é por isso que o banco de dados no grupo de disponibilidade ainda é exibido em vermelho / offline depois de tentarmos 'retomar dados' clicando com o botão direito do mouse no banco de dados em pausa.
Para verificar se você ainda possui processos em execução, basta executar este comando: selecione porcentagem concluída em sys.dm_exec_requests em que percent_complete> 0
fonte