KILL (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft Fabric

Termina un processo utente in base all'ID di sessione o all'unità di lavoro (UOW, Unit Of Work). Se l'ID sessione specificato o UOW ha molto lavoro da annullare, l'istruzione KILL può richiedere del tempo. soprattutto quando implica il rollback di una transazione lunga.

KILL termina una connessione normale, che arresta internamente le transazioni associate all'ID sessione specificato. A volte può essere in uso Microsoft Distributed Transaction Coordinator (MSDTC). In tal caso, è anche possibile usare l'istruzione per terminare le transazioni distribuite orfane e in dubbio.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure:

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

Sintassi per Azure Synapse Analytics, Platform System (PDW) e Microsoft Fabric:

KILL 'session_id'
[ ; ]

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

session_id

ID sessione del processo da terminare. session_idè un valore int univoco assegnato a ogni connessione utente quando viene stabilita la connessione. Il valore dell'ID di sessione rimane associato alla connessione per tutta la durata della connessione. Al termine della connessione, il valore intero viene rilasciato ed è possibile riassegnarlo a una nuova connessione.

La query seguente consente di identificare il session_id che si intende eliminare:

 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 l'unità di ID di lavoro (UOW) delle transazioni distribuite. UOW è un GUID che può essere ottenuto dalla request_owner_guid colonna della sys.dm_tran_locks visualizzazione a gestione dinamica. È anche possibile ottenere il valore UOW dal log degli errori o tramite il monitoraggio MS DTC. Per ulteriori informazioni sul monitoraggio di transazioni distribuite, vedere la documentazione di MS DTC.

Usare KILL <UOW> per arrestare le transazioni distribuite non risolte. Queste transazioni non sono associate ad alcun ID sessione reale, ma sono invece associate artificialmente all'ID sessione = -2. Questo ID sessione semplifica l'identificazione delle transazioni non risolte eseguendo una query sulla colonna ID sessione in sys.dm_tran_locks, sys.dm_exec_sessionso sys.dm_exec_requests viste a gestione dinamica.

WITH STATUSONLY

Consente di generare un report di stato per un UOW specificato o session_id di cui viene eseguito il rollback a causa di un'istruzione precedenteKILL. KILL WITH STATUSONLY non termina o esegue il rollback dell'ID sessione o UOW. Il comando visualizza esclusivamente lo stato corrente del rollback.

WITH COMMIT

Usato per terminare una transazione distribuita non risolta con commit. Applicabile solo alle transazioni distribuite, per usare questa opzione è necessario specificare un valore per UOW. Per altre informazioni, vedere Transazioni distribuite.

WITH ROLLBACK

Usato per terminare una transazione distribuita non risolta con il rollback. Applicabile solo alle transazioni distribuite, per usare questa opzione è necessario specificare un valore per UOW. Per altre informazioni, vedere Transazioni distribuite.

Osservazioni:

KILL viene comunemente usato per terminare un processo che blocca altri processi importanti con blocchi. KILL può essere usato anche per arrestare un processo che esegue una query che usa le risorse di sistema necessarie. I processi di sistema e i processi che eseguono una stored procedure estesa non possono essere terminati.

Usare KILL attentamente, soprattutto quando i processi critici sono in esecuzione. Non è possibile terminare un proprio processo. Inoltre, è consigliabile non terminare i processi seguenti:

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

Usare @@SPID per visualizzare il valore dell'ID sessione per la sessione corrente.

Per ottenere un report di valori ID sessione attivi, eseguire una query sulla session_id colonna delle sys.dm_tran_locksviste a gestione dinamica , sys.dm_exec_sessionse sys.dm_exec_requests . È anche possibile visualizzare la SPID colonna restituita dalla sp_who stored procedure di sistema. Se è in corso un rollback per uno specifico SPID, la cmd colonna nel sp_who set di risultati per tale SPID indica KILLED/ROLLBACK.

Quando una determinata connessione mantiene attivo un blocco su una risorsa del database e blocca l'avanzamento di un'altra connessione, l'ID di sessione della connessione di blocco viene visualizzato nella colonna blocking_session_id di sys.dm_exec_requests o nella colonna blk restituita da sp_who.

Il KILL comando può essere usato per risolvere le transazioni distribuite in dubbio. Queste sono le transazioni distribuite non risolte che si verificano in seguito a riavvii non pianificati del server di database o di MS DTC. Per altre informazioni sulle transazioni in dubbio, vedere la sezione "Commit in due fasi" in Usare transazioni contrassegnate per recuperare in modo coerente i database correlati.

Usare WITH STATUSONLY

KILL WITH STATUSONLYgenera un report se l'ID sessione o UOW esegue il rollback a causa di un'istruzione o KILL <UOW> precedenteKILL <session ID>. Il report di stato indica la percentuale di rollback completata e il periodo di tempo rimanente, espresso in secondi, nel formato seguente:

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

Se il rollback dell'ID sessione o UOW termina prima dell'esecuzione dell'istruzione KILL <session ID> WITH STATUSONLY o KILL <UOW> WITH STATUSONLY , KILL ... WITH STATUSONLY restituisce l'errore seguente:

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

Questo errore si verifica anche se non viene eseguito il rollback di alcun ID sessione o UOW.

È possibile ottenere lo stesso rapporto di stato ripetendo la stessa KILL istruzione senza usare l'opzione WITH STATUSONLY . Tuttavia, non è consigliabile ripetere l'opzione in questo modo. Se si ripete un'istruzione KILL <session_id> , il nuovo processo potrebbe arrestarsi se il rollback termina e l'ID sessione viene riassegnato a una nuova attività prima dell'esecuzione della nuova KILL istruzione. Impedire che il nuovo processo venga arrestato specificando WITH STATUSONLY.

Autorizzazioni

SQL Server: richiede l'autorizzazione ALTER ANY CONNECTION . ALTER ANY CONNECTIONè incluso nell'appartenenza ai ruoli predefiniti del server sysadmin o processadmin.

database SQL: Richiede l'autorizzazione KILL DATABASE CONNECTION . L'account di accesso dell'entità a livello di server dispone dell'autorizzazione KILL DATABASE CONNECTION .

Microsoft Fabric: richiede autorizzazioni Amministrazione.

Azure Synapse Analytics: richiede autorizzazioni Amministrazione.

Esempi

R. Usare KILL per arrestare una sessione

L'esempio seguente illustra come arrestare l'ID di sessione 53.

KILL 53;
GO

B. Usare KILL SESSION ID WITH STATUSONLY per ottenere un report di stato

Nell'esempio seguente viene generato un report di stato del processo di rollback per l'ID di sessione specifico.

KILL 54;
KILL 54 WITH STATUSONLY;
GO

Questo è il set di risultati.

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

C. Usare KILL per arrestare una transazione distribuita orfana

Nell'esempio seguente viene illustrato come arrestare una transazione distribuita orfana (ID sessione = -2) con un UOW di D5499C66-E398-45CA-BF7E-DC9C194B48CF.

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