Перевод базы данных SQL Server в Offline - ALTER DATABASE failed because a lock could not be placed on database

imageПри работе с базами данных в Microsoft SQL Server Management Studio можно столкнуться с ситуацией, когда процедура перевода базы данных в Offline затягивается на очень длительное время…

image

В ряде случаев причиной такого поведения являются активные соединения с базой данных. Во многих источниках на такой случай можно найти рекомендацию перевода в состояние Offline с помощью инструкции WITH ROLLBACK IMMEDIATE, которая должна закрыть все активные соединения …

USE master
GO
ALTER DATABASE [Имя базы данных] SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

Однако такой метод не всегда помогает, и в результате мы можем получить ошибку, говорящую о проблеме блокировки базы данных…

image

Чтобы получить информацию об активных сессиях с интересующей нас базой данных выполним SQL-запрос:

USE master
GO
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('Имя базы данных')
GO

Из полученного вывода станет понятно, – какой именно пользователь и из какого приложения “держит” нашу базу данных. Одним из интересующих нас показателей будет идентификатор соединения - spid

image

Помимо представленного примера информацию о всех активных соединениях к серверу БД можно получить с помощью хранимых процедур sp_who или sp_who2:

EXEC sp_who2

Выяснив идентификатор соединения можно его “прибить” командой:

KILL <spid>

image

После сброса активных сессий интересующая нас база данных должна успешно завершить переход состояние Offline.

Добавить комментарий