KILL (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

根據工作階段識別碼或工作單位 (UOW) 來結束使用者處理序。 如果指定的會話標識碼或 UOW 有許多工作要復原, KILL 語句可能需要一些時間才能完成。 特別是當牽涉到復原較長的交易時,處理序需要花較長時間來完成。

KILL 結束一般連線,這會在內部停止與指定會話標識符相關聯的交易。 有些時候 Microsoft 分散式交易協調器 (MS DTC) 可能為使用中。 如果 MS DTC 處於使用中,您也可以使用此陳述式來結束孤立和不確定的分散式交易。

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL Database、Azure SQL 受控執行個體的語法:

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

Azure Synapse Analytics、Analytics Platform System (PDW) 和 Microsoft Fabric 的語法:

KILL 'session_id'
[ ; ]

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

session_id

要結束之進程的會話標識碼。 session_id 是唯 一的 int ,會在建立連接時指派給每個用戶連線。 在連接持續時間,工作階段識別碼值會繫結連接。 當連接結束時,會釋出這個整數值,它可以重新指派給新的連接。

下列查詢可協助識別您想要終止的 session_id

 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

識別分散式交易的工作標識碼 (UOW) 單位。 UOW 是從動態管理檢視的數據行取得 request_owner_guidsys.dm_tran_locks GUID。 您也可以從錯誤記錄檔或透過 MS DTC 監視器來取得 UOW。 如需有關監視分散式交易的詳細資訊,請參閱 MS DTC 文件集。

用來 KILL <UOW> 停止未解析的分散式交易。 這些交易不會與任何實際會話標識符相關聯,而是以人為方式與會話標識碼 = -2相關聯。 此工作階段識別碼可讓您更輕鬆地藉由查詢、 sys.dm_exec_sessionssys.dm_exec_requests 動態管理檢視中的sys.dm_tran_locks會話識別碼資料行來識別未解析的交易。

WITH STATUSONLY

用來為指定的 UOW 產生進度報告,或 session_id 因為先前的 KILL 語句而復原。 KILL WITH STATUSONLY 不會結束或回復UOW或會話標識碼。 此命令只會顯示目前的復原進度。

WITH COMMIT

用來終止具有認可之未解析的分散式交易。 僅適用於分散式交易,您必須指定 UOW 才能使用此選項。 如需詳細資訊,請參閱 分散式交易

WITH ROLLBACK

用來終止復原未解析的分散式交易。 僅適用於分散式交易,您必須指定 UOW 才能使用此選項。 如需詳細資訊,請參閱 分散式交易

備註

KILL 通常用來結束封鎖其他具有鎖定之重要進程的進程。 KILL 也可以用來停止執行使用必要系統資源的查詢的進程。 系統處理序和執行擴充預存程序的處理序無法結束。

請小心使用 KILL ,尤其是在重要進程執行時。 您無法終止自己的處理序。 您也不應終止下列處理序:

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

用來 @@SPID 顯示目前工作階段的會話標識碼值。

若要取得使用中會話標識符值的報表,請查詢 session_idsys.dm_exec_sessionssys.dm_exec_requests 動態管理檢視的數據sys.dm_tran_locks行。 您也可以檢視 SPID 系統預存程式傳回的數據行 sp_who 。 如果特定 SPID 正在進行復原, cmd 該 SPID 結果集中的數據行 sp_whoKILLED/ROLLBACK指出 。

當特定連接對資料庫資源有鎖定並封鎖另一個連接的進度時,封鎖連接的工作階段識別碼會出現在 blocking_session_idsys.dm_exec_requests 資料行或是由 blk 傳回的 sp_who 資料行中。

KILL命令可用來解決不確定的分散式交易。 這些交易是未解決的分散式交易,之所以會發生是因為資料庫伺服器或 MS DTC 協調器發生了非計畫的重新啟動。 如需不確定交易的詳細資訊,請參閱使用標示的交易以一致方式復原相關資料庫的一節

使用WITH STATUSONLY

KILL WITH STATUSONLY 如果會話標識碼或 UOW 因為先前 KILL <session ID>KILL <UOW> 語句而回復,則會產生報告。 進度報告會指出已完成的復原量 (百分比) 及估計的剩下時間長度 (以秒為單位)。 報表會以下列形式將其指出:

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

如果會話識別碼或 UOW 的復原在 或 KILL <UOW> WITH STATUSONLY 語句執行之前KILL <session ID> WITH STATUSONLY完成,KILL ... WITH STATUSONLY則傳回下列錯誤:

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

如果未回復任何會話標識碼或UOW,也會發生此錯誤。

您可以重複相同的語句而不使用 WITH STATUSONLY 選項來取得相同的KILL狀態報告。 不過,不建議您透過此方式重複該選項。 如果您重複 KILL <session_id> 語句,則如果回復完成,而且會話標識碼會在新 KILL 語句執行之前重新指派給新工作,新的進程可能會停止。 藉由指定 WITH STATUSONLY來防止新進程停止。

權限

SQL Server: 需要 ALTER ANY CONNECTION 許可權。 ALTER ANY CONNECTION包含在系統管理員或 processadmin 固定伺服器角色的成員資格中

SQL 資料庫:KILL DATABASE CONNECTION需要許可權。 伺服器層級主體登入具有 KILL DATABASE CONNECTION 許可權。

Microsoft Fabric:需要 管理員 許可權。

Azure Synapse Analytics:需要 管理員 許可權。

範例

A. 使用KILL停止會話

下列範例示範如何停止工作階段識別碼 53

KILL 53;
GO

B. 使用KILL會話標識碼WITH STATUSONLY取得進度報告

下列範例會產生特定工作階段識別碼的回復處理序狀態。

KILL 54;
KILL 54 WITH STATUSONLY;
GO

以下為結果集。

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

C. 使用KILL停止孤立的分散式交易

下列範例示範如何使用 的 UOWD5499C66-E398-45CA-BF7E-DC9C194B48CF停止孤立的分散式交易 (會話識別碼 = -2

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