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

Rah*_*418 182 sql sql-server

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

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

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

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

pau*_*aul 109

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

  • 添加到此:即使当查询窗口处于活动状态时,在“可用数据库”工具栏下拉列表中选择了某些“其他”数据库(例如“master”),查询窗口似乎也可能附加到数据库。如果它一直让您头疼,请关闭**所有**其他查询窗口,并在您留下的一个窗口的下拉列表中选择一些无辜的系统数据库,例如“master”或“tempdb”。 (3认同)

sge*_*des 84

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

exec sp_who
Run Code Online (Sandbox Code Playgroud)

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

kill [XXX]
Run Code Online (Sandbox Code Playgroud)

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

然后你可以运行你的上述声明.

祝好运.

  • 就我而言,我们有一项服务窃取了单用户访问权限,并且它会很快重新连接。我必须使用“go”运行“kill <spid>”,然后立即执行“set multi_user”语句。我怀疑之后立即使用“use [affected_db]”也足以窃取单用户连接。 (2认同)

小智 65

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

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)

  • @dakab强制所有挂起的事务在`ALTER DATABASE`语句的事务开始时立即回滚,而不是`WITH ROLLBACK X SECONDS`等待事务完成,然后强制它们回滚或无限期等待直到没有待处理的交易(我相信这是默认的,但目前似乎无法在文档中找到).这相当于"阻止你现在所做的一切,并做到这一点." (3认同)

小智 39

SQL Server 2012:

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

瞧!

  • 不是,这是我在尝试你的解决方案时收到的:/"数据库'XXX'已经打开,一次只能有一个用户.(Microsoft SQL Server,错误:924)" (4认同)
  • 为我工作,但需要先杀死 (2认同)

Aza*_*ndi 19

我有同样的问题,并通过以下步骤修复 - 参考: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
Run Code Online (Sandbox Code Playgroud)


小智 13

这对我来说很好.

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

第2步.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  
Run Code Online (Sandbox Code Playgroud)

并刷新数据库.


小智 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);
Run Code Online (Sandbox Code Playgroud)

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

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

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


Rik*_*tel 8

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

第1步

右键单击单用户数据库


第2步

下线


步骤:3

断开连接并离线


第四步

上网


步骤:5

然后运行以下查询。

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)

享受...!


Chr*_*row 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
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到问题,请参考这里:

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

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