如何获得SQL Server 2005数据库的独占访问权限?

时间:2008-10-08 16:34:02

标签: sql-server tsql

每当我在SQL Server中恢复数据库的备份时,都会出现以下错误:

Msg 3101, Level 16, State 1, Line 1
Exclusive access could not be obtained because the database is in use.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

通常为了解决这个问题,我只需重启服务器即可。当我们在开发机器上的本地实例上进行开发时,这很好。但是我们有一些程序员需要访问数据库,让每个人编写脚本更改并将其放入Subversion的后勤工作正成为一场噩梦。无论我们的简单解决方案是将它放在办公室的共享服务器上,偶尔备份服务器以防万一有人搞砸了数据。

好吧,我搞砸了数据并需要恢复。不幸的是,我在办公室有另一个同事,正在开发另一个项目并使用相同的数据库服务器进行开发。为了好,我想在不重新启动SQL Server的情况下进行恢复,并可能破坏他的工作。

有没有办法在T-SQL中编写脚本以便能够进行独占访问或删除所有连接?

7 个答案:

答案 0 :(得分:19)

您可以强制数据库脱机并使用以下命令删除连接:

EXEC sp_dboption N'yourDatabase', N'offline', N'true'

或者你可以

ALTER DATABASE [yourDatabase] SET OFFLINE WITH
ROLLBACK AFTER 60 SECONDS

Rollback指定是否正在执行任何操作。在那段时间之后,他们将被退回。所以它提供了一些保护。

对不起我没想到/读得对。你可以回到网上和备份。在T-SQL代码段上还有一篇关于Stack Overflow的帖子,用于删除所有连接而不是首先脱机: Hidden Features of SQL Server

答案 1 :(得分:14)

我觉得这比离线要快得多,而且通常要好一些。请在MSDN中阅读相关内容,以便了解这些警告。如果使用aysnc统计信息,您也必须关闭它们。

-- set single user, terminate connections
ALTER DATABASE [target] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE ...
ALTER DATABASE [target] SET MULTI_USER

“with rollback immediate”是必不可少的“终止”条款。离开它等待永远。上述更好的版本为用户事务提供了几秒钟的终止时间。

ALTER DATABASE [target] SET SINGLE_USER WITH ROLLBACK AFTER 5

离线是一个好主意,如果你想复制数据库文件,这个场景在桌面版的SQL中很方便。对于这种情况太重了。如果离线,这将是首选。 SQL is moving away from sp_dboption

ALTER DATABASE [target] SET OFFLINE WITH ROLLBACK AFTER 5

答案 2 :(得分:8)

@mattlant - 这就是我要找的东西。我把它带到这里,所以它在线程中。

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

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

答案 3 :(得分:2)

到目前为止,这对我有用。我右键点击了数据库>任务>分离...

这会打开一个允许您查看所有活动连接的屏幕。然后,您可以通过并断开每个连接。当你点击确定你已经分离数据库并需要附加数据库。右键单击Databases并选择attach,选择mdf文件并附加db。此时,您应该拥有恢复的独占权限。

注意:我通过从我的本地计算机连接到他的一个数据库来测试这个,并且从服务器上删除了与我的数据库的连接,并且我没有丢失与他的数据库的连接。

答案 4 :(得分:1)

我建议与你的同事交谈,并要求他离开数据库。 (并让他意识到这个问题,因为他可能会失去你在恢复时所做的改变。)

这比放弃他的联系或设置独家访问权限要好得多,这可能会给他带来一些不便。

答案 5 :(得分:1)

好吧,你可以用KILL杀死SQL进程和会话。

但是,如果你只是放弃他目前的所有联系,他不会只是重新打开它们吗?

你可能只需要告诉他你要从备份恢复,所以他会停止连接。

答案 6 :(得分:1)

首先,除非您是当前唯一连接且具有管理员权限的人,否则无法还原数据库。您必须首先告诉您的同事您需要还原并要求他或她确保编写可能不在备份媒体上的任何更改。这只是礼貌,让同事不会杀了你。

接下来,将数据库设置为单用户模式。您可以在联机丛书中查找如何执行此操作。这可以防止其他人在您执行此操作时进行连接,并为您提供终止现有连接的机会。进入单用户模式很重要,因为在恢复时没有其他人应该对数据库做任何事情。

然后运行恢复过程。