将数据库从单用户模式设置为多用户


188

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

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

我收到此错误:

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

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

它必须处于非SINGLE_USER模式才能将其设置为另一种模式,但是当数据库处于mode时,我不能将其设置为任何其他SINGLE_USER模式。

Answers:


113

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


1
补充:在查询窗口处于活动状态时,即使在“ 可用数据库”工具栏下拉菜单中选择了某些其他数据库(例如master),也似乎查询窗口可能已附加到数据库。如果仍然让您头疼,请关闭所有其他查询窗口,然后在剩下的一个窗口的下拉列表中选择或选择一些无害的系统数据库。mastertempdb
CVn

尝试断开数据库连接,然后在Microsoft SQL Server Management Studio中再次连接。然后再次运行该命令。
Isuru Madusanka,

第一条评论非常有帮助,实际上可以添加到答案中。关闭所有其他查询之前,我无法运行查询。
user2216

87

该错误消息通常意味着还有其他进程连接到数据库。尝试运行此命令以查看连接了哪些:

exec sp_who

这将使您返回该过程,然后您应该可以运行:

kill [XXX]

其中[xxx]是spid您要终止的过程。

然后,您可以运行上述语句。

祝好运。


kill [xxx]摆脱了进程,但是当我尝试运行命令时,它又回来了!
colmde

73

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

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
到底ROLLBACK IMMEDIATE是做什么的?
dakab

3
@dakab强制所有未决事务在ALTER DATABASE语句事务开始时立即回滚,与之相反,WITH ROLLBACK X SECONDS它等待事务完成后才强制回滚或无限期等待,直到没有未决事务为止(我相信这是默认设置,但目前似乎无法在文档中找到)。这相当于“立即停止您正在做的所有事情并执行此操作”。
培根钻头

39

SQL Server 2012:

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

瞧!


5
并非如此,这是我在尝试解决方案时收到的信息:/“数据库'XXX'已经打开,一次只能有一个用户。(Microsoft SQL Server,错误:924)”
Krzysztof Wolny,2015年

1
在SQL 2008R2中另外确认。
codo-sapien 2015年

最佳答案,即使在您未经许可使用KILL语句的情况下也可以工作
Marco Marsala 2015年


13

这对我来说很好。

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

第2步。

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

并刷新数据库。


9

我实际上遇到了一个问题,即我的数据库几乎被进程和与它们之间的竞争条件所锁定,等到我刷新一个执行的命令并再次将其锁定时,我才不得不将以下命令重新运行在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

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

确保您要登录的帐户是要设置为MULTI_USER的数据库的dbowner。如果可以,以sa登录(使用SQL Server身份验证)

如果您的数据库被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-im-stuck-in-single-user-mode-and-can-t-get-out/

作为最后的替代方法 -如果您已尝试了上述所有操作,并且感到绝望,则可以尝试停止SQL Server实例并重新启动它


5

我刚刚使用以下步骤解决了问题,可能会对您有所帮助。

第1步

右键单击单用户数据库


第2步

离线


步骤:3

断开连接并脱机


第4步

在线上


步骤:5

然后运行以下查询。

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

请享用...!


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

1
  1. 尝试了一切都不起作用
  2. 远程登录到该服务器,因为我们将终止所有连接
  3. 多次运行下面的代码,直到返回完成,并且不再进行“杀死进程”测试
  4. 使用以下代码下方的代码再次将其重新激活

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

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

而(@spid不为null)开始打印'杀死进程'+ cast(@spid as varchar)+'...'set @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; 走


1

这对我来说很好

  1. 备份
  2. 创建新数据库并将备份还原到该数据库
  3. 然后,依次单击属性>选项> [向下滚动]状态> RestrictAccess>选择多用户,然后单击确定。
  4. 删除旧数据库

希望这项工作能为所有人服务谢谢Ramesh Kumar



1

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

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

使f5 wolla一切正常!


0

我很容易解决了这个问题

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

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

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


0

在使用SQL Server 2014的3次以上的情况下,我都将数据库转换为单用户模式,而无需进行任何更改。它一定以某种方式在数据库创建期间发生。上面的所有方法都无法正常工作,因为我总是收到一个错误消息,指出数据库处于单用户模式并且无法连接。

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


0

只需转到数据库属性, 然后将“单用户”模式更改为“多用户”

在此处输入图片说明

注意:如果对您不起作用,请进行Db备份并再次还原,然后再次执行上述方法

*单身= SINGLE_USER

多个= MULTI_USER

受限= RESTRICTED_USER


这与OP正在使用的查询有何不同?
Squazz

是的,两者都是一样的,这就像不是使用CREATE Table查询一样,我们使用sql server GUI Table Designer来制作Table,BTS都可以一样,一种是查询方法,另一种是GUI方法。使用您喜欢的任何东西。
哈桑·赛义德

OP清楚地表明,他的查询导致错误。正如您所说的与使用查询完全一样,您根本没有给出答案,您只是在整理和添加许多错误的答案
Squazz

0

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

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

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

希望这对其他人有帮助。


0

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

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

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

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


0

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

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

在更改访问模式之前,您将需要终止这些连接。(我已经使用EXEC(@kill);在下面的代码模板中完成了此操作。)

然后,

运行以下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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

这应该工作。编码愉快!!

谢谢!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.