我们有一个使用SQL服务器的应用程序。此应用程序使用单用户模式非常频繁地恢复数据库。以下是在单用户模式下恢复数据库并以多用户模式恢复数据库所执行的SQL。
alter database [test-db] set single_user with rollback immediate;
use master;restore database [test-db] from database_snapshot = 'snapshot_test-db';
alter database [test-db] set multi_user;
将test-db切换到单用户模式后,Taskmanager的4-5个后台进程会跳入,应用程序无法再使用同一会话对数据库执行进一步操作(恢复数据库和更改数据库)。这些背景过程在他们自己之间陷入僵局。请参考下面sp_who2的输出。
13,BACKGROUND,sa,。,。,master,BRKR EVENT HNDLR,0,27,11 / 28 16:13:40,13,0
14,BACKGROUND,sa,。,。,master,BRKR TASK,0,0,11 / 28 16:13:40,14,0
15,sleep,sa,。,。,master,TASK MANAGER,0,2,11 / 28 16:13:40,15,0,
16,BACKGROUND,sa,。,23,test-db,TASK MANAGER,16,5,11 / 28 16:13:40,,16,0 <
17,BACKGROUND,sa,。,。,master,BRKR TASK,0,0,11 / 28 16:13:40,17,0
18,BACKGROUND,sa,。,。,master,BRKR TASK,0,36,11 / 28 16:13:40,18,0
19,睡觉,sa,。,。,主人,任务经理,0,0,11 / 28 16:13:40,19,0,
20,BACKGROUND,sa,。,23,test-db,TASK MANAGER,0,1,11 / 28 16:13:40,20,0
21,BACKGROUND,sa,。,23,test-db,TASK MANAGER,0,1,11 / 28 16:13:40,21,0
22,BACKGROUND,sa,。,。,msdb,DELETE,6094,835,11 / 28 16:13:40,22,0
23,BACKGROUND,sa,。,21,test-db,TASK MANAGER,0,0,11 / 28 16:13:40,23,0
24,sleep,sa,。,。,master,TASK MANAGER,0,0,11 / 28 16:13:40,24,0
25,sleep,sa,。,。,master,TASK MANAGER,0,0,11 / 28 16:13:40,25,0,
26,睡觉,sa,。,。,主人,任务经理,0,41,11 / 28 16:13:40,26,0
27,背景,sa,。,。,主人,TRACE QUEUE TASK,3047,1680,11 / 28 16:13:40,27,0,
28,睡觉,sa,。,。,主人,任务经理,0,5,11 / 28 16:13:40,28,0
29,睡觉,sa,。,。,主人,任务经理,0,0,11 / 28 16:13:40,29,0,
30,睡觉,sa,。,。,主人,任务经理,0,0,11 / 28 16:13:40,,30,0
31,睡觉,sa,。,。,主人,任务经理,0,0,11 / 28 16:13:40,,31,0
51,RUNNABLE,DY-EPO46 \ Administrator,DY-EPO46,。,master,SELECT INTO,110,64,11 / 28 16:30:44,Microsoft SQL Server Management Studio - 查询,51,0
52,睡觉,DY-EPO46 \管理员,DY-EPO46 ,.,master,AWAITING COMMAND,156,14,11 / 28 16:16:39,Microsoft SQL Server Management Studio,52,0
53,睡觉,DY-EPO46 \管理员,DY-EPO46,。,test-db,AWAITING COMMAND,16,16,11 / 28 16:30:40,Microsoft SQL Server Management Studio - 查询,53,0
在搜索此问题时,我发现人们遇到了类似的问题,但我无法找到问题的根本原因和调试步骤。提供停止SQL服务器作为解决这些后台进程的解决方案,但在我们的情况下这不可行,因为恢复数据库的代码运行非常频繁,导致此问题的频率很高。
我还确保SQL Server代理没有运行。服务器上运行的SQL服务是SQL Server,SQL Server Browser和SQL Server VSS Writer。