Ошибка 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.

что я делаю не так?

9 ответов


после того, как вы получите ошибку, запустите

EXEC sp_who2

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

KILL <SPID>

здесь <SPID> является SPID для сеансов, подключенных к базе данных.

попробуйте свой скрипт после удаления всех подключений к базе данных.

к сожалению, у меня нет причин, почему вы видите проблему, но вот ссылка это показывает, что проблема возникла в другом месте.

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/


мне удалось воспроизвести эту ошибку, выполнив следующие действия.

подключение 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;

попробуйте это, если это "экономикой" ...

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

в SQL Management Studio перейдите в Security - > Logins и дважды щелкните свой логин. Выберите роли сервера в левом столбце и убедитесь, что установлен флажок sysadmin.

в моем случае я вошел в учетную запись без этой привилегии.

HTH!


убийство идентификатора процесса отлично сработало для меня. При запуске команды "EXEC sp_who2" над новым окном запроса... и отфильтровать результаты для" занятой "базы данных, убив процессы с помощью команды "убить" удалось сделать трюк. После этого все снова заработало.


просто добавить мои два цента. Я поставил себя в ту же ситуацию, при поиске минимальных необходимых привилегий входа в БД для успешного выполнения инструкции:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Кажется, что оператор ALTER завершает успешно, при выполнении с администратор login, но для этого требуется часть очистки соединений, при выполнении под логином, который имеет" только " ограниченные разрешения, такие как:

ALTER ANY DATABASE

P. S. Я потратил часов пытаясь выяснить, почему " ALTER DATABASE.."не работает при выполнении под логином, который имеет роль dbcreator + изменить любую базу данных привилегии. Вот мой поток MSDN!


Я знаю, это старый пост, но недавно я столкнулся с очень похожей проблемой. К сожалению, я не смог использовать ни одну из команд alter database, потому что исключительная блокировка не могла быть размещена. Но мне так и не удалось найти открытое соединение с БД. В конце концов мне пришлось принудительно удалить состояние работоспособности базы данных, чтобы заставить ее восстанавливаться, а не восстанавливаться.


Я добавлю это здесь, если кому-то повезет, как мне.

при рассмотрении sp_who2 список процессов, обратите внимание на процессы, которые выполняются не только для базы данных, но и для мастер. В моем случае проблема, которая блокировала базу данных, была связана с хранимой процедурой, которая запустила xp_cmdshell.

проверьте, есть ли у вас какие-либо процессы в убить/отмотка государство мастер база данных

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

Если у вас такая же проблема, просто команда KILL, вероятно, не поможет. Вы можете перезапустить SQL server или лучше найти cmd.exe под Windows обрабатывает на SQL server OS и убивает его.


в редких случаях (например, после тяжелой транзакции) запущенный системный процесс контрольной точки, удерживающий блокировку файла в файле базы данных, предотвращает переход в многопользовательский режим.