Застрягле завдання в студії управління, як ви справляєтесь з ними?


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 або що у вас є, це може бути проблематично.

EDIT : Я подав пропозицію щодо Connect про це (див. Connect # 2687832 ) і також опублікував її в Trello (подано під "Провідник об'єктів").


А що робити, якщо встановити одного користувача також не вдасться, оскільки він не може отримати блокування в базі даних?
StackOverthrow

@ user560822 Вам доведеться почекати, поки ви зможете заблокувати базу даних. Якщо це означає, що ви повинні почати вбивати сеанси ...
Аарон Бертран

9

Коли ви вже перебуваєте в ситуації висіння, не забувайте, що ви можете шукати відкриті з'єднання через сервер

sp_who2  

в іншій базі даних, наприклад, master.
Проскануйте результати для того, де база даних є тією, яку ви намагаєтеся зробити офлайн.
Зверніть увагу на значення стовпця spid (id процесу) цих рядків.

Один за одним, бігайте

kill  ##

де "##" - це павук.

Безумовно, подбайте про те, щоб переконатися, що ці процеси не важливі, щоб вони не працювали ... вони будуть припинені, навіть не закінчивши останню команду та без попередження.


1
Прийнята відповідь не зробила для мене хитрості. Помилка першої команди. Ця відповідь прекрасно працює. Спасибі
чебурек

це добре :) Так, прийнята відповідь справді полягає у тому, щоб уникнути питання ... якщо ви вже повішені, вам потрібно щось подібне, щоб його вбити
Майк М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.