【问题标题】:How to gain exclusive access to SQL Server 2005 database to restore?如何获得对 SQL Server 2005 数据库的独占访问权限以进行还原?
【发布时间】:2008-10-08 16:34:02
【问题描述】:

每当我在 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 中编写脚本以获取独占访问或断开所有连接?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您可以强制数据库脱机并断开连接:

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

    或者你可以

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

    回滚指定是否正在执行任何操作。在此之后,它们将被回滚。所以它提供了一些保护。

    对不起,我的想法/阅读不正确。您可以重新在线和备份。在 T-SQLsn-p 上还有一篇关于 StackOverflow 的帖子,用于删除所有连接而不是首先离线:Hidden Features of SQL Server

    【讨论】:

    • 我会立即运行 EXEC sp_dboption N'myDB', N'online', N'true' 以恢复联机状态吗?
    • 您到 t-sql sn-p 的链接是我接受这个答案的原因。
    • sp_dboption 将在 MS SQL 的未来版本中删除 - 2008 年之后的版本。习惯于更改数据库。
    【解决方案2】:

    我发现这比离线要快得多,而且通常更好。请阅读MSDN 中的相关信息,以便了解注意事项。如果使用 aysnc 统计信息,您也必须将其关闭。

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

    “立即回滚”是基本的“终止”子句。离开它会永远等待。上述更好的版本使用户事务在几秒钟内终止。

    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
    

    【讨论】:

    • 其实回答了这个问题!比使数据库脱机要好得多。谢谢。
    【解决方案3】:

    @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
    

    【讨论】:

      【解决方案4】:

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

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

      注意:我通过从我的本地计算机连接到他的一个数据库对此进行了测试,并且从服务器断开了与我的数据库的连接,我并没有失去与他的数据库的连接。 p>

      【讨论】:

        【解决方案5】:

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

        这比断开他的连接或设置可能会给他带来一些不便的独占访问要好得多。

        【讨论】:

          【解决方案6】:

          好吧,您可以使用KILL 终止 SQL 进程和会话。

          但是如果你把他当前的所有连接都删除了,他不会重新打开它们吗?

          你可能只需要告诉他你要从备份中恢复,这样他就会停止连接一段时间。

          【讨论】:

            【解决方案7】:

            首先,除非您是当前唯一连接的人并且您拥有管理员权限,否则您无法恢复数据库。您必须首先告诉您的同事您需要恢复,并要求他或她确保将备份媒体上可能没有的任何更改编写成脚本。这只是礼貌,可以防止同事杀了你。

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

            然后运行恢复过程。

            【讨论】:

              猜你喜欢
              • 2014-04-08
              • 2013-10-22
              • 1970-01-01
              • 1970-01-01
              • 2016-07-14
              • 1970-01-01
              • 2023-04-04
              • 2016-08-05
              • 1970-01-01
              相关资源
              最近更新 更多