Sql server 正在尝试通过t-sql脚本进行恢复。无法获得独占访问权限,因为数据库正在使用中

Sql server 正在尝试通过t-sql脚本进行恢复。无法获得独占访问权限,因为数据库正在使用中,sql-server,tsql,sql-server-2008,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', MOV

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

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

然而,我不知道怎么可能用它。我怎么知道

探查器是一个选项

从SQLServerManagementStudio中,选择工具| SQLServerProfiler

连接到正在使用的数据库所在的服务器实例。 切换到事件选择选项卡 选中标有“显示所有列”的网格下方的复选框 在网格中找到DatabaseName列并检查整个列。 (可选)按“列筛选器”按钮并筛选到正在使用的数据库名称。
这至少可以告诉您是否有什么东西在使用有问题的数据库。

探查器是一种选择

从SQLServerManagementStudio中,选择工具| SQLServerProfiler

连接到正在使用的数据库所在的服务器实例。 切换到事件选择选项卡 选中标有“显示所有列”的网格下方的复选框 在网格中找到DatabaseName列并检查整个列。 (可选)按“列筛选器”按钮并筛选到正在使用的数据库名称。
这至少可以告诉您是否有什么东西在使用有问题的数据库。

用简单的方法检查什么是连接的

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

编辑,也检查锁

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

用简单的方法检查什么是连接的

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

编辑,也检查锁

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

在SQLServerManagementStudio中,转到管理=>ActivityMonitor。这将显示连接到所有数据库的所有进程,并允许您在万不得已的情况下终止这些进程。

在SQL Server Management Studio中,转到管理=>活动监视器。这将显示连接到所有数据库的所有进程,并允许您在万不得已的情况下关闭这些进程。

这里最简单的解决方案是删除数据库并选中“关闭现有连接”复选框,然后单击“确定”。然后恢复就可以正常工作了。只是德夫,对吗?:}

这里最简单的解决方案是删除数据库并选中“关闭现有连接”复选框,然后单击“确定”。然后恢复就可以正常工作了。只是德夫,对吗?:}

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

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

现在,还有一项需要注意。将db设置为单用户模式后,其他人可能会尝试连接到db。如果成功,您将无法继续恢复。这是一场比赛!我的建议是在一个批处理中同时运行所有三条语句。

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

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

现在,还有一项需要注意。将db设置为单用户模式后,其他人可能会尝试连接到db。如果成功,您将无法继续恢复。这是一场比赛!我的建议是在一个批中同时运行所有三个语句。

当我这样做时,唯一的登录名是我的。有5个进程,其中一个在Tempdb上运行。其余的记录没有为数据库名称列出任何内容。有什么想法吗?嗯,这是2008年吗?2008年有一个bug,请参阅以下链接:。安装修复程序后,活动监视器将帮助您跟踪恶意进程。当我这样做时,唯一的登录名就是我的。有5个进程,其中一个在Tempdb上运行。其余的记录没有为数据库名称列出任何内容。有什么想法吗?嗯,这是2008年吗?2008年有一个bug,请参阅以下链接:。安装修复程序后,活动监视器将帮助您跟踪恶意进程。当我运行此程序时,不会返回任何记录。在运行还原时,在不同的查询窗口中?当我运行此程序时,不会返回任何记录。在运行还原时,在不同的查询窗口中?探查器中的唯一活动来自报表服务器。未列出有问题的数据库。探查器中的唯一活动来自报表服务器。未列出有问题的数据库。