我需要重新启动数据库,因为某些进程无法正常工作。我的计划是让它脱机并重新上线。
我正在尝试在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.
我做错了什么?
答案 0 :(得分:283)
收到错误后,运行
EXEC sp_who2
在列表中查找数据库。连接可能没有终止。如果找到与数据库的任何连接,请运行
KILL <SPID>
其中<SPID>
是连接到数据库的会话的SPID。
在删除与数据库的所有连接后尝试使用您的脚本。
不幸的是,我没有理由看到问题所在,但这里有一个链接显示问题已在其他地方发生。
答案 1 :(得分:5)
我设法通过执行以下操作重现此错误。
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
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