Правильная процедура предотвращения откатывания спида
Сегодня у меня была ситуация, когда я хотел отменить обновление таблицы и нескольких индексов и немедленно восстановить базу данных из резервной копии.
Я выполнил команду kill, чтобы убить SPID обновления. Затем я произвел уничтожение с помощью statusonly, и ожидал откат в несколько десятков тысяч секунд. Мне нужно было восстановить базу данных в спешке (поэтому не было необходимости откатывать назад), но вы не можете убить SPID, который откатывается (насколько я знаю), или восстановить базу данных с неподтвержденными соединениями.
Я решил остановить службы sql, удалить физические файлы базы данных mdf и ldf, запустить службы sql, которые показывают базу данных в подозрительном состоянии. Затем восстановил базу данных.
Есть ли более контролируемый / разумный способ подойти к этой ситуации?
2 ответа
Правильно - вы не можете уничтожить SPID, который откатывается, так как база данных будет переведена в состояние, несовместимое с транзакциями (и, возможно, даже структурно несовместимое).
Поэтому простой ответ заключается в том, что нет способа предотвратить откат SPID после его запуска, кроме как сделать что-то радикальное.
Из вашей ситуации трудно выйти, потому что выбора действительно нет. Даже если вы откажетесь от SQL Server, база данных будет восстановлена после сбоя, и вам нужно будет дождаться ее завершения.
Несколько возможных способов решения этой проблемы:
- Измените обновление так, чтобы оно происходило небольшими партиями, чтобы в будущем у вас не было такого же отката монстра (вероятно, гораздо легче сказать, чем сделать)
- Восстановите базу данных под другим именем. Дождитесь завершения отката, затем отбросьте исходную базу данных и переименуйте восстановленную.
- Что ты сделал. Огромный риск этого заключается в том, что ваша резервная копия повреждена, а затем вы потеряли все, или возникла какая-то другая странная проблема, и вы оказались в худшем состоянии, чем раньше. Также требуется, чтобы служба SQL была остановлена и перезапущена.
Как только вы окажетесь в этом состоянии, по сути, нет хорошего решения, кроме как сделать откат завершенным. Я действительно не решаюсь оправдать то, что вы сделали, потому что очень много людей, которые не имеют опыта, могут попробовать это и погрузиться в очень глубокие воды.
Спасибо
Я думаю, что вы сделали это наиболее эффективным способом, однако я бы, возможно, переименовал файлы, а не удалил их, на всякий случай. Или переместите их в другое место хранения.