Чрезвычайное время ожидания при переводе базы данных 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, которые подключены к этой БД?

Переведите его в однопользовательский режим и повторите попытку.

KM.
источник
2
ALTER DATABASE <DBNAME> SET SINGLE_USER с немедленным
откатом
KMike - единственное соединение, которое у меня есть, открыто для базы данных Master, а не для базы данных, которую я пытаюсь отключить.
Эрик Форбс
17

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

Rudy
источник
7

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

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

woodwa
источник
5

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

nzeemin
источник
4

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

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

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

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

Арманд Г.
источник
3

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

RamenNoodle
источник
То же самое со мной. Затем я переподключился, изменил активную базу данных на 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. Теперь попробуйте переименовать базу данных или перевести ее в автономный режим.
zacharydl
источник
0

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

Craig
источник
0

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

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

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

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

Бретт Дрейк
источник
-1

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

Java Main
источник