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

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

我得到这个错误:

目前不能更改数据库'BARDABARD'的状态或选项。 数据库处于单用户模式,当前有用户连接到数据库。

它需要在非SINGLE_USER模式下将其设置为另一种模式,但当它是SINGLE_USER模式时,我不能将数据库设置为任何其他模式。


当前回答

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

其他回答

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

我和当地的数据库出了点问题。

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

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

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

工作内容:

首先,我杀死所有数据库进程,以证明数据库没有在使用。 在我改变用户模式之后。

有时,一个进程会很快从应用程序中再次获取,我需要再次运行这个进程……

替换下面的表达式DATABASE_NAME,以使用您的数据库名称。

——杀过程

USE Master 
GO

declare @sql as varchar(20), @spid as int

select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('DATABASE_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 
        spid > 50 AND dbid = db_id('DATABASE_NAME') 
        and spid != @@spid 
end 

print 'Killing Process completed...' 
GO

**--Alter user mode** 

ALTER DATABASE DATABASE_NAME SET MULTI_USER; 

GO 

print 'Alter Database Process completed...'

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

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

但对我来说,这不是问题,在我的情况下,很少有自动进程持续地(每隔几秒钟)建立连接,所以一旦我将DB设置为单用户模式并断开连接,其中一个进程就建立/占用了连接(在我可以开始恢复操作之前)。一旦我杀死这些连接,它们就会重新连接,当我运行恢复命令时,我会得到连接已经被占用的错误。

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

希望这能帮助到其他人。