Не удалось изменить базу данных, так как не удалось установить блокировку в базе данных


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

Я пытаюсь сделать это в 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 120

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 перейдите в раздел Безопасность - > логины и дважды щелкните свой логин. Выберите роли сервера в левом столбце и убедитесь, что установлен флажок sysadmin.

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

НТН!

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

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

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

ALTER ANY DATABASE

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

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

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

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

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

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

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

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