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
@马丁-足够公平。我必须考虑其他事情或迷失方向。哪一个都是有可能的
编码coding

@非常感谢大家,我重新启动了SSMS,并且能够杀死所有人
JOE SKEET 2011年

可能是智慧。我删除了一个不完整的查询,其中包含试图访问数据库的混乱行,然后它开始工作。
Faahmed 2014年

Answers:


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 2011年

很高兴理解为什么会发生这种情况,但是您链接上的注释确实表明它可以正常工作!(+1)
马丁·史密斯

KILL (87) 导致Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.ERM ....
蒂姆·阿贝尔

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;


1

如果有人像我一样幸运,我将在此添加。

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

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

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

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


0

在SQL Management Studio中,转到“安全性”->“登录名”,然后双击“登录名”。从左列中选择“服务器角色”,并确认已选中sysadmin。

就我而言,我是使用没有该特权的帐户登录的。

HTH!


1
当您是SA时,原始问题中的错误也会发生,与您的权利无关。如果您没有足够的权限,则将无法执行离线命令。
亚伯2013年

0

杀死进程ID对我来说很好。在新的查询窗口上运行“ EXEC sp_who2”命令...并过滤“繁忙”数据库的结果时,使用“ KILL”命令杀死进程设法解决了问题。之后,所有工作再次进行。


0

只是加上我的两分钱。在搜索数据库登录以成功运行以下语句所需的最低权限时,我陷入了同样的境地:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

似乎在使用sysadmin登录名执行时,ALTER语句成功完成,但是在具有“仅”有限权限的登录名下执行时,它需要连接清除部分。

ALTER ANY DATABASE

PS我花了数小时试图弄清楚为什么在具有dbcreator角色+ ALTER ANY DATABASE特权的登录名下执行“ ALTER DATABASE ..”时不起作用。这是我的MSDN线程


0

我知道这是一篇旧文章,但最近我遇到了一个非常类似的问题。不幸的是,我无法使用任何alter database命令,因为无法放置排他锁。但是我从来没有找到到数据库的开放连接。最终,我不得不强行删除数据库的运行状况,以使其进入还原状态,而不是进入恢复状态。


0

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


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.