我们的新DBA已将数据库带入单用户模式以执行分离附加操作,但错误地他关闭了该分区.从那时起,没有人能够访问该数据库.
我试图通过使用sp_who2找到会话ID,但它没有在该数据库上显示任何会话ID.
我在"Windows server 2016"上使用"SQL Server 2016 Standard Edition".
Kun*_*nge 10
通过使用动态视图"sys.dm_tran_locks",我们可以找到数据库的活动会话,这些会话停留在单个用户模式中,如下所示:
- 查找session_id的查询
SELECT request_session_id FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID('YourDatabaseName')
Run Code Online (Sandbox Code Playgroud)
现在杀死上面查询找到的会话ID,如下所示:
-- kill all the processes which are using your database with following query:
KILL spid
Run Code Online (Sandbox Code Playgroud)
使用以下查询将数据库置于多用户模式:
USE Master
GO
ALTER DATABASE YourDatabaseName SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)
将数据库联机.
USE Master
Go
ALTER DATABASE YourDatabaseName SET online
Go
Run Code Online (Sandbox Code Playgroud)
使用以下查询检查数据库的状态,您的数据库应该恢复到正常/多用户模式并在线.
select * from sys.databases where name ='YourDatabaseName'
Run Code Online (Sandbox Code Playgroud)
以下是该问题的工作解决方案,
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
Run Code Online (Sandbox Code Playgroud)
要切换回单用户模式,您可以使用:
ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER
Run Code Online (Sandbox Code Playgroud)
这应该有效。快乐编码!!
谢谢!!
| 归档时间: |
|
| 查看次数: |
6106 次 |
| 最近记录: |