我需要帮助将在SINGLE_USER
模式下恢复的数据库设置为MULTI_USER
. 每次我跑
ALTER DATABASE BARDABARD
SET MULTI_USER;
GO
我收到此错误:
此时无法更改数据库“BARDABARD”的状态或选项。
数据库处于单用户模式,并且当前有一个用户连接到它。
它需要处于非SINGLE_USER
模式才能将其设置为另一种模式,但是当它处于模式时我无法将数据库设置为任何其他SINGLE_USER
模式。
我需要帮助将在SINGLE_USER
模式下恢复的数据库设置为MULTI_USER
. 每次我跑
ALTER DATABASE BARDABARD
SET MULTI_USER;
GO
我收到此错误:
此时无法更改数据库“BARDABARD”的状态或选项。
数据库处于单用户模式,并且当前有一个用户连接到它。
它需要处于非SINGLE_USER
模式才能将其设置为另一种模式,但是当它处于模式时我无法将数据库设置为任何其他SINGLE_USER
模式。
“用户当前连接到它”可能是 SQL Server Management Studio 窗口本身。尝试选择主数据库并ALTER
再次运行查询。
该错误消息通常意味着有其他进程连接到数据库。尝试运行它以查看哪些已连接:
exec sp_who
这将返回您的过程,然后您应该能够运行:
kill [XXX]
其中 [xxx] 是spid
您要杀死的进程。
然后你可以运行上面的语句。
祝你好运。
您可以添加立即回滚更改的选项。
ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
SQL Server 2012:
右键单击DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_user
并单击确定。
瞧!
我有同样的问题,并通过以下步骤修复 - 参考: 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
这对我来说很好。
步骤 1. 右键单击数据库引擎,单击活动监视器并查看正在连接的进程。杀死该特定用户并立即执行查询。
第2步。
USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO
并刷新数据库。
实际上,我遇到了一个问题,即我的数据库几乎被进程锁定并且与它们存在竞争条件,当我执行一个命令刷新并且他们再次锁定它时......我不得不背靠背运行以下命令在 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
做了我需要的,然后把它重新上线。感谢所有为我编写这些文章以结合并解决我的问题的人。
最好直接登录服务器,而不是使用 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
如果您仍有问题,请参阅此处:
作为最后的选择 - 如果您已经尝试了上述所有方法并且您感到绝望,您可以尝试停止 SQL 服务器实例并重新启动它
您不能这样做,因为数据库处于单一模式。最重要的是,但您应该知道:当您打开 sql 管理工作室时,它不知道数据库上的任何用户,但是当您单击数据库时,它认为您是单个用户并且您的命令不起作用。只需这样做:关闭管理工作室并重新打开它。新的查询窗口不选择任何数据库写入命令脚本。
USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO
让 f5 wolla 一切正常!
当我不知道用于更改为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
使用 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;去
这对我来说很好
希望这项工作对所有人都有效谢谢拉梅什库马尔
如果上述方法不起作用,请找到 spid 的登录名并在 Security - Logins 中禁用它
我已经轻松解决了问题
右键单击数据库名称重命名它
更改后,右键单击数据库名称--> 属性--> 选项--> 滚动到底部的 RestrictAccess (SINGLE_USER to MULTI_USER)
现在您可以再次将数据库重命名为您的旧名称。
在超过 3 次使用 SQL Server 2014 的情况下,我已经将数据库转换为单用户模式,而我没有进行任何更改。它一定是在数据库创建期间以某种方式发生的。上述所有方法都不起作用,因为我总是收到数据库处于单用户模式且无法连接的错误。
我唯一要做的就是重新启动 SQL Server Windows 服务。这使我能够连接到数据库并进行必要的更改或删除数据库并重新开始。
进入单用户模式后,客户端只能与 SQL Server 建立一个连接,请记住“对象资源管理器”占用(单独的)连接,因此如果您尝试在查询中运行多用户语句窗口,您将收到错误消息,即在单用户模式下您无法建立另一个连接。
对我来说这不是问题,但在我的情况下,很少有自动化进程会持续(每隔几秒钟)建立连接,所以一旦我将数据库带入单用户模式并断开自己的连接,其中一个进程建立/占用了连接(在我开始恢复操作之前)。一旦我终止这些连接 - 它们就会重新连接,当我运行恢复命令时,我会收到连接已被占用的错误。
为了解决这个问题,我必须在一个查询窗口中编写kill
语句、语句更改User-Mode
和Restore
操作,当我一口气运行它们时,瞧!!!有效。
希望这对其他人有帮助。
我在使用本地数据库时遇到了麻烦。
我能够通过停止 SQL Server,然后启动 SQL Server,然后使用 SSMS UI 将 DB 属性更改为 Multi_User 来解决这个问题。
当我尝试恢复备份时,数据库进入“单用户”模式。在尝试还原(SQL 2017)之前,我没有创建目标数据库的备份。这将让你每次。
停止 SQL Server,启动 SQL Server,然后运行上述脚本或使用 UI。
我搜索了一段时间的解决方案,最后想出了以下解决方案,
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
这应该有效。编码快乐!!
谢谢!!