在.NET中调用还原存储过程数据库卡在还原状态,SQL Server执行正常
问题原因与解决方案
核心原因
- SqlCommand默认执行超时为30秒,你场景下还原操作耗时44.8秒,超过阈值后命令会被提前终止,还原流程未完成最终恢复步骤,导致数据库卡在还原状态。
- C#代码存在连接使用错误:同时声明了
con和conn两个SqlConnection对象,实际执行命令用的是未被using包裹的con,连接未正常关闭释放,可能持有SQL Server会话锁,阻塞还原操作的最终提交。 - 存储过程还原语句未显式指定
RECOVERY参数,部分SQL Server实例默认配置下会使数据库停留在等待后续日志恢复的状态。
修复方案
1. 修正C#调用代码
public void clonedBaseDatabase() { string connString = Common.setConnstring(Common.master_user, Common.master_pass, "master"); string query = "CloneBaseAQSDB"; // 用using统一管理连接生命周期,执行完自动释放 using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand cmd = new SqlCommand(query, conn); cmd.CommandType = CommandType.StoredProcedure; // 自定义超时时间为300秒(5分钟),可根据实际业务调整 cmd.CommandTimeout = 300; cmd.Parameters.AddWithValue("@destDb", DB_NAME); try { cmd.ExecuteNonQuery(); } catch (Exception ex) { Common.addErrorMessage(ex.Message); } } }
2. 调整存储过程还原逻辑
在RESTORE的WITH配置中新增RECOVERY参数,确保还原完成后数据库直接进入可用状态:
RESTORE DATABASE @destDb FROM DISK = @backupPath WITH REPLACE, RECOVERY, MOVE @sourceDb TO @destMdf, MOVE @sourceDb_log TO @destLdf
应急处理方案
如果修改后仍偶发卡住问题,可执行以下SQL手动恢复数据库:
RESTORE DATABASE [目标数据库名称] WITH RECOVERY
内容的提问来源于stack exchange,提问作者gray
相关产品推荐
相关产品推荐

