Чрезвычайное время ожидания при переводе базы данных SQL Server в автономный режим


278

Я пытаюсь выполнить автономное обслуживание (восстановление базы данных dev из оперативной резервной копии) в моей базе данных dev, но команда «Отключить» через SQL Server Management Studio выполняется крайне медленно - порядка 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 .
Вскоре

3
Если процесс Take DB Offline все еще выполняется, для машин-разработчиков вы можете убить его из диспетчера задач и выполнить команду, указанную выше.
Нулевая голова

1
Если вы запустите команду KILL и получите сообщение «Невозможно использовать KILL, чтобы убить ваш собственный процесс.», Убедитесь, что вы используете основную базу данных для запуска команды
Jarrod

129

Скорее всего, откуда-то есть соединение с БД (редкий пример: асинхронное обновление статистики )

Чтобы найти соединения, используйте sys.sysprocesses

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
ALTER DATABASE <DBNAME> SET SINGLE_USER с немедленным
откатом

KMike - единственное соединение, которое у меня есть, открыто для базы данных Master, а не для базы данных, которую я пытаюсь отключить.
Эрик Форбс

17

В моем случае, после ожидания так много, чтобы закончить, у меня не было терпения, и я просто закрыл студию управления. Перед выходом показывало сообщение об успехе, db не в сети. Файлы были доступны для переименования.


7

выполнить хранимую процедуру sp_who2

Это позволит вам увидеть, есть ли какие-либо блокирующие блокировки. Убить их следует исправить.


5

В SSMS: щелкните правой кнопкой мыши значок сервера SQL, Activity Monitor. Открытые процессы. Найти обработанный связанный. Щелкните правой кнопкой мыши по процессу, Kill.


4

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

Поддерживайте контрольные точки и т. Д. Вам нужно решить, стоит ли сохранять транзакции в вашем журнале или нет, а затем выбрать режим, в котором вы соответственно запустите свою базу данных. Там действительно нет причин для вас, чтобы ждать, но также нет причин для вас потерять данные - вы можете иметь оба.


2
Совет мудреца - спасибо - но в этом случае данные являются расходуемыми, поскольку это база данных разработки, которая восстанавливается.
Эрик Форбс

3

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


3

В моем случае я просмотрел несколько таблиц в БД до выполнения этого действия. Моя учетная запись удерживала активное соединение с этой БД в SSMS. После того как я отключился от сервера в SSMS (оставив открытым диалоговое окно «Перевести базу данных в автономный режим»), операция прошла успешно.


То же самое со мной. Затем я переподключился, изменил активную базу данных на master и запустил следующую команду: ALTER DATABASE XXX УСТАНОВИТЬ ОФФЛАЙН С
НЕОБХОДИМОСТЬЮ

2

Чтобы обойти это, я остановил веб-сайт, который был подключен к БД в IIS, и сразу же «замороженная» панель «взять БД в автономном режиме» стала незамерзающей.


2

Я перепробовал все предложения ниже и ничего не получалось.

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

  3. ALTER DATABASE SET SINGLE_USER с немедленным откатом

    БАЗА ДАННЫХ ALTER УСТАНОВЛЕНА С НЕМЕДЛЕННЫМ РОЛБЭК

    Результат: обе вышеперечисленные команды также застряли.

4 Щелкните правой кнопкой мыши базу данных -> Свойства -> Параметры. Установите для базы данных значение «Только чтение». Нажмите «Да» в диалоговом окне с предупреждением, что SQL Server закроет все подключения к базе данных.

Результат: окно зависло при выполнении.

В качестве последнего средства я перезапустил службу сервера SQL из диспетчера конфигурации, а затем запустил команду ALTER DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE. Оно работало завораживающе


1

Кроме того, закройте все окна запросов, которые у вас могут быть открыты, которые связаны с рассматриваемой базой данных;)


1

В SSMS установите базу данных только для чтения, а затем обратно. Соединения будут закрыты, что освобождает замки.

В моем случае был веб-сайт, который имел открытые связи с базой данных. Этот метод был достаточно прост:

  1. Щелкните правой кнопкой мыши базу данных -> Свойства -> Параметры
  2. Установите Database Read-Onlyв True
  3. Нажмите «Да» в диалоговом окне с предупреждением, что SQL Server закроет все подключения к базе данных.
  4. Снова откройте Параметры и снова отключите доступ только для чтения.
  5. Теперь попробуйте переименовать базу данных или перевести ее в автономный режим.

0

Для меня мне просто нужно было войти в Монитор активности заданий и остановить две вещи, которые обрабатывались. Затем он сразу же отключился. Хотя в моем случае я знал, что это были за эти 2 процесса, и что было нормально их остановить.


0

В моем случае база данных была связана со старой установкой Sharepoint. Остановка и отключение связанных служб в диспетчере сервера «отменили» действие «отключить», которое выполнялось в течение 40 минут, и оно немедленно завершилось.

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


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

0

В следующий раз в диалоговом окне «Выключить» не забудьте установить флажок «Удалить все активные подключения». Я также был на SQL_EXPRESS на локальной машине без соединений, но это замедление произошло для меня, если я не установил этот флажок.


-1

В моем случае я остановил сервер Tomcat. затем БД немедленно отключилась.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.