KILL (Transact-SQL)

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

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

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

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

Синтаксис

Синтаксис для SQL Server, базы данных SQL Azure или управляемого экземпляра SQL Azure:

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

Синтаксис Для Azure Synapse Analytics, системы платформы аналитики (PDW) и Microsoft Fabric:

KILL 'session_id'
[ ; ]

Аргументы

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

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

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_id столбец столбца sys.dm_tran_lockssys.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> или KILL <UOW> инструкции. Отчет о состоянии отображает процесс выполнения отката (в процентах), а также выводит ожидаемое время до окончания операции (в секундах). В отчете это отображается в следующей форме:

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

Если откат идентификатора сеанса или UOW завершается до KILL <session ID> WITH STATUSONLY KILL <UOW> 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.

Один и тот же отчет о состоянии можно получить, повторяя одну и ту же KILL инструкцию без использования WITH STATUSONLY параметра. Однако не рекомендуется повторно выполнять эту инструкцию таким образом. Если повторить KILL <session_id> инструкцию, новый процесс может остановиться, если откат завершится, и идентификатор сеанса переназначен новой задаче перед запуском новой 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 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) с помощью UOWD5499C66-E398-45CA-BF7E-DC9C194B48CF.

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