Lio*_*cer 190 sql-server sql-server-2008-r2
目前,我的数据库处于单用户模式.当我尝试扩展数据库时,我收到一个错误:
无法访问数据库'my_db'.(ObjectExplorer)
此外,当我尝试删除数据库时,我收到错误:
目前无法更改数据库'my_db'的状态或选项.数据库处于单用户模式,用户当前已连接到该用户.
如何退出单用户模式?我没有任何用户使用此数据库.
当我尝试使用IIS浏览我的网站时,我得到的错误是:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
我觉得好像单用户模式导致了这种情况.
CRA*_*DBA 350
SSMS通常在后台使用几个与数据库的连接.
在更改访问模式之前,您需要终止这些连接.
首先,确保对象资源管理器指向像master这样的系统数据库.
其次,执行sp_who2并找到数据库'my_db'的所有连接.通过做杀死所有的连接KILL { session id }
,其中会话ID是SPID
上市sp_who2
.
第三,打开一个新的查询窗口.
执行以下代码.
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
Run Code Online (Sandbox Code Playgroud)
请参阅我关于管理数据库文件的博客文章 这是为移动文件编写的,但用户管理是相同的.
Sat*_*ish 38
首先,查找KILL
当前正在运行的所有进程.
然后,运行以下命令T-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
Run Code Online (Sandbox Code Playgroud)
rsb*_*rro 24
要切换出单用户模式,请尝试:
ALTER DATABASE [my_db] SET MULTI_USER
要切换回单用户模式,您可以使用:
ALTER DATABASE [my_db] SET SINGLE_USER
Tom*_*mas 17
Ela*_*amy 14
我试过这个工作
ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
以下对我有用:
USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,使用此查询找到了要杀死的session_id:
Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Run Code Online (Sandbox Code Playgroud)
按CTRL + 1
找到锁定数据库的进程.查看db的列dbname并记下spid.现在你必须执行该语句:
kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)
小智 5
不确定这是否有助于任何人,但我有同样的问题,无法找到阻碍我的过程.我关闭了SSMS并停止了所有服务到达本地实例.然后,当我回到并运行exec sp_who2时,它向我展示了罪魁祸首.我杀死了这个进程,并且能够让Multi_User工作,然后重启服务.我们每隔几分钟/秒就让IIS点击它,寻找某些包.
另一种选择是:
ALTER DATABASE [Your_Db] SET MULTI_USER
添加到Jespers 的答案中,会更有效:
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
Run Code Online (Sandbox Code Playgroud)
SET DEADLOCK_PRIORITY HIGH
DEADLOCK_PRIORITY
5.用途
发生的情况是其他进程对数据库进行了破解,如果您的进程具有较低的DEADLOCK_PRIORITY
,那么它就会输掉比赛。
这避免了查找并杀死其他 spid(这可能需要多次完成)。
您可能需要运行ALTER DATABASE
多次(但 Jesper 会这样做)。修改后的代码:
USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
小智 5
使用这个脚本
exec sp_who
Run Code Online (Sandbox Code Playgroud)
查找 dbname 和 spid 列
现在执行
kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)
小智 5
以防万一有人偶然发现此线程,那么这里有一个针对SQL Server的防弹解决方案,它停留在单用户模式下
-获取您需要终止的连接的进程ID(spid)
-用数据库的实际名称替换'DBName'
SELECT sd.[name], sp.spid, sp.login_time, sp.loginame
FROM sysprocesses sp
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid
WHERE sd.[name] = 'DBName'
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用命令“ sp_who”来获取打开连接的“ spid”:
-或改用此SP
exec sp_who
Run Code Online (Sandbox Code Playgroud)
-然后执行以下操作,并用正确的值替换[spid]和[DBName]
KILL SpidToKillGoesHere
GO
SET DEADLOCK_PRIORITY HIGH
GO
ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
258959 次 |
最近记录: |