Encerrando Múltiplas Sessões no SQL Server de Forma Eficiente

Sergio BenderSergio Bender
4 min read

Gerenciar sessões ativas no SQL Server é uma tarefa comum para administradores de banco de dados (DBAs), especialmente em ambientes com muitas conexões de usuários ou aplicações. Recentemente, me deparei com um cenário onde mais de 800 sessões do usuário automacao estavam ativas, todas originadas do hostname bfabd787b658. Encerrar todas essas sessões manualmente seria impraticável. Neste artigo, vou compartilhar uma solução eficiente para identificar e encerrar múltiplas sessões no SQL Server usando T-SQL, além de boas práticas para evitar que isso se repita.

Por que tantas sessões?

Antes de encerrar as sessões, é importante entender por que tantas estão acumuladas.

Sessões em excesso podem ser causadas por:

  • Connection Pooling mal configurado: Aplicações que não fecham conexões adequadamente.

  • Aplicações legadas: Sistemas que criam novas conexões sem reutilizar as existentes.

  • Erros na lógica da aplicação: Conexões abertas sem fechamento devido a bugs ou má implementação.

No caso do usuário automacao, as sessões vinham de um hostname específico (bfabd787b658), sugerindo que uma aplicação ou serviço específico estava gerando esse comportamento.

Vamos ao passo a passo para resolver isso.

Identificando as Sessões

A stored procedure sp_who2 é uma ferramenta clássica para visualizar sessões ativas no SQL Server, mas para cenários com muitas sessões, a DMV (Dynamic Management View) sys.dm_exec_sessions é mais poderosa e flexível.

Com ela, podemos filtrar sessões por usuário, hostname, status e outros critérios.

Para listar todas as sessões do usuário automacao com o hostname bfabd787b658, use o seguinte comando:

SELECT session_id, login_name, host_name, status
FROM sys.dm_exec_sessions
WHERE login_name = 'automacao'
  AND host_name = 'bfabd787b658'
  AND session_id > 50;

O filtro session_id > 50 é importante para excluir sessões do sistema, que geralmente têm SPIDs menores ou iguais a 50. Esse comando retorna uma lista com os IDs das sessões (SPIDs), o nome do login, o hostname e o status (como running ou sleeping).

Encerrando as Sessões

Para encerrar todas as sessões de uma vez, podemos usar um script T-SQL que gera comandos KILL dinamicamente para cada SPID correspondente. Aqui está o script que utilizei:

DECLARE @SQL NVARCHAR(MAX) = '';

SELECT @SQL += 'KILL ' + CAST(session_id AS NVARCHAR(10)) + ';' + CHAR(13)
FROM sys.dm_exec_sessions
WHERE login_name = 'atautomacao'
  AND host_name = 'bfabd787b658'
  AND session_id > 50;

EXEC sp_executesql @SQL;

Como funciona?

  1. Construção dinâmica: O script concatena um comando KILL para cada session_id que atende aos critérios de filtro.

  2. Segurança: O filtro session_id > 50 evita encerrar sessões críticas do sistema.

  3. Execução: O comando sp_executesql executa a string gerada, encerrando todas as sessões de uma só vez.

Antes de executar, recomendo verificar quantas sessões serão afetadas com:

SELECT COUNT(*) AS TotalSessões
FROM sys.dm_exec_sessions
WHERE login_name = 'usr_batautomacao'
  AND host_name = 'bfabd787b658'
  AND session_id > 50;

No meu caso, o resultado confirmou as 800+ sessões, o que justificou a abordagem automatizada.

Cuidados ao Usar o KILL

Encerrar sessões com o comando KILL exige cuidado:

  • Permissões: Você precisa de permissões ALTER ANY CONNECTION ou ser um administrador (sysadmin).

  • Transações ativas: Sessões com transações abertas podem causar bloqueios ou roolbacks demorados. Verifique o status com sys.dm_exec_sessions (coluna status) para confirmar se as sessões estão inativas (sleeping).

  • Impacto na aplicação: Encerrar sessões pode interromper processos em execução. Certifique-se de que as sessões não estão executando tarefas críticas antes de prosseguir.

Prevenindo o Problema

Depois de encerrar as sessões, é crucial investigar a causa raiz. No meu caso, o hostname bfabd787b658 indicava que uma aplicação específica estava criando conexões em excesso. Algumas ações para prevenir isso incluem:

  • Revisar o Connection Pooling: Verifique as configurações de conexão na aplicação (como em .NET, Java ou outras linguagens). Ajuste o Max Pool Size e habilite o reuso de conexões.

  • Monitorar sessões: Use ferramentas como SQL Server Profiler ou Extended Events para monitorar a criação de novas sessões.

  • Configurar limites: Considere implementar o Resource Governor para limitar o número de conexões por usuário ou aplicação.

Verificando o Resultado

Após executar o script, confirme que as sessões foram encerradas:

EXEC sp_who2;

Se novas sessões continuarem aparecendo, investigue a aplicação ou serviço associado ao hostname bfabd787b658.

Ferramentas como o SQL Server Management Studio (SSMS) ou relatórios de atividade podem ajudar a identificar padrões.

0
Subscribe to my newsletter

Read articles from Sergio Bender directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergio Bender
Sergio Bender