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


124

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

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

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


Какая проблема, в первую очередь, вызвала эту потребность? Есть ли у вас сейчас откаты транзакций? Также вы уже запускали эту команду в другом окне SSMS, которое все еще может быть открыто? Мне интересно (чистое предположение), может ли это потребовать блокировки, которая блокирует другие попытки, но она все еще ждет, прежде чем база данных может быть фактически переведена в режим single_user.
Мартин Смит

1
@Martin - достаточно честно. Я должен думать о чем-то другом или схожу с ума. любой
вариант

@ большое спасибо, я перезапустил SSMS и смог убить всех
ДЖО СКИТ

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

Ответы:


293

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

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/


Можете ли вы объяснить, почему соединение не разрывается командой? Единственная причина, по которой я могу думать, это то, что он все еще находится в процессе отката или это set single_userпопытка, которая еще не завершена.
Мартин Смит

@ Мартин, боюсь, у меня нет для этого причины. Но я добавлю ссылку, указывающую, что другие видели проблему. Я согласен с тем, что откат транзакции может быть проблемой, но это KILLтоже не решит.
bobs

Будьте любезны понять, почему это происходит, но комментарии к вашей ссылке, похоже, указывают на то, что это сработает! (+1)
Мартин Смит

KILL (87) приводит к Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.эээ ....
Тим Абелл

2
@MartinSmith Я думаю, что знаю почему: у меня была такая же проблема: затяжное соединение, обнаруживаемое под sp_who2, заставляло отключаться от сети. Оказалось, это открытое редактирование окон строк в ssms. Я считаю, что здесь происходит то, что окно редактирования строк представляет собой открытый запрос с редактируемым набором результатов. SQL Server имеет такую ​​возможность в качестве альтернативы операторам обновления. При закрытии именно этого окна ssms зависание прекращается немедленно.
Джон

5

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

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

2

Попробуйте это, если он находится в стадии перехода ...

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

Не будет работать, когда база данных находится в переходном режиме, вы получите ту же ошибку с SET OFFLINEоператором, как указано в OP (возможно, есть сценарии, в которых это работает, но это не для меня)
Абель

1

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

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

Проверьте, есть ли у вас процессы в состоянии KILL / RollBack для базы данных master

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

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


0

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

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

НТН!


1
Ошибка в исходном вопросе также возникает, когда вы являетесь SA, это не имеет ничего общего с вашими правами. Если у вас недостаточно прав, вы не сможете выполнить автономную команду.
Abel

0

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


0

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

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

ALTER ANY DATABASE

PS Я потратил часы, пытаясь выяснить, почему «ALTER DATABASE ..» не работает, когда выполняется под логином с ролью dbcreator + ALTER ANY DATABASE привилегиями. Вот моя ветка MSDN !


0

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


0

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


0

В моем сценарии не было процесса, блокирующего базу данных под sp_who2. Однако мы обнаружили, что, поскольку база данных намного больше, чем другие наши базы данных, ожидающие процессы все еще выполнялись, поэтому база данных в группе доступности по-прежнему отображается красным / отключенным после того, как мы попытались «возобновить данные», щелкнув правой кнопкой мыши приостановленную базу данных.

Чтобы проверить, запущены ли все еще процессы, просто выполните эту команду: выберите процент завершения из sys.dm_exec_requests, где процент_complete> 0

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.