如何将高版本SQL Server数据库备份文件恢复到低版本SQL Server?

使用SQL Server 2008 R2(10.50.1600),我做了一个备份文件,现在我想在我的live服务器的SQL Server 2008(10.00.1600)上恢复它。

当我试图将备份恢复到SQL Server 2008上时,它给出了一个错误,即恢复失败,因为:

数据库备份在运行版本为10.50.1600的服务器上。 该版本与正在运行的服务器不兼容 10.00.1600.

如何恢复该服务器上的备份文件?


不,不能降级数据库。其中“10.50.1600”为SQL Server 2008 R2版本。您绝对无法恢复或将此数据库附加到您试图恢复的SQL Server 2008实例(10.00.1600是SQL Server 2008)。你唯一的选择是:

将此实例升级到SQL Server 2008 R2或 恢复您在SQL Server 2008 R2实例上的备份,导出所有数据并导入SQL Server 2008数据库。


你可以试试这个。

在SQL Server 2008上创建数据库。 使用Import Data特性从SQL Server R2(或更高版本)导入数据。 使用“RedGate SQLCompare”同步脚本。


这并不漂亮,但这就是我如何做到的,前提是你在SQL 2008 R2安装上安装了这个选项。

1)右键单击SQL Server 2008 R2“任务”中的数据库。在向导中“生成脚本”,第一步选择整个数据库和对象。在“设置脚本选项”步骤,你应该看到一个按钮“高级”,选择这个,并确保你选择的“脚本服务器版本”= SQL Server 2008”而不是R2版本。 这是至关重要的一步,因为“导入数据”本身并不会带来所有的主键、约束条件和任何其他对象,如存储过程。”

2)使用查询窗口运行在新的安装实例或数据库实例SQL Express或SQL Server 2008上生成的SQL脚本,或者打开已保存的. SQL脚本并执行,可以看到新的数据库。

3)现在右键点击新的数据库,选择“任务”..“Import Data..”选择源数据库作为R2数据库,目标数据库作为新数据库。“从一个或多个表或视图复制数据”,选中顶部复选框以选择所有表,然后下一步,运行包,您应该在旧版本上拥有所有内容。这应该也适用于回到2005年的版本。希望这能帮助到一些人。


另一种方法是使用“复制数据库”功能:

通过右键单击源数据库>“任务”>“复制数据库”找到。

您可以将数据库复制到低版本的SQL Server实例中。从SQL Server 2008 R2 (SP1) - 10.50.278.9到Microsoft SQL Server 2008 (SP2) - 10.0.3798.0,这对我来说都是有效的


不一定会起作用

备份/恢复-当目标是较早的MS SQL版本时将不起作用。 复制数据库-当目标是SQL Server Express时将不起作用:“目标服务器不能是SQL Server 2005或更高版本的Express实例。” 数据导入——不会复制模式。

将工作

Script generation - Tasks -> Generate Scripts. Make sure you set the desired target SQL Server version on the Set Scripting Options -> Advanced page. You can also choose there whether to copy schema, data, or both. Note that in the generated script, you may need to change the DATA folder for the mdf/ldf files if moving from non-express to express or vice versa. Microsoft SQL Server Database Publishing Services - comes with SQL Server 2005 and above, I think. Download the latest version from here. Prerequisites: sqlncli.msi/sqlncli_x64.msi/sqlncli_ia64.msi, SQLServer2005_XMO.msi/SQLServer2005_XMO_x64.msi/SQLServer2005_XMO_ia64.msi (download here).


以下是我对完成这个任务的不同选择的2点看法:

第三方工具:完成这项工作最简单的方法可能是在低版本上创建一个空数据库,然后使用第三方工具读取备份,并将新创建的数据库与备份同步。

红门是最受欢迎的之一,但还有许多其他像ApexSQL Diff, ApexSQL数据Diff, Adept SQL, Idera ....所有这些都是高级工具,但你可以在试用模式下完成工作;)

生成脚本:正如其他人已经提到的,您总是可以使用SSMS编写脚本结构和数据,但您需要考虑到执行的顺序。默认情况下,对象脚本的顺序是不正确的,您必须注意依赖关系。如果数据库很大并且有很多对象,这可能是一个问题。

导入和导出向导:这不是一个理想的解决方案,因为它不会恢复所有对象,而只恢复数据表,但当需要时,您可以考虑使用它进行快速和肮脏的修复。


转到任务->生成脚本…

在“脚本的数据类型”的“高级”中选择“模式和数据”,并尝试在低版本中运行此脚本。


您可以使用名为Export data - tier Application的功能,它可以生成包含数据库模式和数据的.bacpac文件。

在目标服务器上,您可以使用Import Data-Tier Application选项,该选项可以从预先创建的.bacpac文件创建并填充新数据库

如果只想传输数据库模式,可以使用Extract Data-Tier Application创建文件,使用Deploy Data-Tier Application部署创建的数据库模式。

我在不同版本的SQL Server上尝试了这个过程,从SQL 2014到SQL 2012,从SQL 2014到SQL 2008R2,效果很好。


不能将在高版本中创建的数据库恢复(或附加)到低版本中。唯一的方法是为所有对象创建一个脚本,并使用该脚本生成数据库。

选择“Schema and Data”-如果你想同时取 备份脚本文件中的内容选择仅架构- 如果只需要模式。

是的,现在您已经完成了使用数据库的模式和数据创建脚本。


我知道这是一篇老文章,但它可能对人们有用,让他们知道Azure迁移向导(在Codeplex上可用-不能链接到Codeplex,因为我正在输入这篇文章)可以很容易地做到这一点。


对于小表,可以使用BCP in和out。

BCP OUT命令:-

BCP "SELECT *  FROM [Dinesh].[dbo].[Invoices]" QUERYOUT C:\av\Invoices1.txt -S MC0XENTC -T -c -r c:\error.csv

BCP IN command:- 为Invoicescopy1创建表结构。

BCP [Dinesh].[dbo].[Invoicescopy1] IN C:\av\Invoices.txt -S MC0XENTC -T -c

您必须使用SSMS中的Import/Export向导来迁移所有内容

使用备份/恢复或分离/附加不可能“降级”。因此,你要做的是:

从运行新SSMS/SQL版本的服务器备份数据库。 通过展开“Tasks”菜单(在右键单击目标数据库之后)并选择“Import data”选项,从生成的.bak文件导入数据。


您可以从任务菜单生成脚本

详细参考

如何迁移SQL Server数据库到低版本