【问题标题】:The database 'xxx' cannot be opened because it is version 904无法打开数据库“xxx”,因为它是 904 版本
【发布时间】:2020-03-07 07:09:43
【问题描述】:

我无法附加我的数据库。当我尝试在 SQL Server Management Studio 中附加数据库时,出现以下错误:

无法打开数据库“C:\FILES\ACCOUNTING.MDF”,因为它是版本 904。此服务器支持版本 852 和更早版本。不支持降级路径。无法打开新数据库“C:\FILES\ACCOUNTING.MDF”。 CREATE DATABASE 已中止。 (.Net SqlClient 数据提供者)

我已经尝试过这些命令:

cd "C:\Program Files\Microsoft SQL Server\130\LocalDB\Binn"

SqlLocalDB.exe delete "MSSQLLocalDB"

SqlLocalDB.exe create "MSSQLLocalDB"

但还是有错误

【问题讨论】:

标签: sql-server


【解决方案1】:

不能这样做 - 您不能从 较新版本的 SQL Server(v904 = SQL Server 2019)到旧版本(v852,即 SQL Server 2016) - 内部文件结构差异太大,无法支持向后兼容性。

您可以通过以下方式解决此问题

  • 在所有机器上使用相同版本的 SQL Server - 然后您可以轻松地在实例之间备份/恢复数据库

  • 否则,您可以在 SQL Server Management Studio (Tasks > Generate Scripts) 或使用第三方工具

  • 或者您可以使用 Red-Gate 的 SQL CompareSQL Data Compare 等第三方工具在源和目标之间进行“差异化”,根据这些差异生成更新脚本,然后在目标平台;这适用于不同的 SQL Server 版本。

【讨论】:

    【解决方案2】:

    出现问题语句中的错误消息是因为 SQL Server 数据库文件(*.mdf、*.ndf 和 *.ldf)和备份不向后兼容。向后兼容性是我们无法恢复或附加从较高版本的 SQL Server 创建的数据库到较低版本的 SQL Server 的原因。但是,有一些选项可以帮助我们将数据库从较高版本的 SQL Server 降级到较低版本的 SQL Server。这些选项包括:

    使用 SQL Server Management Studio 中的生成脚本向导 使用 SQL Server 集成服务 创建自定义脚本和 BCP 在本技巧中,我们将使用 SQL Server Management Studio 中的生成脚本向导。

    以下是我们需要遵循的基本步骤:

    使用 SSMS 中的“生成脚本向导”为更高版本的 SQL Server 中的数据库架构和数据编写脚本。 连接到较低版本的 SQL Server,并运行在上一步中生成的 SQL 脚本,以创建数据库架构和数据。 在下一节中,我将演示将 SQL Server 2012 数据库降级到 SQL Server 2008 R2 数据库的步骤。

    使用 SSMS 生成脚本向导降级 SQL Server 数据库的步骤

    步骤 1 在 SQL Server 上编写 OUTLANDER 数据库的架构脚本 2012 实例 (IITCUK\DEV01) 使用生成脚本向导 SSMS。

    在对象资源管理器中连接到 IITCUK\DEV01,右键单击 OUTLANDER 数据库,展开 Tasks 并选择“Generate Scripts...”。

    这将启动生成和发布脚本向导。单击下一步,跳过简介屏幕并继续选择对象页面。

    在“选择对象”页面上,选择“脚本整个数据库和所有数据库对象”选项,然后单击“下一步”进入“设置脚本选项”页面。

    高级脚本选项对话框,

    将服务器版本的脚本设置为 SQL Server 2008 R2(或您想要的任何版本) 在 Table/View Options 下,将 Script Triggers、Script Indexes 和 Script Primary Keys 设置为 True 并将 Types of data to script 设置为 Schema and Data - 最后一个选项是关键,因为这是生成每个表的数据的原因。

    完成后,单击“确定”关闭“高级脚本选项”对话框并返回“设置脚本选项”页面。在 Set Scripting Options 页面中,单击 Next 继续到 Summary 页面。

    在“摘要”页面查看您的选择后,单击“下一步”生成脚本。

    成功生成脚本后,选择“完成”按钮关闭“生成和发布脚本”向导。

    第 2 步 连接到 SQL Server 2008 R2 实例 (IITCUK\SQLSERVER2008),然后运行 ​​SQL 脚本 在第 1 步中生成,用于创建 OUTLANDER 数据库架构和数据。

    在对象资源管理器中连接到 IITCUK\SQLServer2008,然后在 SQL Server Management Studio,打开您在步骤 1 中保存的 SQL Server 脚本

    修改脚本,为 OUTLANDER 数据库数据和日志文件指定正确的位置。完成后,运行脚本在 IITCUK\SQLServer2008 实例上创建 OUTLANDER 数据库。

    成功执行后,刷新对象资源管理器中的数据库文件夹。如下图所示,OUTLANDER 数据库已成功降级。

    注意事项 使用此方法时需要注意一些事项。

    此解决方案创建一个大型 SQL 文件,其中包含创建数据库对象的脚本以及表中数据的 INSERT 语句。 对于大型数据库,如果您同时编写模式和数据的脚本,SQL 文件可能会变得非常大,并且可能难以加载到编辑器中。此外,如果文件太大,您可能会从编辑器中收到与内存相关的错误消息。 对于大约 1GB 或更多的大型数据库,如果这种方法不起作用,那么您应该考虑使用 SSIS 迁移数据库或创建自定义脚本来编写对象脚本并通过 BCP 导出每个表的数据。您可以使用此生成脚本向导仅生成没有数据的架构,并使用 SSIS 或 BCP 导出和导入数据。 这种方法适用于 SQL Server 2017 到 SQL Server 2005。一些脚本选项在较新的版本中可能会有所不同,但过程仍然相同。 在执行脚本之前,您应该检查脚本以确保一切看起来都正确,例如数据库文件的路径、数据库选项等。 此外,如果您使用的是较低版本中不存在的新功能,SQL Server 将无法创建对象,您将需要查看生成的脚本并相应地更新代码。 对于一个非常简单的数据库,这种方法应该很容易工作,但是对于更复杂的数据库,您可能需要花一些时间对脚本进行一些修改。 下面是所有脚本选项的列表。如果您单击一个项目,屏幕底部会为您提供该选项的简短定义。

    后续步骤 为避免此问题,请始终确保在将 SQL Server 和数据库升级到更高版本的 SQL Server 之前执行数据库的完整备份。此外,在将应用程序发布给用户之前,请务必彻底测试应用程序。 考虑将此降级选项作为从升级回滚的最后一个选项,因为所需的时间和存储空间可能非常大。 对于非常大的数据库,请确保您有足够的存储空间来支持数据需求。 在发布到生产环境之前,请务必验证行数和对象数并测试您的应用程序。

    其他资源:

    Why Can't I Restore a Database to an Older Version of SQL Server?

    SQL Server Database Engine Backward Compatibility

    SQL Server Upgrade Tips

    【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多