Надзвичайний час очікування під час роботи в режимі офлайн із базою даних SQL Server


278

Я намагаюся виконати деяке обслуговування в режимі офлайн (відновлення бази даних розробників із резервного копіювання в реальному часі) на своїй базі даних розробників, але команда "Візьми офлайн" через студію управління SQL Server виконує надзвичайно повільно - на порядку 30 хвилин плюс зараз. Мені просто до кінця, і я не можу знайти в Інтернеті жодних посилань на те, що може спричинити проблему зі швидкістю або як її виправити.

Деякі сайти припускають, що відкриті підключення до бази даних викликають це уповільнення, але єдиним додатком, який використовує цю базу даних, є екземпляр IIS мого розробника, і служба зупинена - більше немає відкритих з'єднань.

Що може бути причиною цього уповільнення, і що я можу зробити, щоб прискорити його?

Відповіді:


408

Після додаткових пошуків (нові пошукові терміни, натхнені відповіддю gbn та коментарем u07ch на відповідь KMike), я виявив це, яке завершилося успішно за 2 секунди:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Оновлення)

Якщо це все-таки не вдається зі наступною помилкою, ви можете виправити її як натхненну цією публікацією в блозі :

ALTER DATABASE не вдалося, оскільки блокування не вдалося розмістити на базі даних 'dbname'. Спробуйте ще раз пізніше.

Ви можете запустити таку команду, щоб дізнатися, хто зберігає блокування у вашій базі даних:

EXEC sp_who2

І використовуйте все, що SPIDви знайдете в наступній команді:

KILL <SPID>

Потім ALTER DATABASEзнову запустіть команду. Зараз має працювати.


35
Якщо це не працює (замок неможливо встановити), також спробуйте вирішити його в stackoverflow.com/questions/4673065 .
nalply

3
Якщо процес Take DB Offline все ще запущений, для машин розробників ви можете вбити його з диспетчера завдань і запустити вище команди.
Null Head

1
Якщо ви запустите команду KILL і отримаєте повідомлення "Не вдається використати KILL для вбивства власного процесу.", Переконайтеся, що ви використовуєте головну базу даних для запуску команди
Jarrod

129

Найімовірніше, звідкись є з'єднання з БД (рідкісний приклад: асинхронне оновлення статистики )

Щоб знайти з'єднання, використовуйте sys.sysprocess

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Для примусового відключення використовуйте ROLLBACK IMMEDIATE

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1, оскільки запит на процес дає змогу дізнатися, що пов'язано з цією базою даних. в моєму випадку це був шахрайський працівник із відкритою
SSMS

3
У моєму випадку я був шахраєм із відкритим вікном аналізатора запитів
dellyjm

1
У моєму випадку у розробників був основний веб-сайт для виробництва дуже відомого банку, який вказував на базу даних з написом OLD
ZZ9

3
Якщо сказано, ALTER DATABASE failed because a lock could not be placed on databaseкоманда KILL <SPID>допоможе
Muflix

28

Чи є у вас відкриті вікна SQL Server Management Studio, які підключені до цієї БД?

Переведіть його в єдиний користувальницький режим і повторіть спробу.


2
АЛЬТЕР ДАТАБАЗА <DBNAME> Встановити SINGLE_USER З негайним відкотом
відкотом

KMike - єдине у мене з'єднання відкрите до бази даних Master, а не до бази даних, яку я намагаюся взяти офлайн.
Ерік Форбс

17

У моєму випадку, так довго чекаючи його закінчення, я не мав терпіння і просто закрив студію управління. Перед тим, як вийти, він показав повідомлення про успіх, db офлайн. Файли були доступні для перейменування.


7

виконати збережену процедуру sp_who2

Це дозволить вам побачити, чи є блоки, що блокують.


5

У SSMS: клацніть правою кнопкою миші на піктограмі SQL сервера, Monitor Monitor. Відкриті процеси. Знайдіть оброблений зв’язок. Клацніть правою кнопкою миші процес, вбити.


4

у будь-який момент, коли ви стикаєтеся з цим типом речі, завжди слід думати про свій журнал транзакцій. Постановка alb db з негайним відкатом вказує, що це так. Перевірте це: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Збільшити на контрольних пунктах і т. Д. Вам потрібно вирішити, чи варто трансакції у вашому журналі зберігати чи ні, а потім вибрати режим відповідної роботи вашого db. У вас насправді немає причин чекати, але також немає причини втрачати дані - ви можете мати і те, і інше.


2
Поради мудреця - дякую - але в цьому випадку дані є витратними, оскільки це база даних розробок, до якої відновлюється.
Ерік Форбс

3

Закриття екземпляра SSMS (SQL Service Manager), з якого було зроблено запит, вирішило для мене проблему .....


3

У моєму випадку я переглянув деякі таблиці в БД до виконання цієї дії. Мій обліковий запис користувача підтримував активне з'єднання з цією БД у SSMS. Після того, як я відключився від сервера в SSMS (залишаючи відкритим діалогове вікно "Візьми базу даних офлайн"), операція вдалася.


В мене так само. Потім я знову підключився, змінив активну базу даних, щоб засвоїти та запустив таку команду: ALTER DATABASE XXX SET OFFLINE
With

2

Щоб обійти це, я зупинив веб-сайт, який був підключений до db в IIS, і негайно панель 'заморожена' 'взяти db офлайн' стала розморожена.


2

Я спробував усі пропозиції нижче, і нічого не вийшло.

  1. EXEC sp_who
  2. Убити <SPID>

  3. АЛЬТЕР НАСТРОЙКА ДАТАБАЗИ SINGLE_USER З негайним відкотом

    ПІДКЛЮЧЕННЯ ДАТАБАЗИ ВІДКЛЮЧЕНО З НЕЗАБАВЛЕННЯМ РОЗВИТКУ

    Результат: Обидві вищевказані команди також були застрягли.

4. Клацніть правою кнопкою миші базу даних -> Властивості -> Параметри Встановіть базу даних лише для читання на "True". Натисніть "Так" у діалоговому вікні попередження. SQL Server закриє всі підключення до бази даних.

Результат: Вікно застрягло при виконанні.

В крайньому випадку, я перезапустив службу SQL-сервера від менеджера конфігурації, а потім запустив НАДІЙНИЙ ДАТАБАСУ ВІДКЛЮЧЕНО З НЕЗАДАЧНОЮ РОЛЛБАКУ. Це спрацювало як шарм


1

Також закрийте будь-які вікна запитів, які у вас можуть бути відкритими, які підключені до відповідної бази даних;)


1

У SSMS встановіть базу даних лише для читання, а потім назад. З'єднання будуть закритими, що звільняє замки.

У моєму випадку був веб-сайт, який мав відкриті підключення до бази даних. Цей метод був досить простим:

  1. Клацніть правою кнопкою миші базу даних -> Властивості -> Параметри
  2. Встановити Database Read-Onlyзначення True
  3. Натисніть "Так" у діалоговому вікні попередження. SQL Server закриє всі підключення до бази даних.
  4. Повторно відкрийте Параметри та вимкніть функцію лише для читання
  5. Тепер спробуйте перейменувати базу даних або взяти її в автономному режимі.

0

Для мене я просто повинен був зайти в Монітор робочих завдань і зупинити дві речі, які обробляються. Потім він негайно перейшов в офлайн. У моєму випадку, хоча я знав, що це за два процеси, і що було нормально їх зупинити.


0

У моєму випадку база даних була пов’язана зі старою установкою Sharepoint. Зупинення та відключення пов’язаних служб у менеджері серверів "відключило" дію в режимі офлайн, яке тривало 40 хвилин, і воно було завершено негайно.

Ви можете перевірити, чи якісь сервіси зараз використовують базу даних.


1
Запустіть, sp_who2щоб побачити, які процеси використовують базу даних, і використовуйте kill <PID>для їх зупинки.
Ерік Кігаті

0

Наступного разу в діалоговому вікні Take Off не забудьте встановити прапорець "Перекинути всі активні з'єднання". Я також був на SQL_EXPRESS на локальній машині без підключень, але це уповільнення сталося для мене, якщо я не встановив цей прапорець.


-1

У моєму випадку я зупинив сервер Tomcat. потім відразу ж БД перейшла в автономний режим.

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