KILL (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в Microsoft Fabric

Завершает пользовательский процесс, определяемый идентификатором сеанса или единицей работы (UOW). Если для завершения процесса, указанного с помощью идентификатора сеанса или UOW, необходимо отменить большое количество операций, для выполнения инструкции KILL может понадобиться значительное время. Процесс особенно затягивается при откате длительной транзакции.

Инструкция KILL завершает нормальное подключение, которое внутренне прерывает транзакции, связанные с заданным идентификатором сеанса. Иногда координатор распределенных транзакций Майкрософт (MS DTC) может использоваться. Когда он используется, эту инструкцию также можно применять для завершения потерянных и сомнительных распределенных транзакций.

Соглашения о синтаксисе Transact-SQL

Синтаксис

-- Syntax for SQL Server  
  
KILL { session ID [ WITH STATUSONLY ] | UOW [ WITH STATUSONLY | COMMIT | ROLLBACK ] }    

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
  
KILL 'session_id'  
[;]   

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

Идентификатор сеанса
Идентификатор сеанса завершаемого процесса. 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 представляет собой идентификатор GUID, который можно получить из столбца request_owner_guid динамического административного представления sys.dm_tran_locks. UOW также может быть получен из журнала ошибок или из монитора транзакций MS DTC. Дополнительные сведения о наблюдении за распределенными транзакциями см. в руководстве пользователя MS DTC.

Чтобы прервать неразрешенные распределенные транзакции, используйте инструкцию KILL <UOW>. Эти транзакции не связаны с идентификаторами реальных сеансов, но искусственно связаны с идентификатором сеанса -2. Этот идентификатор упрощает поиск неразрешенных транзакций с помощью запроса столбца идентификатора сеанса из динамических административных представлений sys.dm_tran_locks, sys.dm_exec_sessions или sys.dm_exec_requests.

WITH STATUSONLY
Создает отчет о состоянии для указанного UOW или session_id, которые отменяются из-за выполненной ранее инструкции KILL. Инструкция KILL WITH STATUSONLY не завершает и не откатывает UOW или сеанс с определенным идентификатором. Команда только отображает текущее состояние отката.

WITH COMMIT
Используется для завершения неразрешенной распределенной транзакции с фиксацией. Применяется только к распределенным транзакциям и требует указания UOW. Дополнительные сведения см. в разделе о распределенных транзакциях.

WITH ROLLBACK
Используется для завершения неразрешенной распределенной транзакции с откатом. Применяется только к распределенным транзакциям и требует указания UOW. Дополнительные сведения см. в разделе о распределенных транзакциях.

Замечания

Инструкция KILL обычно используется для прерывания процессов, блокирующих другие важные процессы или выполняющих запросы, занимающие необходимые системные ресурсы. Системные процессы и процессы, выполняющие расширенные хранимые процедуры, не могут быть прерваны.

Инструкцию KILL необходимо использовать осторожно, особенно при выполнении критических процессов. Существует опасность прерывания собственного процесса. Не следует также прерывать следующие процессы:

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

Используйте @@SPID для отображения значения идентификатора сеанса для текущего сеанса.

Чтобы получить отчет о значениях идентификаторов активных сеансов, можно запросить столбец session_id из динамических административных представлений sys.dm_tran_locks, sys.dm_exec_sessions и sys.dm_exec_requests. Можно также посмотреть столбец SPID, возвращаемый системной хранимой процедурой sp_who. Если откат выполняется для конкретного SPID, столбец cmd результирующего набора процедуры sp_who для этого SPID будет содержать значение KILLED/ROLLBACK.

Если какое-либо соединение имеет блокировку на ресурс базы данных и блокирует обработку остальных соединений, идентификаторы сеансов заблокированных соединений появятся в столбце blocking_session_id представления sys.dm_exec_requests или в столбце blk, возвращенном хранимой процедурой sp_who.

Инструкцию KILL можно применять для решения проблем с сомнительными распределенными транзакциями. Эти транзакции представляют собой неразрешимые распределенные транзакции, возникшие в результате незапланированных повторных стартов сервера баз данных или координатора MS DTC. Дополнительные сведения о сомнительных транзакциях см. в разделе "Двухфазная фиксация" в статье Использование помеченных транзакций для согласованного восстановления связанных баз данных (модель полного восстановления).

Использование предложения WITH STATUSONLY

Инструкция KILL WITH STATUSONLY создает отчет, если для сеанса или UOW выполняется откат, вызванный введенной ранее инструкцией KILL ИД сеанса|единица работы. Отчет о состоянии отображает процесс выполнения отката (в процентах), а также выводит ожидаемое время до окончания операции (в секундах). В отчете это отображается в следующей форме:

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

Если откат единицы работы или сеанса по ИД завершается до выполнения инструкции KILL ИД сеанса|UOW WITH STATUSONLY, выполнение инструкции KILL ИД сеанса|UOW 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 не выполняется,

Аналогичный отчет о состоянии может быть получен при повторном выполнении инструкции KILL ИД сеанса|UOW без использования параметра WITH STATUSONLY. Однако не рекомендуется повторно выполнять эту инструкцию таким образом. Повторный вызов инструкции KILL ИД сеанса может прервать новый процесс в случае, если процесс отката был завершен, а значение идентификатора сеанса было присвоено другой задаче до запуска новой инструкции KILL. Указание параметра WITH STATUSONLY предотвращает указанные последствия.

Разрешения

SQL Server: требуется разрешение ALTER ANY CONNECTION. Разрешение ALTER ANY CONNECTION включено с членством в предопределенных ролях сервера sysadmin или processadmin.

База данных SQL: Требуется разрешение KILL DATABASE CONNECTION. Имя входа субъекта серверного уровня имеет разрешение KILL DATABASE CONNECTION.

Microsoft Fabric: требуется Администратор разрешения.

Azure Synapse Analytics: требуется Администратор разрешения.

Примеры

А. Использование инструкции KILL для остановки сеанса

В следующем примере показана остановка сеанса с идентификатором 53.

KILL 53;  
GO  

B. Использование инструкции KILL SPID 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 для прерывания потерянной распределенной транзакции

Следующий пример показывает, как прервать потерянную распределенную транзакцию (идентификатор сеанса: -2) с UOW, равным D5499C66-E398-45CA-BF7E-DC9C194B48CF.

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

См. также

KILL STATS JOB (Transact-SQL)
KILL QUERY NOTIFICATION SUBSCRIPTION (Transact-SQL)
Встроенные функции (Transact-SQL)
ЗАВЕРШЕНИЕ РАБОТЫ (Transact-SQL)
@@SPID (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_sessions (Transact-SQL)
sys.dm_tran_locks (Transact-SQL)
sp_lock (Transact-SQL)
sp_who (Transact-SQL)