You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:06:03