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_sessions
sys.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_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>
или 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';