ALTER DATABASE失败,因为无法将锁定放在数据库上

时间:2011-01-12 19:23:25

标签: sql sql-server-2008 ssms

我需要重新启动数据库,因为某些进程无法正常工作。我的计划是让它脱机并重新上线。

我正在尝试在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.

我做错了什么?

10 个答案:

答案 0 :(得分:283)

收到错误后,运行

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 :(得分: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 :(得分: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

答案 3 :(得分:0)

在SQL Management Studio中,转到安全性 - &gt;登录并双击您的登录。从左列中选择Server Roles,并验证是否已选中sysadmin。

在我的情况下,我登录的是没有该权限的帐户。

HTH!

答案 4 :(得分:0)

杀死进程ID对我很有用。 当运行&#34; EXEC sp_who2&#34;在新的查询窗口上进行命令...并过滤&#34; busy&#34;的结果。数据库,使用&#34; KILL&#34;杀死进程命令设法做到了这一点。之后,一切都恢复了。

答案 5 :(得分:0)

加上我的两分钱。我已经将自己置于相同的情况,同时搜索db登录的最低必需权限以成功运行该语句:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

当使用 sysadmin 登录执行时,似乎ALTER语句完成成功,但它需要连接清理部分,当在具有&#的登录下执行时34;仅&#34;有限的权限,如:

ALTER ANY DATABASE

P.S。我花了好几个小时试图找出为什么&#34; ALTER DATABASE ..&#34;在具有 dbcreator角色+ ALTER ANY DATABASE 权限的登录名下执行时不起作用。这是我的MSDN thread

答案 6 :(得分:0)

我知道这是一个老帖子,但我最近遇到了一个非常类似的问题。不幸的是,我无法使用任何alter database命令,因为无法放置独占锁。但我始终无法找到与db的开放连接。我最终不得不强制删除数据库的健康状态,以强制它进入恢复状态而不是恢复状态。

答案 7 :(得分:0)

我会在这里加上这个,以防有人像我一样幸运。

在查看 sp_who2 流程列表时,请注意不仅针对受影响的数据库而且针对运行的流程。就我而言,阻止数据库的问题与启动xp_cmdshell的存储过程有关。

检查数据库的 KILL / RollBack 状态是否有任何进程

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

如果您遇到同样的问题,那么KILL命令可能无济于事。 您可以重新启动SQL服务器,或者更好的方法是在SQL Server OS上的Windows进程下找到cmd.exe并将其终止。

答案 8 :(得分:0)

在极少数情况下(例如,在提交大量事务之后),正在运行的CHECKPOINT系统进程在数据库文件上持有FILE锁会阻止转换为MULTI_USER模式。

答案 9 :(得分:0)

在我的方案中,没有任何进程在sp_who2下阻止数据库。但是,我们发现由于该数据库比尚待处理的其他数据库要大得多,这就是为什么在我们尝试通过右键单击已暂停的数据库来“恢复数据”后,可用性组下的数据库仍显示为红色/离线的原因。

要检查是否还有正在运行的进程,只需执行以下命令: 从sys.dm_exec_requests中选择完成百分比 其中percent_complete> 0