KILL (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse 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'
[ ; ]
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_sessions
o 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_locks
viste a gestione dinamica , sys.dm_exec_sessions
e 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 STATUSONLY
genera 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 di amministratore.
Azure Synapse Analytics: richiede autorizzazioni di amministratore.
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
Il set di risultati è il seguente.
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';