SQL Server数据库还原报错:无法获取独占访问权求助
解决SQL Server数据库还原时“Exclusive access could not be obtained”的问题
问题背景
你在执行以下VB.NET代码还原数据库时遇到了错误:
Dim connSQLServerMaster As New SqlConnection("Data Source=YOUSRY\LAB_SERVER;Initial Catalog=master;User ID=admin;Password=123") Dim cmd As New SqlCommand("Restore database clinic_program from disk ='d:\backup\clinic_program.bak' with Replace,recovery", connSQLServerMaster) connSQLServerMaster.Open() cmd.ExecuteNonQuery() connSQLServerMaster.Close() End Sub
错误提示:
Exclusive access could not be obtained because the database is in use. RESTORE DATABASE is terminating abnormally
问题原因
SQL Server的还原操作需要获取目标数据库的独占访问权限,如果此时有其他应用、用户或者进程正在连接到clinic_program数据库,就会触发这个错误。
解决方案
方案1:在还原前强制断开所有连接(推荐)
修改你的SQL命令,先将目标数据库设置为单用户模式并立即回滚所有未完成的事务,这样就能强制断开所有活跃连接,完成还原后再改回多用户模式。
修改后的完整代码如下:
Dim connSQLServerMaster As New SqlConnection("Data Source=YOUSRY\LAB_SERVER;Initial Catalog=master;User ID=admin;Password=123") ' 组合SQL脚本:先设置单用户模式,再还原,最后恢复多用户模式 Dim restoreScript As String = " ALTER DATABASE clinic_program SET SINGLE_USER WITH ROLLBACK IMMEDIATE; RESTORE DATABASE clinic_program FROM DISK = 'd:\backup\clinic_program.bak' WITH REPLACE, RECOVERY; ALTER DATABASE clinic_program SET MULTI_USER; " Dim cmd As New SqlCommand(restoreScript, connSQLServerMaster) connSQLServerMaster.Open() cmd.ExecuteNonQuery() connSQLServerMaster.Close() End Sub
方案2:手动关闭SSMS中的连接(临时应急)
如果你是在开发环境测试,可以先打开SQL Server Management Studio (SSMS):
- 找到
clinic_program数据库,右键选择属性 - 切换到选项页,将限制访问改为
SINGLE_USER,选择立即回滚后确定 - 执行还原操作,完成后再改回
MULTI_USER
注意事项
ROLLBACK IMMEDIATE会立即终止所有未提交的事务,所以在生产环境执行前要确认没有重要的未完成操作- 确保你的数据库账号(这里是
admin)有足够的权限执行ALTER DATABASE和RESTORE操作
内容的提问来源于stack exchange,提问作者Yousry Eldashash




