Partilhar via


KILL (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric

Encerra um processo de usuário baseado na ID da sessão ou na UOW (unidade de trabalho). Se a ID de sessão especificada ou UOW tiver muito trabalho para desfazer, a KILL instrução pode levar algum tempo para ser concluída. O processo levará mais tempo para ser concluído, especialmente quando envolver reversão de uma transação longa.

KILL termina uma conexão normal, que interrompe internamente as transações associadas à ID de sessão especificada. Às vezes, o Coordenador de Transações Distribuídas da Microsoft (MS DTC) pode estar em uso. Se o MS DTC estiver em uso, você também poderá usar a instrução para encerrar transações distribuídas órfãs e incertas.

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe do SQL Server, do Banco de Dados SQL do Azure ou de uma Instância Gerenciada de SQL do Azure:

KILL { session_id [ WITH STATUSONLY ] | UOW [ WITH STATUSONLY | COMMIT | ROLLBACK ] }
[ ; ]

Sintaxe para Azure Synapse Analytics, PDW (Analytics Platform System) e Microsoft Fabric:

KILL 'session_id'
[ ; ]

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

session_id

A ID da sessão do processo a ser finalizado. session_idé um int exclusivo que é atribuído a cada conexão de usuário quando a conexão é feita. O valor do ID de sessão está vinculado à conexão pela duração da conexão. Quando a conexão for finalizada, o valor inteiro será liberado e poderá ser reatribuído a uma nova conexão.

A seguinte consulta pode ajudá-lo a identificar o session_id que você deseja encerrar:

 SELECT conn.session_id, host_name, program_name,
     nt_domain, login_name, connect_time, last_request_end_time
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
    ON sess.session_id = conn.session_id;

UOW

Identifica a unidade de ID de trabalho (UOW) de transações distribuídas. UOW é um GUID que pode ser obtido da request_owner_guid coluna da exibição de sys.dm_tran_locks gerenciamento dinâmico. UOW também pode ser obtido no log de erros ou por meio do monitor do MS DTC. Para obter mais informações sobre como monitorar transações distribuídas, consulte a documentação do MS DTC.

Use KILL <UOW> para interromper transações distribuídas não resolvidas. Essas transações não estão associadas a nenhum ID de sessão real, mas são associadas artificialmente ao ID de sessão = -2. Essa ID de sessão facilita a identificação de transações não resolvidas consultando a coluna ID da sessão em sys.dm_tran_locks, sys.dm_exec_sessionsou sys.dm_exec_requests exibições de gerenciamento dinâmico.

WITH STATUSONLY

Usado para gerar um relatório de progresso para um UOW especificado ou session_id que está sendo revertido devido a uma instrução anteriorKILL. KILL WITH STATUSONLY não encerra nem reverte o UOW ou a ID da sessão. O comando exibe somente o progresso atual da reversão.

WITH COMMIT

Usado para matar uma transação distribuída não resolvida com confirmação. Aplicável somente a transações distribuídas, especifique um UOW para usar essa opção. Para obter mais informações, consulte Transações distribuídas.

WITH ROLLBACK

Usado para matar uma transação distribuída não resolvida com reversão. Aplicável somente a transações distribuídas, especifique um UOW para usar essa opção. Para obter mais informações, consulte Transações distribuídas.

Comentários

KILL é comumente usado para encerrar um processo que está bloqueando outros processos importantes com bloqueios. KILL também pode ser usado para interromper um processo que está executando uma consulta que está usando os recursos necessários do sistema. Os processos do sistema e os processos executando um procedimento armazenado estendido não podem ser encerrados.

Use KILL com cuidado, especialmente quando processos críticos estão em execução. Você não pode encerrar o seu próprio processo. Assim como não deve encerrar os seguintes processos:

  • AWAITING COMMAND
  • CHECKPOINT SLEEP
  • LAZY WRITER
  • LOCK MONITOR
  • SIGNAL HANDLER

Use @@SPID para exibir o valor de ID da sessão atual.

Para obter um relatório de valores de ID de sessão ativos, consulte a session_idsys.dm_tran_lockscoluna dos modos de exibição de gerenciamento dinâmico e sys.dm_exec_sessionssys.dm_exec_requests , . Você também pode exibir a SPID coluna que o procedimento armazenado do sp_who sistema retorna. Se uma reversão estiver em andamento para um SPID específico, a cmd coluna no conjunto de sp_who resultados para esse SPID indicará KILLED/ROLLBACK.

Quando uma conexão específica tiver um bloqueio em um recurso de banco de dados e bloquear o andamento de outra conexão, a ID da sessão da conexão responsável pelo bloqueio será mostrada na coluna blocking_session_id de sys.dm_exec_requests ou na coluna blk retornada por sp_who.

O KILL comando pode ser usado para resolver transações distribuídas em dúvida. Essas transações são do tipo distribuídas não resolvidas que ocorrem devido a reinícios não planejados do servidor de banco de dados ou do coordenador do MS DTC. Para obter mais informações sobre transações em dúvida, consulte a seção "Confirmação de duas fases" em Usar transações marcadas para recuperar bancos de dados relacionados de forma consistente.

Usar WITH STATUSONLY

KILL WITH STATUSONLYgera um relatório se a ID da sessão ou UOW for revertida devido a uma instrução ou KILL <UOW> anteriorKILL <session ID>. O relatório de progresso indica a quantidade concluída da reversão (em porcentagem) e o período de tempo restante estimado (em segundos). O relatório indica isso da seguinte forma:

Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: <yy>% Estimated time left: <zz> seconds

Se a reversão da ID da sessão ou UOW terminar antes da execução da KILL <session ID> WITH STATUSONLY instrução or KILL <UOW> WITH STATUSONLY , KILL ... WITH STATUSONLY retornará o seguinte erro:

"Msg 6120, Level 16, State 1, Line 1"
"Status report cannot be obtained. Rollback operation for Process ID <session ID> is not in progress."

Esse erro também ocorre se nenhuma ID de sessão ou UOW estiver sendo revertido.

O mesmo relatório de status pode ser obtido repetindo a mesma KILL instrução sem usar a WITH STATUSONLY opção. No entanto, não é recomendável repetir a opção dessa maneira. Se você repetir uma KILL <session_id> instrução, o novo processo poderá ser interrompido se a reversão for concluída e a ID da sessão for reatribuída a uma nova tarefa antes da execução da nova KILL instrução. Impedir que o novo processo seja interrompido especificando WITH STATUSONLY.

Permissões

SQL Server: Requer a ALTER ANY CONNECTION permissão. ALTER ANY CONNECTION está incluído com a associação nas funções de servidor fixas sysadmin ou processadmin .

Banco de dados SQL: requer a KILL DATABASE CONNECTION permissão. O logon da entidade de segurança no nível do servidor tem a KILL DATABASE CONNECTION permissão.

Microsoft Fabric: requer permissões de Administração.

Azure Synapse Analytics: requer permissões de administrador.

Exemplos

R. Usar KILL para interromper uma sessão

O exemplo a seguir mostra como interromper a ID de sessão 53.

KILL 53;
GO

B. Use a ID da sessão KILL com statusonly para obter um relatório de progresso

O exemplo a seguir gera um status do processo de reversão para o ID de sessão específico.

KILL 54;
KILL 54 WITH STATUSONLY;
GO

Este é o conjunto de resultados.

spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.

C. Usar KILL para interromper uma transação distribuída órfã

O exemplo a seguir mostra como parar uma transação distribuída órfã (ID de sessão = -2) com um UOW de D5499C66-E398-45CA-BF7E-DC9C194B48CF.

KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF';