试图通过t-sql脚本恢复。由于数据库正在使用,因此无法获得独占访问权限

时间:2009-12-21 15:17:51

标签: sql-server tsql sql-server-2008

我正在尝试将生产数据库的备份还原到我们的开发服务器。当我运行以前运行的以下脚本时:

RESTORE DATABASE M2MDATA01 FROM DISK = 'C:\Install\SQLBackup\M2MDATA01.SQLBackup' WITH REPLACE,
   MOVE 'M2MDATA01' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\M2MData01.mdf',
   MOVE 'M2MDATA01_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\M2MData01.ldf'

我收到以下错误:

    Error   12/21/2009 9:06:09 AM   0:00:00.000 SQL Server Database Error: Exclusive access could not be obtained because the database is in use.   5   0

但是,我不知道怎么可能使用它。我该怎么说?

5 个答案:

答案 0 :(得分:3)

检查连接的内容(简单方法)

SELECT * FROM sys.sysprocesses S WHERE S.dbid = DB_ID('M2MDATA01')

注意:sysprocesses can not be emulated using dmvs ...

编辑,检查锁定

SELECT * FROM sys.dm_tran_locks L WHERE L.resource_type = 'DATABASE' AND L.resource_database_id = DB_ID('M2MDATA01')

答案 1 :(得分:2)

在SQL Server Management Studio中,转到Management =>活动监视器。这将显示连接到所有数据库的所有进程,并允许您终止这些进程(仅建议作为最后的手段)。

答案 2 :(得分:0)

Profiler是一个选项。

从Sql Server Management Studio中,选择“工具”|“Sql Server Profiler”。

  1. 连接到您正在使用的数据库所在的服务器实例。
  2. 切换到“事件选择”标签
  3. 选中标有“显示所有列”
  4. 的网格下方的复选框
  5. 在网格中找到DatabaseName列并检查整个列。
  6. (可选)按列过滤器按钮并过滤到您正在使用的数据库名称。
  7. 至少应该告诉您某些内容是否正在使用相关数据库。

答案 3 :(得分:0)

这里最简单的解决方案是删除数据库并选择“关闭现有连接”复选框,然后再点击好。然后恢复将正常工作。这只是DEV吗? :}

答案 4 :(得分:0)

如果您正在恢复数据库,那么您真的关心谁连接了吗?或者这些连接正在做什么?我想不会。通过将数据库设置为单用户模式然后恢复数据库,只需“将所有人踢出去”。

USER master
GO

ALTER DATABASE M2MDATA01 
SET SINGLE_USER
--This rolls back all uncommitted transactions in the db.
WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE M2MDATA01 
FROM DISK = 'C:\Install\SQLBackup\M2MDATA01.SQLBackup' 
WITH REPLACE,
MOVE 'M2MDATA01' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\M2MData01.mdf',
MOVE 'M2MDATA01_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\M2MData01.ldf'
GO

现在,需要注意一个额外的项目。将数据库设置为单用户模式后,其他人可能会尝试连接到数据库。如果成功,您将无法继续还原。这是一场比赛!我的建议是一次性运行所有三个语句。