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. 

我究竟做错了什么?

得到错误后,运行

 EXEC sp_who2 

在列表中查找数据库。 有可能连接没有终止。 如果find到数据库的任何连接,请运行

 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中,转到安全性 – >login,然后双击您的login。 从左列中select“服务器angular色”,并validation是否已选中sysadmin。

在我的情况下,我login了一个没有这个权限的帐户。

HTH!

杀死进程ID对我来说工作得很好。 当在一个新的查询窗口上运行“EXEC sp_who2”命令…并过滤“繁忙”数据库的结果时,使用“KILL”命令终止进程成功了。 之后,所有的工作再次。

只是为了增加我的两分钱。 我已经把自己陷入了同样的情况,同时search数据库login成功运行所需的最低限度的特权声明:

 ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

看来,ALTER语句成功完成时,用sysadminlogin执行,但它需要连接清理的一部分,当执行的login“只”有限权限如:

 ALTER ANY DATABASE 

PS我花了几个小时试图弄清楚为什么“ALTER DATABASE ..”在具有dbcreatorangular色+ ALTER ANY DATABASE特权的login名下执行时不起作用。 这是我的MSDN主题 !

我知道这是一个旧post,但我最近遇到了一个非常类似的问题。 不幸的是,我无法使用任何alter database命令,因为排他锁无法放置。 但是我从来没有find一个开放的连接到数据库。 我最终不得不强制删除数据库的健康状态,强制它恢复到恢复状态。