Как прервать приостановленную транзакцию SQL Server, ожидающую IO_COMPLETION?

8

У нас есть транзакция, которая выполняется более 5 часов. У нас заканчивается свободное место на диске. Сессия была убита, но она все еще ждет IO_COMPLETION. На самом деле тип ожидания просто изменился на PAGEIOLATCH_EX. Как я могу прекратить приостановленную транзакцию SQL Server? Я не беспокоюсь о потере данных, поскольку все они могут быть заполнены.

session_id: 54
STATUS: suspended
blocked by: 0
wait_type: PAGEIOLATCH_EX
Elapsed Time (in Sec): 19750.420000
open_transaction_count: 2
Тарзан
источник
3
Дайте ему закончить .. иначе, если вы сделаете ставку на колени при отключении питания или перезапуске службы sql server, потребуется время для отката. Поскольку вы не беспокоитесь о потере данных, как насчет восстановления базы данных из последней резервной копии, а затем повторного заполнения данных? Кроме того, вы можете использовать, KILL 54 WITH STATUSONLYчтобы узнать, сколько времени потребуется для отката.
Кин Шах
Я запустил KILL 54 WITH STATUSONLY и получил следующее: SPID 54: выполняется откат транзакции. Предполагаемое завершение отката: 0%. Расчетное оставшееся время: 0 секунд. Я не верю в 0 секунд.
Тарзан
2
Откат является однопоточной операцией, поэтому, например, если исходная транзакция выполнялась с 8 параллельными потоками, пока она не была уничтожена, откат может занять в 8 раз больше времени.
Джеймс З
@ Тарзан KILL .. WITH STATUSONLYне точен, и я понимаю вашу точку зрения. Ты можешь попробовать Alter database .. set OFFLINE or single_User WITH ROLLBACK IMMEDIATE?
Кин Шах
2
Я закончил тем, что позволил этому бежать быстро. Это наконец закончено. Woohoo! Спасибо за комментарий.
Тарзан

Ответы:

1

В следующий раз, когда это произойдет, запустите sp_WhoIsActive( загрузка / документация ) и посмотрите, кто что запускает, и просмотрите логику. Проверьте, можно ли оптимизировать TSQL для ускорения работы или, возможно, разделить его на более мелкие транзакции.

У меня были случаи, когда журнал транзакций с ошибочным запросом составителями отчетов, загрузчиками данных и т. Д. Увеличивал журнал транзакций больше, чем размер файла данных, и обычно это плохо выполняемый, плохо написанный запрос, который не был оптимизирован или разбит на части. в меньшие транзакции, чтобы вернуть свободное пространство после завершения транзакции - SIMPLEкстати, это было и в базе данных модели восстановления - FULLбазы данных модели восстановления должны иметь резервные копии журнала транзакций, чтобы можно было повторно использовать пространство журнала транзакций зафиксированных транзакций.

Основная проблема, скорее всего, заключается в запросе, поэтому определение того, кто что делает, и обращение к ним и сообщение о проблеме с вашими выводами заставит их исправить свою логику, чтобы не занимать место на диске сервера для этого раздела диска - надеюсь, это не ваша логика, но если это так, посмотрите на оптимизацию логики для настройки производительности.

Сок Pimp IT
источник