Tarefa presa no estúdio de gerenciamento, como você lida com eles?

12

Depois de clicar em "Colocar o banco de dados offline" no estúdio de gerenciamento, essa mensagem permanece travada e não será fechada se você clicar em fechar.

https://i.imgur.com/KD6AROv.png

Qual é uma boa maneira de lidar com trabalhos bloqueados como esses no estúdio de gerenciamento? Você pode matá-los através do monitor de atividades? Devo procurar qual processo está impedindo a execução deste trabalho e finalizá-lo?

A_V
fonte
4
Descubra o que está bloqueando isso primeiro. Você pode obter essas informações em sys.dm_exec_requests. Além disso, seu trabalho pode fazer isso de uma maneira que não seja bloqueada, por exemplo, emitindo ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;primeiro ... caso contrário, ele fica parado e aguarda, e por um banco de dados ocupado, isso pode ser para sempre.
Aaron Bertrand
Definir o banco de dados em single_user resolveu o problema, eu deveria ter adivinhado ... O SQLserver sempre exige um único usuário para esse tipo de coisa.
A_V

Respostas:

12

Eu diria que nunca use a coisa "Take Offline" na GUI, a menos que você saiba que o banco de dados não está em uso. Por qualquer coisa. É difícil saber sem fazer algum trabalho braçal, então por que não salvar esse script em algum lugar e sempre usá-lo?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

E então o recíproco, é claro:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

O motivo pelo qual você precisa configurá-lo SINGLE_USERprimeiro é expulsar todos os usuários existentes (existe uma opção para fazer isso na caixa de diálogo desanexar, mas não na caixa de diálogo offline), pois o SQL Server precisa de acesso exclusivo ao banco de dados para poder offline. Agora, você pode fazer algum trabalho extra para ver quem está usando o banco de dados no momento, como se você fizesse isso no meio de uma grande operação de backup ou tarefa de ETL ou o que você tem, isso pode ser problemático.

EDIT : Eu ter apresentado uma sugestão em Conectar sobre isso (ver Ligação # 2687832 ) e também postou a Trello (arquivado em "Object Explorer").

Aaron Bertrand
fonte
E se a configuração de usuário único também falhar porque não é possível obter um bloqueio no banco de dados?
StackOverthrow
@ user560822 Você terá que esperar até conseguir um bloqueio no banco de dados. Se isso significa que você deve começar a matar sessões ...
Aaron Bertrand
7

Quando você já estiver em uma situação de suspensão, não se esqueça de que pode procurar conexões abertas no servidor com

sp_who2  

em outro banco de dados, como mestre.
Examine os resultados para qualquer lugar em que o banco de dados seja o que você está tentando colocar offline.
Observe o valor da coluna spid (identificação do processo) dessas linhas.

Um de cada vez, corra

kill  ##

onde "##" é o spid.

Certamente tome cuidado para garantir que esses processos não sejam importantes para deixar em execução ... eles serão encerrados sem sequer terminar o comando mais recente e sem aviso prévio.

Mike M
fonte
1
A resposta aceita não fez o truque para mim. Falha no primeiro comando. Esta resposta funciona perfeitamente. Obrigado
Cheburek
Isso é bom :) Sim, a resposta aceita é realmente para evitar a questão ... se você já está pendurado, você precisa de algo como este para matá-lo
Mike M