我们的新DBA已将数据库带入单用户模式以执行分离附加操作,但他错误地关闭了该分区。 从那时起,没有人能够访问该数据库。
我尝试使用sp_who2查找会话ID,但是没有在该数据库上显示任何会话ID。
我正在使用" SQL Server 2016标准版"在" Windows服务器2016"。
答案 0 :(得分:7)
通过使用动态视图" sys.dm_tran_locks"我们可以找到 卡在单用户模式下的数据库的活动会话 如下:
- 查询以查找session_id
SELECT request_session_id FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID('YourDatabaseName')
现在杀死上述查询找到的会话ID,如下所示:
-- kill all the processes which are using your database with following query:
KILL spid
使用以下查询将数据库置于多用户模式:
USE Master
GO
ALTER DATABASE YourDatabaseName SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
将数据库联机。
USE Master
Go
ALTER DATABASE YourDatabaseName SET online
Go
使用以下查询检查数据库的状态,您的数据库应该恢复正常/多用户模式并在线。
select * from sys.databases where name ='YourDatabaseName'
答案 1 :(得分:0)
下面是该问题的有效解决方案,
SSMS通常在后台使用多个与数据库的连接。
您将需要先终止这些连接,然后再更改访问方式。(我已经通过下面的代码模板中的 EXEC(@kill); 完成了此操作。)< / p>
然后
运行以下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
这应该有效。编码愉快!
谢谢!