ALTER DATABASE не удалось, поскольку блокировка не может быть помещена в базу данных
Мне нужно перезапустить базу данных, потому что некоторые процессы не работают. Мой план состоит в том, чтобы снова отключить его и снова вернуться в Интернет.
Я пытаюсь сделать это в Sql Server Management Studio 2008:
use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go
Я получаю следующие ошибки:
Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.
Что я делаю неправильно?
Ответы
Ответ 1
После получения ошибки запустите
EXEC sp_who2
Найдите базу данных в списке. Возможно, соединение не было прекращено. Если вы обнаружите какие-либо соединения с базой данных, запустите
KILL <SPID>
где <SPID>
- это идентификатор SPID для сеансов, подключенных к базе данных.
Попробуйте выполнить script после удаления всех связей с базой данных.
К сожалению, у меня нет причины, почему вы видите проблему, но вот ссылка, которая показывает, что проблема произошла в другом месте.
http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/
Ответ 2
Мне удалось воспроизвести эту ошибку, выполнив следующие действия.
Соединение 1 (не работает в течение нескольких минут)
CREATE DATABASE TESTING123
GO
USE TESTING123;
SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6
Соединения 2 и 3
set lock_timeout 5;
ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
Ответ 3
Попробуйте это, если оно "в переходе"...
http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html
USE master
GO
ALTER DATABASE <db_name>
SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE
Ответ 4
В SQL Management Studio перейдите в раздел Безопасность → Логины и дважды щелкните свой Логин. Выберите "Роли сервера" в левом столбце и убедитесь, что установлен системный администратор.
В моем случае я был зарегистрирован на учетной записи без этой привилегии.
НТН!
Ответ 5
Убивание идентификатора процесса сработало для меня.
При запуске команды "EXEC sp_who2" над новым окном запросов... и фильтрации результатов для "занятой" базы данных, убийство процессов с помощью команды "KILL" удалось сделать трюк. После этого все снова работало.
Ответ 6
Просто добавь два цента. Я поставил себя в ту же ситуацию, при поиске минимально необходимых привилегий для входа в db для успешного выполнения инструкции:
ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Кажется, что оператор ALTER завершает успешно, когда выполняется с именем sysadmin, но для этого требуется часть очистки подключений, когда выполняется под логином, который имеет "только" ограниченные разрешения, такие как:
ALTER ANY DATABASE
P.S. Я потратил часы, пытаясь понять, почему "ALTER DATABASE.." не работает, когда выполняется под учетной записью, которая имеет привилегии dbcreator role + ALTER ANY DATABASE. Здесь мой поток MSDN!
Ответ 7
Я знаю, что это старый пост, но я недавно столкнулся с очень похожими проблемами. К сожалению, я не смог использовать какие-либо команды alter database, потому что нельзя было установить исключительную блокировку. Но я никогда не мог найти открытую связь с db. В конечном итоге мне пришлось принудительно удалить состояние работоспособности базы данных, чтобы принудительно включить ее в восстановительное состояние, а не в восстановление.