You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 DATABASERESTORE操作

内容的提问来源于stack exchange,提问作者Yousry Eldashash

火山引擎 最新活动