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

使用VB.Net附加分离SQL Server数据库时遇内存问题求助

问题排查:SQL Server数据库分离/附加VB.Net代码执行错误

我管理着约300个总内存达119GB的SQL Server数据库,因内存问题尝试通过按需分离和附加数据库优化资源,以下是编写的VB.Net代码,但执行时出现错误。

附加数据库代码

Private Sub AttachDB()
    Dim VQ101 As String
    VQ101 = "CREATE DATABASE [USERRIS] ON  "
    VQ101 &= " ( FILENAME = N'D:\ASSETS\USERRIS.mdf' ), "
    VQ101 &= " ( FILENAME = N'D:\ASSETS\USERRIS_log.ldf' ) FOR ATTACH"
    Dim StrConState As String = "server=' " + MySerName + " ';Initial Catalog=master;Integrated Security=SSPI;"
    Dim ViewQuery As String = VQ101
    Using connection As New SqlConnection(StrConState)
        Using cmd As New SqlCommand(ViewQuery)
            cmd.Connection = connection
            connection.Open()
            cmd.ExecuteNonQuery()
            connection.Close()
        End Using
    End Using
End Sub

分离数据库代码

Private Sub DetatchDB()
    Dim VQ101 As String
    VQ101 = "EXEC master.dbo.sp_detach_db @dbname = N'USERRIS'"
    Dim StrConState As String = "server=' " + MySerName + " ';Initial Catalog=master;Integrated Security=SSPI;"
    Dim ViewQuery As String = VQ101
    Using connection As New SqlConnection(StrConState)
        Using cmd As New SqlCommand(ViewQuery)
            cmd.Connection = connection
            connection.Open()
            cmd.ExecuteNonQuery()
            connection.Close()
        End Using
    End Using
End Sub

错误排查与解决方案

根据错误提示,以下是针对性排查步骤:

1. 分离失败的核心问题:数据库被占用

sp_detach_db无法分离存在活跃连接的数据库,这是最常见的触发原因。

  • 修改分离代码:先强制断开目标数据库的所有连接,再执行分离操作:
Private Sub DetatchDB()
    Dim VQ101 As String
    ' 先杀死目标数据库的所有活跃连接
    VQ101 = "USE master; DECLARE @kill varchar(8000) = ''; " &
            "SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';' " &
            "FROM sys.sysprocesses WHERE dbid = DB_ID('USERRIS'); EXEC(@kill); "
    ' 执行分离,添加参数跳过检查、保留全文索引文件
    VQ101 &= "EXEC master.dbo.sp_detach_db @dbname = N'USERRIS', " &
            "@skipchecks='true', @keepfulltextindexfile='true'"
    
    Dim StrConState As String = "server='" + MySerName + "';Initial Catalog=master;Integrated Security=SSPI;"
    Using connection As New SqlConnection(StrConState)
        Using cmd As New SqlCommand(VQ101)
            cmd.Connection = connection
            connection.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

2. 附加失败的潜在问题

  • 文件权限/路径错误:确保SQL Server服务账户对D:\ASSETS\目录拥有读写权限,检查文件路径拼写是否正确。
  • 日志文件损坏:如果日志文件无效,可使用FOR ATTACH_REBUILD_LOG重建日志(会自动创建新的日志文件):
Private Sub AttachDB()
    Dim VQ101 As String
    VQ101 = "CREATE DATABASE [USERRIS] ON  "
    VQ101 &= " ( FILENAME = N'D:\ASSETS\USERRIS.mdf' ) FOR ATTACH_REBUILD_LOG"
    
    Dim StrConState As String = "server='" + MySerName + "';Initial Catalog=master;Integrated Security=SSPI;"
    Using connection As New SqlConnection(StrConState)
        Using cmd As New SqlCommand(VQ101)
            cmd.Connection = connection
            connection.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

3. 通用代码优化

  • 移除连接字符串中服务器名前后的空格:原代码server=' " + MySerName + " '会导致服务器名带空格,可能引发连接失败,改为server='" + MySerName + "'。
  • 无需手动调用connection.Close(),Using块会自动释放连接资源,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:09:52