将数据库从SINGLE USER模式设置为MULTI USER

时间:2013-02-01 18:39:29

标签: sql sql-server

我需要帮助将将SINGLE_USER模式恢复的数据库设置为MULTI_USER。每次我跑

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

我收到此错误:

  

目前无法更改数据库'BARDABARD'的状态或选项。

     

数据库处于单用户模式,用户当前已连接到该模式。

需要处于非SINGLE_USER模式才能将其设置为其他模式,但在SINGLE_USER模式下,我无法将数据库设置为任何其他模式。

20 个答案:

答案 0 :(得分:103)

“用户当前已连接到它”可能是SQL Server Management Studio窗口本身。尝试选择master数据库并再次运行ALTER查询。

答案 1 :(得分:79)

该错误消息通常表示还有其他进程连接到数据库。尝试运行它以查看哪些已连接:

exec sp_who

这将返回您的过程,然后您应该能够运行:

kill [XXX]

其中[xxx]是你要杀死的进程的spid

然后你可以运行你的上述陈述。

祝你好运。

答案 2 :(得分:57)

您可以添加选项以立即回滚您的更改。

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

答案 3 :(得分:35)

SQL Server 2012:

右键单击DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_user,然后单击“确定”。

瞧!

答案 4 :(得分:18)

我遇到了同样的问题,并通过以下步骤进行了修复 - 参考:http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and.html

use master
GO

select 
    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 = 'dbname'
GO

kill 56 => kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

答案 5 :(得分:11)

这对我来说很好。

步骤1.右键单击数据库引擎,单击活动监视器,查看哪个进程正在连接。杀死该特定用户并立即执行查询。

第2步。

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

并刷新数据库。

答案 6 :(得分:8)

我实际上有一个问题,我的数据库几乎被进程锁定并且与它们竞争条件,当我执行一个命令时刷新并且它再次被锁定...我必须运行以下命令在SSMS背靠背并让我离线,从那里我做了我的恢复并回到网上就好了,两个查询在哪里:

首先跑了:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

然后立即(在第二个查询窗口中):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

做了我需要的东西,然后把它带回网上。感谢所有为我撰写这些文章以便结合并解决我的问题的人。

答案 7 :(得分:4)

最好直接登录服务器而不是使用SQL Management Studio

确保您登录的帐户是dbowner,用于要设置为MULTI_USER的数据库。如果可以

以sa身份登录(使用SQL服务器身份验证)

如果IIS使用您的数据库,请停止使用它的网站和应用程序池 - 这可能是连接过程并阻止您设置为MULTI_USER

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

如果您仍有问题,请参阅此处:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-i-m-stuck-in-single-user-mode-and-can-t-get-out/

作为最后一个替代 - 如果您已经尝试过以上所有内容并且您已经绝望了,您可以尝试停止SQL服务器实例并重新启动它

答案 8 :(得分:4)

我已按照以下步骤修复了问题,可能会为您提供帮助。

步骤:1

right click on single user database


步骤:2

take offline


步骤:3

Drop connection and take offline


步骤:4

Take online


步骤:5

然后运行以下查询。

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

享受...!

答案 9 :(得分:3)

您无法在单模式下这样做,因为数据库。最重要的是,但是您应该知道:打开sql management studio时,它不知道数据库上的任何用户,但是当您单击数据库时,它会认为您是单个用户,并且您的命令不起作用。 只需这样做:关闭管理工作室并重新打开它。没有选择任何数据库的新查询窗口,请编写命令脚本。

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

让f5 wolla一切正常!

答案 10 :(得分:2)

当我不知道用于更改为singleuser模式的特定SPID时,下面的代码对我有用。

use master
GO

select 
    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 = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

答案 11 :(得分:1)

  1. 试过一切都行不通
  2. 远程登录该服务器,因为我们要杀死所有连接
  3. 不止一次运行以下代码,直到它返回完成并且不再进行“查杀过程”测试
  4. 使用以下代码
  5. 下方的代码重新激活它
      

    使用master GO声明@sql为varchar(20),@ spid为int

         

    从master..sysprocesses中选择@spid = min(spid),其中dbid =   db_id('DB_NAME')和spid!= @@ spid

         

    while(@spid不为null)开始       print'Killing process'+ cast(@spid as varchar)+'...'       设置@sql ='kill'+ cast(@spid as varchar)       exec(@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        dbid = db_id('DB_NAME') 
        and spid != @@spid end
    

    然后把它带回来

      

    ALTER DATABASE DB_NAME SET MULTI_USER; GO

答案 12 :(得分:1)

这对我来说很好用

  1. 进行备份
  2. 创建新数据库并将备份还原到它
  3. 然后属性&gt;选项&gt; [向下滚动]状态&gt; RestrictAccess&gt;选择Multi_user并单击OK
  4. 删除旧数据库
  5. 希望这对所有人都有用 谢谢 拉梅什库马尔

答案 13 :(得分:1)

如果上述方法无效,请找到spid的登录名并在安全性中禁用它 - 登录

答案 14 :(得分:0)

我轻松解决了这个问题

  1. 右键单击数据库名称重命名

  2. 更改后,右键单击数据库名称 - &gt;属性 - &gt;选项 - &gt;转到RestrictAccess(SINGLE_USER到MULTI_USER)的底部滚动

  3. 现在,您可以再次将数据库重命名为旧名称。

答案 15 :(得分:0)

只需转到数据库属性 并将SINGLE USER模式更改为MULTI USER

enter image description here

注意: 如果它不适合你,那么再进行Db备份并恢复并再次执行上述方法

* 单= SINGLE_USER

多个= MULTI_USER

受限= RESTRICTED_USER

答案 16 :(得分:0)

在使用SQL Server 2014的3次以上,我有一个数据库转换为单用户模式,而我没有改变任何东西。它必定以某种方式在数据库创建期间发生。上面的所有方法都没有工作,因为我总是收到数据库处于单用户模式但无法连接的错误。

我唯一需要做的就是重新启动SQL Server Windows服务。这使我能够连接到数据库并进行必要的更改或删除数据库并重新开始。

答案 17 :(得分:0)

进入单用户模式后,客户端只能与SQL Server建立一个连接,请记住“对象资源管理器”占用了一个(单独的)连接,因此,如果您尝试运行多用户语句在查询窗口中,您会收到错误消息,即在单用户模式下无法建立另一个连接。

对我来说,这不是问题,就我而言,很少有自动流程(每几秒钟)可持久地建立连接,因此,一旦我将数据库置于单用户模式并断开了自己的连接,是建立/占用连接的进程之一(在我可以开始还原操作之前)。一旦我杀死了这些连接-它们就会重新连接,当我运行Restore命令时,我会得到一个错误,即连接已被占用。

要解决这个问题,我必须在一个查询窗口中编写kill语句,更改User-Mode语句和Restore操作,当我一次全部运行它们时,瞧! !!它起作用了。

希望这对其他人有帮助。

答案 18 :(得分:0)

我在使用本地数据库时遇到麻烦。

我能够通过停止SQL Server,然后启动SQL Server,然后使用SSMS UI将DB属性更改为Multi_User来解决此问题。

当我尝试还原备份时,数据库进入“单用户”模式。在尝试还原(SQL 2017)之前,我尚未创建目标数据库的备份。每次都会得到您的帮助。

停止SQL Server,启动SQL Server,然后运行上述脚本或使用UI。

答案 19 :(得分:0)

我搜索了一段时间的解决方案,最后提出了以下解决方案,

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

您将需要先终止这些连接,然后再更改访问方式。(我已经通过下面的代码模板中的 EXEC(@kill); 完成了此操作。)< / p>

然后

运行以下SQL以将数据库设置为MULTI_USER模式。

<hibernate.version>5.4.2.Final</hibernate.version>

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

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

这应该有效。编码愉快!

谢谢!