由于无法在数据库上放置锁,ALTERDATABASE 失败

我需要重新启动一个数据库,因为有些进程不工作。我的计划是让它离线,然后重新上线。

我在 SqlServerManagementStudio2008中尝试这样做:

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.

我做错了什么?

218784 次浏览

得到错误之后,运行

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

在 SQLManagementStudio 中,转到 Security-> Logins 并双击 Login。从左列中选择 ServerRoles,并验证是否选中 sysadmin。

就我而言,我是用一个没有这种特权的账户登录的。

哈!

取消程序 ID 对我来说很有效。 当在一个新的查询窗口上运行“ EXEC sp _ who2”命令... 并过滤“繁忙”数据库的结果时,使用“ KILL”命令杀死进程可以达到这个目的。在那之后,一切再次奏效。

我再说一句。我把自己置于同样的情况下,同时搜索 db 登录成功运行语句所需的最低权限:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

看起来 ALTER 语句在使用 系统管理员登录名执行时完成了 成功了,但是在使用“仅”有限权限的登录名执行时,它需要连接清理部分,例如:

ALTER ANY DATABASE

另外,我花了好几个小时想弄明白为什么“ ALTER 数据库”。."在具有 修改任何数据库特权的登录名下执行时不起作用。这是我的 MSDN 线程

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

如果有人像我一样幸运的话,我会在这里加上这个。

在审查 Sp _ who2进程列表时,请注意不仅对受影响的数据库运行的进程,而且对 师父运行的进程。在我的例子中,阻塞数据库的问题与启动 xp _ cmdshell 的存储过程有关。

检查对于 师父数据库是否有任何进程处于 杀死/回滚状态

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

如果您遇到同样的问题,仅使用 KILL 命令可能无济于事。 您可以重新启动 SQL 服务器,或者更好的方法是在 SQL 服务器操作系统上找到 Windows 下的 cmd.exe 进程并杀死它。

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

在我的场景中,sp _ who2下没有阻塞数据库的进程。然而,我们发现,因为数据库比我们的其他数据库大得多,挂起的进程仍然在运行,这就是为什么可用性组下的数据库仍然显示为红色/离线后,我们试图“恢复数据”右击暂停的数据库。

要检查是否还有正在运行的进程,只需执行以下命令: 从 sys.dm _ exec _ request 中选择完成百分比 哪里% _ complete > 0