我正在尝试删除SQL Server 2005中的现有数据库。我的第一次尝试产生了以下错误:
5030:数据库不可能是唯一的 锁定以执行操作。
我已经杀死了正在访问数据库的所有进程。我还删除了之前参与的复制订阅。
除了SQL Server进程和复制之外,还有什么想法可以锁定它?
更新:我重新启动了服务器,并修复了它。我试图避免这种情况,因为这是一个生产服务器,但是你能做什么?
答案 0 :(得分:13)
一个生产服务器,其中有如此多的连接使用数据库但你想丢弃它? :)
尽管如此,如何从数据库中踢出所有人:
USE [dbname];
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
然后删除数据库:
USE [master];
DROP DATABASE [dbname];
USE [master];
和DROP DATABASE ...
之间仍有一个非常小的机会窗口,其中一些其他连接可以获取数据库上的1个单独允许的锁,但通常不值得解决这个问题。 / p>
答案 1 :(得分:6)
我不想这么说,但快速解决方案是重新启动系统,确保没有启动sql server服务器服务,那么你应该能够删除。
此外,如果您的数据库连接到Web ap?
,IIS是否已停止答案 2 :(得分:3)
您是否碰巧知道是否有人将事务处于未完成的回滚状态(或以其他方式未完成)?不妨检查一下锁列表。
答案 3 :(得分:2)
在管理工作室中,转到管理 - >活动监视器(右键单击) - >查看流程。这将为您提供运行的所有内容的完整列表,您可以按数据库对列表进行排序以查看仍附加的内容,还可以终止任何连接。最终会出现孤立的连接,这会阻止您获得所需的独占访问权。
答案 4 :(得分:1)
没有其他人应该使用数据库,包括你自己。
答案 5 :(得分:0)
当您的数据库处于用户访问数据库或某些对象引用您的数据库的多用户模式时,通常会发生此错误。 首先,您应该将数据库设置为单用户模式:
ALTER DATABASE dbName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
现在我们将尝试删除数据库
delete DATABASE ...
最后将数据库设置为多用户模式
ALTER DATABASE dbName
SET MULTI_USER WITH ROLLBACK IMMEDIATE
答案 6 :(得分:0)
为什么我们要将删除的数据库设置为多用户模式。
ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
答案 7 :(得分:0)
要避免此错误,请在master数据库中使用下面的T-SQL脚本。确保为运行ALTER DATABASE命令的每个数据库运行此命令(并修改@dbname)。
“无法独占锁定数据库以执行此操作 操作“
如果Windows已建立与数据库的JDBC连接,则此“连接杀手”脚本将起作用。但是这个脚本无法杀掉Linux服务的JDBC连接(例如JBoss)。如果你不手动停止JBoss,你仍然会得到错误。我没有尝试过其他协议,但如果您在构建新系统时发现更多信息,请发表评论。
USE master;
DECLARE @dbname sysname
Set @dbname = 'DATABASE_NAME_HERE-PROD'
Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname) and spid > @spid
End