213

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

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

我收到此错误:

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

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

它需要处于非SINGLE_USER模式才能将其设置为另一种模式,但是当它处于模式时我无法将数据库设置为任何其他SINGLE_USER模式。

4

20 回答 20

129

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

于 2013-02-01T18:45:56.687 回答
97

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

exec sp_who

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

kill [XXX]

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

然后你可以运行上面的语句。

祝你好运。

于 2013-02-01T18:46:56.107 回答
85

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

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
于 2014-07-11T20:48:56.653 回答
41

SQL Server 2012:

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

瞧!

于 2014-04-09T12:41:21.170 回答
23

我有同样的问题,并通过以下步骤修复 - 参考: 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
于 2014-03-31T03:09:13.090 回答
16

这对我来说很好。

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

第2步。

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

并刷新数据库。

于 2016-04-05T09:33:48.383 回答
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

做了我需要的,然后把它重新上线。感谢所有为我编写这些文章以结合并解决我的问题的人。

于 2015-12-29T18:38:08.710 回答
9

我刚刚使用以下步骤进行了修复,它可能会对您有所帮助。

第1步

右键单击单用户数据库


第2步

脱机


步骤:3

断开连接并离线


第4步

上网


步数:5

然后运行以下查询。

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

享受...!

于 2019-09-23T12:50:58.667 回答
7

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

确保您登录的帐户是您要设置为 MULTI_USER 的数据库的 dbowner。如果可以,以 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-im-stuck-in-single-user-mode-and-can-t-get-out/

作为最后的选择 - 如果您已经尝试了上述所有方法并且您感到绝望,您可以尝试停止 SQL 服务器实例并重新启动它

于 2016-12-02T03:52:44.983 回答
4

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

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

让 f5 wolla 一切正常!

于 2020-06-01T15:57:29.737 回答
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
于 2014-10-13T07:58:03.453 回答
1
  1. 试了一切都不行
  2. 远程登录该服务器,因为我们将终止所有连接
  3. 多次运行以下代码,直到它返回完成并且不再进行“终止进程”测试
  4. 使用以下代码下方的代码再次重新激活它

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

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

while (@spid is not null) begin print 'Killing process ' + 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;去

于 2014-12-10T05:45:04.903 回答
1

这对我来说很好

  1. 备份
  2. 创建新数据库并将备份还原到它
  3. 然后 Properties > Options > [向下滚动] State > RestrictAccess > 选择 Multi_user 并单击 OK
  4. 删除旧数据库

希望这项工作对所有人都有效谢谢拉梅什库马尔

于 2015-02-12T07:33:58.687 回答
1

如果上述方法不起作用,请找到 spid 的登录名并在 Security - Logins 中禁用它

于 2017-05-16T18:53:54.510 回答
0

我已经轻松解决了问题

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

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

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

于 2015-07-02T02:20:57.590 回答
0

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

在此处输入图像描述

注意:如果它不适合您,请再次进行 Db 备份和还原,然后再次执行上述方法

* 单=SINGLE_USER

多个=MULTI_USER

受限=RESTRICTED_USER

于 2016-09-26T09:31:00.870 回答
0

在超过 3 次使用 SQL Server 2014 的情况下,我已经将数据库转换为单用户模式,而我没有进行任何更改。它一定是在数据库创建期间以某种方式发生的。上述所有方法都不起作用,因为我总是收到数据库处于单用户模式且无法连接的错误。

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

于 2016-10-03T17:16:19.593 回答
0

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

对我来说这不是问题,但在我的情况下,很少有自动化进程会持续(每隔几秒钟)建立连接,所以一旦我将数据库带入单用户模式并断开自己的连接,其中一个进程建立/占用了连接(在我开始恢复操作之前)。一旦我终止这些连接 - 它们就会重新连接,当我运行恢复命令时,我会收到连接已被占用的错误。

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

希望这对其他人有帮助。

于 2018-11-02T16:34:43.107 回答
0

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

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

当我尝试恢复备份时,数据库进入“单用户”模式。在尝试还原(SQL 2017)之前,我没有创建目标数据库的备份。这将让你每次。

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

于 2019-07-23T19:21:57.973 回答
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

这应该有效。编码快乐!!

谢谢!!

于 2019-09-30T10:51:21.490 回答