Dela via


KILL (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Avslutar en användarprocess som baseras på sessions-ID:t eller arbetsenheten (UOW). Om det angivna sessions-ID:t eller UOW har mycket arbete att ångra kan instruktionen KILL ta lite tid att slutföra. Processen tar längre tid att slutföra, särskilt när processen innebär att återställa en lång transaktion.

KILL avslutar en normal anslutning, vilket internt stoppar de transaktioner som är associerade med det angivna sessions-ID:t. Ibland kan Microsoft Distributed Transaction Coordinator (MS DTC) användas. Om MS DTC används kan du också använda -instruktionen för att avsluta överblivna och tveksamma distribuerade transaktioner.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database och Azure SQL Managed Instance:

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

Syntax för Azure Synapse Analytics, Analytics Platform System (PDW) och Microsoft Fabric:

KILL 'session_id'
[ ; ]

Arguments

session_id

Sessions-ID för processen som ska avslutas. session_id är en unik int som tilldelas till varje användaranslutning när anslutningen upprättas. Sessions-ID-värdet är kopplat till anslutningen under anslutningens varaktighet. När anslutningen är slut frigörs heltalsvärdet och kan tilldelas om till en ny anslutning.

Följande fråga kan hjälpa dig att identifiera det session_id som du vill döda:

 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

Identifierar enheten för arbets-ID (UOW) för distribuerade transaktioner. UOW är ett GUID som kan hämtas från request_owner_guid kolumnen i den sys.dm_tran_locks dynamiska hanteringsvyn. UOW kan också hämtas från felloggen eller via MS DTC-övervakaren. Mer information om övervakning av distribuerade transaktioner finns i MS DTC-dokumentationen.

Använd KILL <UOW> för att stoppa olösta distribuerade transaktioner. Dessa transaktioner är inte kopplade till något verkligt sessions-ID, utan associeras i stället artificiellt med sessions-ID = -2. Det här sessions-ID:t gör det enklare att identifiera olösta transaktioner genom att fråga sessions-ID-kolumnen i sys.dm_tran_locks, sys.dm_exec_sessionseller sys.dm_exec_requests dynamiska hanteringsvyer.

WITH STATUSONLY

Används för att generera en förloppsrapport för en angiven UOW eller session_id som återställs på grund av en tidigare KILL instruktion. KILL WITH STATUSONLY avslutar eller återställer inte UOW- eller sessions-ID:t. Kommandot visar endast den aktuella förloppet för återställningen.

WITH COMMIT

Används för att döda en olöst distribuerad transaktion med incheckning. Endast tillämpligt för distribuerade transaktioner, måste du ange en UOW för att använda det här alternativet. Mer information finns i Distribuerade transaktioner.

WITH ROLLBACK

Används för att döda en olöst distribuerad transaktion med återställning. Endast tillämpligt för distribuerade transaktioner, måste du ange en UOW för att använda det här alternativet. Mer information finns i Distribuerade transaktioner.

Remarks

KILL används ofta för att avsluta en process som blockerar andra viktiga processer med lås. KILL kan också användas för att stoppa en process som kör en fråga som använder nödvändiga systemresurser. Systemprocesser och processer som kör en utökad lagrad procedur kan inte avslutas.

Använd KILL noggrant, särskilt när kritiska processer körs. Du kan inte döda din egen process. Du bör inte heller avsluta följande processer:

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

Använd @@SPID för att visa sessions-ID-värdet (SPID) för den aktuella sessionen.

Om du vill hämta en rapport med aktiva sessions-ID-värden frågar du session_id kolumnen i vyerna sys.dm_tran_locks, sys.dm_exec_sessionsoch sys.dm_exec_requests dynamisk hantering. Du kan också visa kolumnen SPID som den sp_who system lagrade proceduren returnerar. Om en återställning pågår för ett specifikt sessions-ID anger cmdsp_whokolumnen i resultatuppsättningen KILLED/ROLLBACK för sessions-ID:t .

När en viss anslutning har ett lås på en databasresurs och blockerar förloppet för en annan anslutning visas sessions-ID:t för den blockerande anslutningen i kolumnen blocking_session_id i sys.dm_exec_requests eller kolumnen blk som returneras av sp_who.

Kommandot KILL kan användas för att lösa tveksamma distribuerade transaktioner. Dessa transaktioner är olösta distribuerade transaktioner som inträffar på grund av oplanerade omstarter av databasservern eller MS DTC-koordinatorn. Mer information om osäkra transaktioner finns i avsnittet "Two-Phase Commit" i Använda markerade transaktioner för att återställa relaterade databaser konsekvent.

Använd MED STATUSONLY

KILL WITH STATUSONLYgenererar en rapport om sessions-ID eller UOW återställs på grund av en tidigare KILL <session ID> instruktion.KILL <UOW> Förloppsrapporten anger hur mycket återställning som har slutförts (i procent) och den uppskattade tiden som återstår (i sekunder). Rapporten anger det i följande formulär:

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

Om återställningen av sessions-ID:t eller UOW slutförs innan instruktionen KILL <session ID> WITH STATUSONLY eller KILL <UOW> WITH STATUSONLY körs returnerar KILL ... WITH STATUSONLY följande fel:

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

Det här felet uppstår också om inget sessions-ID eller UOW återställs.

Samma statusrapport kan hämtas genom att upprepa samma KILL instruktion utan att använda alternativet WITH STATUSONLY . Vi rekommenderar dock inte att du upprepar alternativet på det här sättet. Om du upprepar en KILL <session_id> instruktion kan den nya processen stoppas om återställningen slutförs och sessions-ID:t omtilldelas till en ny aktivitet innan den nya KILL instruktionen körs. Förhindra att den nya processen stoppas genom att WITH STATUSONLYange .

Permissions

SQL Server: Kräver behörigheten ALTER ANY CONNECTION . ALTER ANY CONNECTION ingår i medlemskap i sysadmin - eller processadmin-rollerna för fast server.

SQL Database: Kräver behörigheten KILL DATABASE CONNECTION . Inloggningen för huvudkontot på servernivå har behörigheten KILL DATABASE CONNECTION .

Microsoft Fabric Data Warehouse: Kräver behörigheten Övervaka objekt eller medlemskap i rollen Arbetsyteadministratörer.

SQL-databas i Microsoft Fabric: Kräver behörigheten KILL DATABASE CONNECTION i SQL-databasmotorn eller behörigheten Skriv objekt i arbetsytan Infrastruktur.

Azure Synapse Analytics: Kräver administratörsbehörigheter.

Examples

A. Använda KILL för att stoppa en session

I följande exempel visas hur du stoppar sessions-ID 53.

KILL 53;
GO

B. Använda KILL-sessions-ID MED STATUSONLY för att hämta en förloppsrapport

I följande exempel genereras status för återställningsprocessen för det specifika sessions-ID:t.

KILL 54;
KILL 54 WITH STATUSONLY;
GO

Här är resultatet.

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

C. Använda KILL för att stoppa en överbliven distribuerad transaktion

I följande exempel visas hur du stoppar en överbliven distribuerad transaktion (sessions-ID = -2) med en UOWD5499C66-E398-45CA-BF7E-DC9C194B48CF.

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