Застрял задача в студии управления, как вы справляетесь с ними?

13

После нажатия кнопки «Перевести базу данных в автономный режим» в студии управления это сообщение останется зависшим и не закроется, если нажать кнопку «Закрыть».

https://i.imgur.com/KD6AROv.png

Какой хороший способ справиться с подобными заданиями в студии управления? Можете ли вы убить их через монитор активности? Должен ли я искать, какой процесс мешает этой работе пройти и прекратить ее?

СРЕДНИЙ
источник
4
Узнайте, что блокирует это, в первую очередь. Вы можете получить эту информацию из sys.dm_exec_requests. Кроме того, ваша работа может сделать это таким образом, чтобы она не блокировалась, например, с помощью ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;первой выдачи ... в противном случае она просто сидит и ждет, а для занятой базы данных это может быть навсегда.
Аарон Бертран
Установка базы данных в single_user решила проблему, я должен был догадаться ... SQLserver всегда требует single_user для такого рода вещей.
A_V

Ответы:

13

Я бы сказал, что никогда не используйте «Take Offline» в графическом интерфейсе, если вы точно не знаете, что база данных не используется. Ничем. Это трудно понять, не занимаясь легким трудом, так почему бы не сохранить этот скрипт где-нибудь и всегда использовать его?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

И тогда ответная конечно

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

Причина, по которой вам нужно установить его в SINGLE_USERпервую очередь, состоит в том, чтобы выгнать любых существующих пользователей (есть возможность сделать это в диалоговом окне отсоединения, но не в диалоговом окне выключения), поскольку для SQL Server требуется исключительный доступ к базе данных, чтобы это в автономном режиме. Теперь вы, возможно, захотите проделать дополнительную работу, чтобы узнать, кто в данный момент использует базу данных, как если бы вы делали это в середине большой операции резервного копирования или задания ETL, или что у вас, это может быть проблематично.

РЕДАКТИРОВАТЬ : Я подал предложение на Connect об этом (см. Connect # 2687832 ), а также опубликовал его в Trello (подано в «Обозреватель объектов»).

Аарон Бертран
источник
А что если установка одного пользователя также не удалась, потому что он не может получить блокировку базы данных?
StackOverthrow
@ user560822 Вам придется подождать, пока вы не получите блокировку базы данных. Если это означает, что вы должны начать убивать сеансы ...
Аарон Бертран
9

Когда вы уже находитесь в ситуации зависания, не забывайте, что вы можете искать открытые соединения через сервер с

sp_who2  

в другой базе данных, такой как мастер.
Сканируйте результаты на предмет наличия базы данных, которую вы пытаетесь отключить.
Обратите внимание на значение столбца spid (идентификатор процесса) этих строк.

Беги по одному

kill  ##

где "##" - спид.

Конечно, позаботьтесь о том, чтобы эти процессы не были важны, чтобы они оставались запущенными ... они будут прерваны, даже не выполнив последнюю команду и без предупреждения.

Майк М
источник
1
Принятый ответ не помог мне. Не удалось по первой команде. Этот ответ работает отлично. Спасибо
чебурек
это хорошо :) Да, принятый ответ действительно для того, чтобы избежать проблемы ... если вы уже повесили, вам нужно что-то подобное, чтобы убить это
Майк М