SQL Server Express 2008 不分离自动附加文件?

Posted

技术标签:

【中文标题】SQL Server Express 2008 不分离自动附加文件?【英文标题】:SQL Server Express 2008 not detaching auto-attached file? 【发布时间】:2009-12-14 16:49:06 【问题描述】:

SQLEXPRESS 的 MSDN documentation 说:

当应用程序首次与正在运行的 SQL Server Express 实例建立连接时,SQL Server Express 将自动附加一个 .mdf 文件。当用户关闭应用程序时,SQL Server Express 将 .mdf 文件与实例分离。

这似乎没有发生。如果我用新的同名文件替换 MDF 文件(当然是在删除日志文件之后)SQL Server Express 将拒绝附加它。

我几乎尝试了所有可能的连接字符串参数组合,这让我抓狂。有什么建议吗?

【问题讨论】:

【参考方案1】:

分离/关闭确实发生了。如果它不会发生,那么您不可能替换 MDF 文件,因为它正在使用中。您引用的文档并不完全准确。正确的文档位于SQL Server 2005 Express Edition User Instances:

用户实例数据库具有自动 关闭选项集,这样如果有 8-10 没有与数据库的连接 分钟,数据库关闭并 该文件已关闭。有时候是这样的 自动,但它可能需要一个 同时,特别是如果连接 为您启用了池化 连接。 分离数据库 通过调用从实例 sp_detach_db 将关闭文件。这 是 Visual Studio 使用的方法 确保数据库文件是 IDE 之间切换时关闭 用户实例。

如果我冒昧地猜测一下,我会说数据库不是分离的而是自动关闭的,并且在尝试打开数据库时删除 LDF 后重新替换 MDF 将(理所当然地)被视为错误。

附注:

永远不要删除 LDF 文件。如果要替换数据库,请将 MDF 和 LDF both 替换为新的。 确保更换为正确的 MDF 和 LDF 版本。 SQL Server 可以升级数据库,但不能降级。 得到错误。如果 SQL Express 拒绝附加数据库,它会给出一个理由。查看 RANU 创建的 ERRORLOG(在用户配置文件中)、系统事件日志或将分析器附加到用户实例。

【讨论】:

这至少部分不正确。 (1) 我没有使用用户实例(它们已被弃用),并且 (2) 我引用的 XCOPY 部署文档明确指出不要分发/复制 LDF 文件。也就是说,是的,症状似乎与数据库已关闭但未分离。这不是微软所说的那样。在应用程序可能关闭的所有情况下调用“sp_detach_db”似乎是一个非常丑陋的解决方法。 抱歉,我假设您使用的是 AttachDBFilename,因为绝大多数用户都这样做了,但没有意识到缺点。 是的,我正在使用 AttachDBFilename,因为这就是“XCOPY 部署”的工作方式。但是,这是与 RANU 完全不同的问题。 我不知道在 2K8 中,AtachDBFileName 不会像 2005 年那样启动用户实例。如果 2008 xcopy 使用自动关闭附加数据库并将其保留 i> 在断开连接(但自动关闭)时,这将解释您看到的行为。为什么需要将分离和替换作为应用程序中的常规操作?我在开发时了解,但在部署时?在开发时强制 sp_detach_db 似乎是可以接受的,这显然是 VS 在幕后所做的。 在测试(和生产,分析方面)中,我们经常需要换入不同的数据库文件以从已知的基线开始工作。不幸的是,这看起来像是微软不必要的复杂实现。【参考方案2】:
    private static void DetachMdf(string dbServer, string dbName)
    
        SqlConnection.ClearAllPools();
        using (SqlConnection conn = new SqlConnection(string.Format("Server=0;Database=master;Integrated Security=SSPI", dbServer)))
        
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("sp_detach_db", conn))
            
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@dbname", dbName);
                cmd.ExecuteNonQuery();
            
        
    

【讨论】:

以上是关于SQL Server Express 2008 不分离自动附加文件?的主要内容,如果未能解决你的问题,请参考以下文章

迁移MSSql Db - 来自SQL Server 2008 R2 Enterprise备份可以在SQL Server 2008 R2 Express版本中还原

如何将所有数据库(快速)自 sql server 2008 express 传递到 sql server 2008 R2(无 express)

将数据库项目部署到 SQL Server 2008 Express

您如何使用 SQL Server CE 和 SQL Server 2008 Express?

VB.NET 不在 sql server 2008 express 中创建数据库

sql server 2008 自动备份(非维护计划)