【问题标题】:Exit single-user mode退出单用户模式
【发布时间】:2013-09-28 17:55:06
【问题描述】:

目前,我的数据库处于单用户模式。当我尝试扩展我的数据库时,我收到一个错误:

无法访问数据库“my_db”。(ObjectExplorer)

另外,当我尝试删除数据库时,我得到了错误:

无法更改数据库“my_db”的状态或选项 这次。数据库处于单用户模式,一个用户是 当前已连接到它。

如何退出单用户模式?我没有任何用户使用此数据库。

当我尝试使用 IIS 浏览我的网站时,我得到的错误是:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

我觉得好像是单用户模式导致了这种情况。

【问题讨论】:

  • 您可能已分离数据库。请断开连接并重新连接服务器。然后右键单击数据库文件夹,单击附加并从硬盘中选择您的数据库 mdf 文件。你可以看到单用户模式将不再存在。

标签: sql-server sql-server-2008-r2


【解决方案1】:

对我来说最简单的答案是使用 SSMS 获取 DBOffline(选中 kill current connections 复选框),然后在使用之前将其重新联机:

USE MASTER;
ALTER DATABASE <DBName> SET MULTI_USER
GO

【讨论】:

    【解决方案2】:

    SSMS 通常在后台使用多个与数据库的连接。

    您需要在更改访问模式之前终止这些连接。

    首先,确保对象资源管理器指向一个系统数据库,如 master。

    其次,执行sp_who2 并找到与数据库“my_db”的所有连接。 通过执行KILL { session id } 终止所有连接,其中会话ID 是sp_who2 列出的SPID

    第三,打开一个新的查询窗口。

    执行以下代码。

    -- Start in master
    USE MASTER;
    
    -- Add users
    ALTER DATABASE [my_db] SET MULTI_USER
    GO
    

    请参阅我的blog article 管理数据库文件。这是为移动文件而写的,但用户管理是一样的。

    【讨论】:

    • 当我使用 'sp_who2' 命令时,我没有看到任何连接到 'my_db' 的 DBName 我没有终止任何这些连接。运行命令后,我得到相同的错误 =[:'此时无法更改数据库'my_db' 的状态或选项。数据库处于单用户模式,并且当前有一个用户连接到它。消息 5069,级别 16,状态 1,第 1 行 ALTER DATABASE 语句失败'
    • 你确定你是master吗,sp_who2没有显示任何database=my_db的行,并且你的object explorer不在my_db上。
    • 尝试断开和连接 SSMS。必须将某些东西连接到该数据库。另一种选择是连接专用管理控制台 (DAC)。这假设您是系统管理员。然后杀死有问题的 spid。
    • 另外,下载我的 usp_who2 脚本 (craftydba.com/wp-content/uploads/2011/09/usp-who2.txt)。执行它。它将实用程序放在 msdb.dbo.usp_who2 中。它将 sp_who2 的结果保存到您的用户 ID 下的 tempdb 表中,按数据库名称过滤。发布错误图像以帮助我们更多。祝你好运。
    • 找到 SPID,使用以下命令:Kill 100。100 是会话数 (SPID)。
    【解决方案3】:

    使用大师

    选择 d.name、d.dbid、spid、login_time、nt_domain、nt_username、loginame from sysprocesses p inner join sysdatabases d on p.dbid = d.dbid where d.name = 'database name'

    kill 568 -- 杀死 spid

    ALTER DATABASE 数据库名称'

    SET MULTI_USER 去吧

    【讨论】:

      【解决方案4】:

      以防万一有人偶然发现这个线程,那么这里有一个针对 SQL Server 陷入单用户模式的防弹解决方案

      -- 获取你需要杀死的连接的进程ID(spid)
      -- 将 'DBName' 替换为数据库的实际名称

      SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
      FROM sysprocesses sp 
      INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
      WHERE sd.[name] = 'DBName'
      

      您也可以使用命令“sp_who”来获取打开连接的“spid”:

      -- 或者用这个SP代替

      exec sp_who
      

      -- 然后执行以下操作,将[spid]和[DBName]替换为正确的值

      KILL SpidToKillGoesHere
      GO
      
      SET DEADLOCK_PRIORITY HIGH
      GO
      
      ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
      GO
      

      【讨论】:

      • 感谢您提供的额外信息,带来了很大的不同!
      【解决方案5】:

      今天我遇到了同样的问题,我的数据库从多用户模式更改为单用户模式,这最终阻止了我发布数据库。

      为了解决这个问题,我不得不关闭所有 Visual Studio 实例并在 Sql Server 查询窗口中运行以下命令 -

      USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO
      

      此命令已将数据库从单用户更改为多用户,之后我就可以成功发布了。

      【讨论】:

        【解决方案6】:

        使用此脚本

        exec sp_who
        

        查找 dbname 和 spid 列

        现在执行

        kill spid 
        go
        ALTER DATABASE [DBName]
        SET MULTI_USER;
        

        【讨论】:

          【解决方案7】:

          添加到Jespers answer,更有效:

          SET DEADLOCK_PRIORITY 10;-- Be the top dog.
          

          SET DEADLOCK_PRIORITY HIGH 使用 DEADLOCK_PRIORITY,共 5 个。

          发生的情况是,其他进程在数据库中获得了破解,如果您的进程的DEADLOCK_PRIORITY 较低,那么它就会输掉比赛。

          这避免了寻找和杀死另一个 spid(这可能需要多次执行)。

          您可能需要多次运行ALTER DATABASE(但 Jesper 会这样做)。修改代码:

          USE [master]
          SET DEADLOCK_PRIORITY HIGH
          exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
          ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
          ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
          

          【讨论】:

            【解决方案8】:
            1. 在数据库部分右键单击您的数据库
            2. 选择“属性”
            3. 选择“选项”页面
            4. 向下滚动“其他选项”并更改“限制访问”字段

            【讨论】:

            • 此解决方案不适用于我在 SQL Server 2016 上。尝试访问属性时会显示错误,即数据库处于单用户模式且已连接用户。
            • 在 SQL Server 2017 上为我工作。SSMS 询问我是否要关闭现有连接,我做到了。可能是一个新功能。
            【解决方案9】:

            另一种选择是:

            • 使数据库脱机;在 SMSS 中,右键单击数据库并选择脱机,勾选“删除所有连接”
            • 运行ALTER DATABASE [Your_Db] SET MULTI_USER

            【讨论】:

            • 我的不让我让它离线,它只是一直说它处于单用户模式并且用户已连接! (是的,我确实勾选了“删除所有连接”)。我最终分离了数据库!
            • 我不得不使用这个选项,因为没有用户连接,并且 KILL 命令在 sa 连接上不起作用。
            【解决方案10】:

            按 CTRL + 1

            找到锁定数据库的进程。在 dbname 列中查找您的数据库并记下 spid。现在您必须执行该语句:

            kill <your spid>
            ALTER DATABASE <your db> SET MULTI_USER;
            

            【讨论】:

            • CTRL + 1 是一个我不知道的非常方便的快捷方式!
            【解决方案11】:

            首先,找到并KILL当前已经运行的所有进程。

            然后,运行以下T-SQL 将数据库设置为MULTI_USER 模式。

            USE master
            GO
            DECLARE @kill varchar(max) = '';
            SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
            FROM master..sysprocesses 
            WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
            EXEC(@kill);
            
            GO
            SET DEADLOCK_PRIORITY HIGH
            ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
            ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
            GO
            

            【讨论】:

            • 此解决方案在 SQL Server 2016 上对我不起作用。如果我查询 master..sysprocesses,我看到出现了几行,但随后这些行被替换为给定数据库所在的错误消息单用户模式等
            • @youcantryreachingme,请在此处提供您在 SQL Server 2016 中收到的错误消息,以便我/其他人能够帮助您解决问题。
            • 与 OP 中的相同:此时无法更改数据库“my_db”的状态或选项。数据库处于单用户模式,并且当前有一个用户连接到它。
            • 执行此脚本时,请确保您的新查询不是来自当前处于单用户模式的数据库。
            【解决方案12】:

            我遇到了同样的问题,使用这个查询找到了要杀死的 session_id:

            Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
            

            【讨论】:

            • 这太完美了。找到讨厌的 SPID 并让数据库重新联机。非常感谢!
            【解决方案13】:

            我们刚刚在 SQL 2012 中体验到了这一点。 当我们终止将其设置为单个用户的原始会话时,复制过程开始了。但是 sp_who2 没有显示附加到数据库的新进程。 关闭 SSMS 并重新打开之后,我们可以在数据库中看到这个进程,然后我们可以杀死它并立即切换到 multi_user 模式,这样就可以了。

            我无法弄清楚这背后的逻辑,但它似乎是 SSMS 中的一个错误,并且仍在 SQL 2012 中表现出来。

            【讨论】:

              【解决方案14】:

              以下内容对我有用:

              USE [master]
              SET DEADLOCK_PRIORITY HIGH
              exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
              ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
              ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
              

              【讨论】:

                【解决方案15】:

                今天早上我遇到了同样的问题。原来这是一个简单的问题。我打开了一个查询窗口,该窗口设置为对象资源管理器中的单用户数据库。 sp_who2 存储过程没有显示 then 连接。一旦我关闭它,我就可以将它设置为

                【讨论】:

                  【解决方案16】:

                  即使我遇到了同样的问题,也无法找到与 my_db 的活动连接来杀死它,但仍然显示同样的错误。我最终断开服务器上任何数据库的所有可能的 SSMS 连接,从 SSMS 创建一个新连接并将其更改为多用户。

                  -- Actual Code to change my_db to multi user mode
                  USE MASTER;
                  GO
                  ALTER DATABASE [my_db] SET MULTI_USER
                  

                  注意:这似乎是 SQL Server 2005 中的一个错误!

                  【讨论】:

                    【解决方案17】:

                    我试过了

                    ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
                    

                    【讨论】:

                      【解决方案18】:

                      不确定这是否对任何人有帮助,但我遇到了同样的问题,找不到阻碍我的过程。我关闭了 SSMS 并停止了所有访问本地实例的服务。然后,一旦我返回并运行 exec sp_who2,它就向我展示了罪魁祸首。我终止了该进程并能够让 Multi_User 工作,然后重新启动服务。我们让 IIS 每隔几分钟/秒就会访问一次以查找某些包。

                      【讨论】:

                        【解决方案19】:

                        要退出单用户模式,请尝试:

                        ALTER DATABASE [my_db] SET MULTI_USER

                        要切换回单用户模式,您可以使用:

                        ALTER DATABASE [my_db] SET SINGLE_USER

                        【讨论】:

                        • 我收到错误消息:“此时无法更改数据库“my_db”的状态或选项。数据库处于单用户模式,并且当前有一个用户连接到它。消息 5069,级别 16,状态 1,第 1 行 ALTER DATABASE 语句失败。'
                        • 能否停止并重新启动数据库(显然如果这不是会影响其他用户的生产系统),然后重试该命令?正如@CRAFTYDBA 所说,该命令应该从主数据库执行。
                        • 我展开“系统数据库”并右键单击“主”并选择“新查询”并在您的和@CRAFTYDBA 的命令中进行了尝试。同样的错误=[
                        • 您是否尝试停止并重新启动数据库以终止现有连接?您还可以在此处查看更多终止与数据库的连接的方法:stackoverflow.com/questions/11620/…
                        • 在左窗格中右键单击服务器,然后单击“断开连接”。确保您的数据库上只打开了一个 SSMS 选项卡(右键单击并选择“断开其他连接”),然后执行该语句。每个选项卡和对象资源管理器都是一个连接;您只能打开一个到数据库的连接(因此,“单用户模式”)。单用户应该是“单连接”:) 祝你好运
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-19
                        • 2021-09-18
                        • 2019-12-29
                        • 2021-02-18
                        • 2020-06-06
                        • 1970-01-01
                        相关资源
                        最近更新 更多