Como posso matar com segurança uma consulta MSSQL longa?

5

Recentemente, inserimos um trabalho SQL em um banco de dados. A consulta estava sendo executada por alguns dias sem necessidade, por isso foi morta usando o KILL SPID. O processo começou a retroceder por vários dias e pareceu ficar parado ali.

A execução de KILL SPID WITH STATUSONLY forneceu uma mensagem informando que "Conclusão estimada" foi de 100% e "Tempo estimado restante" de 0 segundo.

Eventualmente, tivemos que reiniciar o serviço SQL que removeu o processo.

Minha pergunta é: como você deve matar um processo SQL? É este o único caminho?

    
por Anonymous 16.06.2009 / 10:43

2 respostas

5

Você fez tudo certo, mas considerou o custo da reversão. Você disse que sua consulta estava em execução há dias, por isso teria escrito dias de dados nos arquivos de log como uma transação não confirmada. Ao matar a tarefa, você iniciou uma reversão e é isso que você precisa esperar.

Se você quiser eliminar a transação com menos impacto, considere agrupar as transações e fazer commits ocasionais. Se você puder evitar uma transação completa, isso seria melhor para trabalhos de longa duração.

    
por 16.06.2009 / 12:10
3

Eu vi um rollback "travar" como você descreve, e a única maneira de se livrar dele é reiniciar o serviço SQL, como você fez.

MAS é importante certificar-se de que o retrocesso esteja realmente travado, e não rolando de volta (como você viu, o WITH STATUSONLY não é totalmente confiável). O risco é que, se você reiniciar o serviço SQL enquanto a reversão ainda estiver rolando de volta , o banco de dados ficará preso no modo "recuperação" após a reinicialização do serviço SQL, até que a reversão seja concluída.

A única outra maneira que eu consegui dizer é usando o SQL Activity Monitor, e verificando se a contagem de CPU e / ou IO para o SPID ainda está avançando. Se estiver, a reversão ainda está em andamento e você não deve reiniciar o SQL ainda. Dê mais tempo.

Um ponto adicional : não fique tentado a fazer coisas malucas, como excluir o arquivo de log. Isso irá "parar" a reversão da transação, mas ao custo da integridade de seu banco de dados. A única outra técnica que usei (assumindo que a transação revertida é a única alteração importante do banco de dados desde o último backup) é simplesmente restaurar a partir do backup mais recente, que determinamos que seria mais rápido e mais fácil do que esperar um dia adicional para que uma reversão ocorra. Isso, é claro, depende muito da natureza da sua atividade de banco de dados.

    
por 27.06.2009 / 18:54