执行 KillAllProcesses 时删除服务器的所有活动数据库连接失败
Posted
技术标签:
【中文标题】执行 KillAllProcesses 时删除服务器的所有活动数据库连接失败【英文标题】:Drop all active database connections failed for Server when executing KillAllProcesses 【发布时间】:2010-11-29 04:17:21 【问题描述】:我需要从我的应用程序执行数据库恢复。在这样做之前,我想按如下方式杀死所有进程:
private void KillAllProcessesOnSMARTDatabases(Server targetServer)
targetServer.KillAllProcesses(SMART_DB);
targetServer.KillAllProcesses(SMART_HISTORY_DB);
targetServer.KillAllProcesses(SMART_METADATA_DB);
SqlConnection.ClearAllPools();
但是,当第一个 KillAllProcesses 运行时,我得到以下异常:
Microsoft.SqlServer.Management.Smo.FailedOperationException:删除服务器“MYServer”的所有活动数据库连接失败。 ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:执行 Transact-SQL 语句或批处理时发生异常。 ---> System.Data.SqlClient.SqlException:只能杀死用户进程。
用于创建服务器的连接字符串具有 sa 凭据,但是,需要终止的进程是在不同的用户下启动的。我测试了类似的场景,测试成功了。
这只是最近才开始发生的。对我来说,似乎有一些进程不是由用户启动的?
【问题讨论】:
【参考方案1】:您的代码似乎正在尝试终止所有 SQL Server 进程,这不是一个好主意。
如果要执行数据库还原,应将相关数据库设置为单用户模式或 RESTRICTED_USER 模式,后者最合适。
看看following example 将数据库切换到 RESTRICTED_USER 模式以及如何关闭过程中所有打开的用户连接。
How to: Set a Database to Single-User mode
【讨论】:
【参考方案2】:您可以使用 SMO 来“杀死”特定的数据库。 这将强制仅删除与该数据库的所有客户端连接,然后删除数据库本身。
Microsoft.SqlServer.Management.Smo.Server oServer = this.GetSmoServer();
oServer.KillDatabase(this.DatabaseName);
【讨论】:
以上是关于执行 KillAllProcesses 时删除服务器的所有活动数据库连接失败的主要内容,如果未能解决你的问题,请参考以下文章