出现问题语句中的错误消息是因为 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