Как я могу безопасно убить долго выполняющийся запрос MSSQL?
Недавно у нас была вставка задания SQL в базу данных. Запрос выполнялся в течение нескольких дней без необходимости, поэтому он был убит с помощью KILL SPID. Затем процесс начал откатываться на несколько дней и, казалось, просто зависал там.
Запуск команды KILL SPID WITH STATUSONLY дал сообщение о том, что "Ожидаемое завершение" составило 100%, а "Предполагаемое оставшееся время" - 0 секунд.
В конце концов нам пришлось перезапустить службу SQL, которая удалила процесс.
Мой вопрос - как вы должны убить процесс SQL? Это единственный способ?
2 ответа
Вы все сделали правильно, но вы уже учли стоимость отката. Вы сказали, что ваш запрос выполнялся в течение нескольких дней, поэтому он записал бы дни данных в файлы журнала в виде незафиксированной транзакции. Убив задачу, вы инициировали откат, и это то, что вам нужно ждать.
Если вы хотите иметь возможность убить транзакцию с меньшим воздействием, рассмотрите возможность пакетирования транзакций и выполнения случайных коммитов. Если вы можете вообще избежать транзакции, это будет лучше для продолжительных заданий.
Я видел откат "зависания", как вы описали, и единственный способ избавиться от него - перезапустить службу SQL, как вы это сделали.
НО важно удостовериться, что откат действительно зависает, а не откатывается назад (как вы видели, WITH STATUSONLY не совсем надежен). Риск состоит в том, что если вы перезапустите службу SQL, когда откат все еще будет откатываться, то база данных будет зависать в режиме "восстановления" после перезапуска службы SQL до тех пор, пока откат не будет завершен.
Единственный другой способ, который я смог сказать, - это обновить монитор активности SQL и посмотреть, продолжает ли подсчитываться количество ЦП и / или ввода-вывода для SPID. Если это так, то откат все еще выполняется, и вам пока не нужно перезапускать SQL. Дай больше времени.
Еще один момент: не поддавайтесь искушению делать сумасшедшие вещи, такие как удаление файла журнала. Это "остановит" откат транзакции, но за счет целостности вашей базы данных. Единственный другой метод, который я использовал (предполагая, что откат транзакции является единственным важным изменением в базе данных со времени последнего резервного копирования), - это просто восстановление из последней резервной копии, которая, как мы определили, будет быстрее и проще, чем ожидание дополнительного дня. для отката произойдет. Это, конечно, сильно зависит от характера вашей деятельности с базой данных.