使用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
相关产品推荐
相关产品推荐

