Поделиться через


KILL (Transact-SQL)

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

В SQL Server 2000 и более поздних версиях с помощью инструкции KILL можно завершить нормальное соединение, которое внутренне завершит транзакции, связанные с заданным идентификатором сеанса. Эту инструкцию также можно применять для завершения потерянных и сомнительных распределенных транзакций при использовании координатора распределенных транзакций (Майкрософт) (MS DTC).

Значок ссылки на разделСоглашение о синтаксисе в Transact-SQL

Синтаксис

KILL { session ID | UOW } [ WITH STATUSONLY ] 

Аргументы

  • session ID
    Идентификатор сеанса завершаемого процесса. Аргумент session ID представляет собой уникальное целое число (int), которое назначается каждому соединению пользователя при выполнении подключения. Значение идентификатора сеанса остается привязанным к соединению в течение всего времени соединения. По окончании соединения данное целое значение освобождается и может быть присвоено другому соединению.

    Используйте инструкцию KILL 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
    Создает отчет о состоянии для конкретного session ID или UOW, который выполняет откат из-за выполненной ранее инструкции KILL. Инструкция KILL WITH STATUSONLY не завершает и не откатывает session ID или 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 session ID|UOW. Отчет о состоянии отображает процесс выполнения отката (в процентах), а также выводит ожидаемое время до окончания операции (в секундах) в следующей форме:

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

Если откат сеанса или UOW к моменту выполнения инструкции KILL session ID|UOW WITH STATUSONLY уже завершен либо процедура отката в данный момент не выполняется, выполнение инструкции KILL session ID|UOW WITH STATUSONLY возвращает следующую ошибку:

«Сообщение 6120, уровень 16, состояние 1, строка 1».

«Состояние выполнения отчета не может быть получено. Операция отката для процесса с идентификатором <session ID> не выполняется».

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

Разрешения

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

Примеры

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

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

KILL 53;
GO

Б. Использование инструкции KILL SPID WITH STATUSONLY для получения отчета о состоянии

В данном примере создается отчет о состоянии процесса отката указанного сеанса.

KILL 54;
KILL 54 WITH STATUSONLY;
GO

--This is the progress report.
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.

В. Применение инструкции KILL для завершения потерянной распределенной транзакции

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

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

Журнал изменений

Обновленное содержимое

Представлено более подробное разрешение на инструкцию.