【问题标题】:SQL Server 2008 R2 Stuck in Single User ModeSQL Server 2008 R2 陷入单用户模式
【发布时间】:2014-07-07 10:41:31
【问题描述】:

在本地数据库上执行了数据库部署(来自 VS SQL Server 数据库项目),但失败了,数据库处于单用户模式的状态(部署以单用户模式运行) .

当我从 SSMS 连接到它并尝试以下操作时:

ALTER DATABASE MyDatabase
SET MULTI_USER;
GO

我得到错误:

目前无法更改数据库“MyDatabase”的状态或选项。数据库处于单用户模式,并且当前有一个用户连接到它。

我尝试使数据库脱机,SSMS 告诉我成功,但它似乎并没有真正做任何事情。到目前为止,我只能通过删除并重新创建数据库来解决这个问题(这没关系,因为它只是一个本地测试数据库)。不过,我希望能够重置状态。

如何说服 SQL Server 将此数据库从单用户模式中移除?

【问题讨论】:

    标签: sql sql-server database sql-server-2008 database-deployment


    【解决方案1】:

    首先在主数据库中运行以下查询

    exec sp_who
    

    如果找不到罪魁祸首,试试

    SELECT request_session_id FROM sys.dm_tran_locks 
    WHERE resource_database_id = DB_ID('YourDatabase')
    

    然后通过以下查询杀死所有使用您的数据库的进程:

    KILL spid
    

    然后运行以下查询:

    USE Master
    ALTER DATABASE YourDatabase SET MULTI_USER
    

    【讨论】:

    • 如果你在 sp_who 输出中找不到任何可疑的条目,这个查询帮助了我 - SELECT request_session_id FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID('YourDatabase')
    • @earthling42:我将您的(非常有用的)查询添加到答案中
    • 我陷入了类似的状态。但我有几个 spid 已连接或处于等待状态。我意识到,一旦我终止现有连接,使用数据库的服务器(应用程序)正在创建连接,而我的控制台永远不会以这种方式获得连接。因此,我必须先关闭所有此类服务器,以免它们争用连接。只有这样我才能成功运行提到的查询并恢复。
    • 像魅力一样工作!
    【解决方案2】:

    试试下面的命令

    先运行这三个命令

    USE [master] 
    SET DEADLOCK_PRIORITY HIGH
    exec sp_dboption MyDBName, 'single user', 'FALSE';
    

    第二次运行这两个命令

    ALTER DATABASE MyDBName SET MULTI_USER WITH NO_WAIT
    ALTER DATABASE MyDBName SET MULTI_USER WITH ROLLBACK IMMEDIATE
    

    【讨论】:

      【解决方案3】:

      这个回答是here,代码是:

      use master
      ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
      
      --do you stuff here 
      
      ALTER DATABASE YourDatabase SET MULTI_USER
      

      【讨论】:

      • 我不认为这是同一个问题 - 数据库不允许这些状态
      • 您是否将 master 替换为您的数据库名称?另外,您对要更改的数据库有管理员权限吗?
      • 补充一下,这不是正确答案。一旦数据库处于单用户模式并且被会话占用,alter database 命令将不会成功。需要先杀死占用db的会话,然后才能将db切换为multi_user模式。
      【解决方案4】:

      使用 DAC (Dedicated Admin Connection)。确保您首先启用它 在 SSMS 中输入管理员:对于服务器名称 连接到主 ALTER DATABASE SET MULTI_USER

      【讨论】:

        【解决方案5】:

        要强制更新使用“立即回滚”

        ALTER DATABASE [DATABASE_NAME] SET MULTI_USER  with rollback immediate
        

        【讨论】:

        • 这不起作用。同样的错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        相关资源
        最近更新 更多