在较低版本上的SQL Server数据库备份还原


185

如何将较高版本的SQL Server数据库备份文件还原到较低版本的SQL Server?

使用SQL Server 2008 R2(10.50.1600),我制作了一个备份文件,现在我想将其还原到活动服务器的SQL Server 2008(10.00.1600)中

当我尝试将备份还原到SQL Server 2008时,出现错误,即Restore Failed

该数据库已备份在运行版本10.50.1600的服务器上。该版本与此服务器(运行版本10.00.1600)不兼容。

如何在此服务器上还原备份文件?


2
您无法做到这一点-这是不可能的。SQL Server不允许将数据库从更高版本“降级”到更低版本
。– marc_s

18
Microsoft了解SQL Server的所有知识(因为他们创建了它),但是不可能在两个版本之间移动数据。我只是不明白为什么某些兼容模式在导出中不可用。有多难?
dvdmn

1
@dvdmn就像任何Top Gear剧集所说的那样辛苦-不同类型,不同陈述,不同块布局。无论涉及哪个版本,在数据库之间移动数据都非常容易。降级虽然不是
Panagiotis Kanavos '16

2
@PanagiotisKanavos我不同意,在mysql中,您可以将db作为sql命令导出,并且可以在任何版本的mysql(向下或向上)上还原它。是的,您也可以将sql db导出为脚本,但是如果您有一些相互依赖的存储函数/过程,则还原它并不容易。基本上没有用/解决方案。
dvdmn

3
@dvdmn导出数据库的脚本与备份完全不同。我意识到有些产品不提供备份/还原功能,或更糟糕的是,混淆了这两个概念。这通常是由于历史原因而发生的:过去缺乏备份,有些产品用该名称称为“导出/脚本”。现在他们已经这样做了,他们必须继续通过谈论物理和逻辑备份来解决术语冲突,然后在谈论脚本时
变得一头雾水

Answers:


78

否,无法降级数据库。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数据库中。

由于权限限制,我无法升级客户端实时服务器。而且我的数据库大小超过2.5GB,因此由于内存异常错误,我无法创建数据脚本。

9
@Gaurav不要编写数据脚本-而是编写没有数据的整个数据库(表,proc,触发器,约束等)脚本,创建新数据库,然后右键单击源数据库,转到“工具”,然后“导出数据”以将表的内容传输到数据库。
Jim McLeod

17
我对“没有办法”的拍拍回答感到非常怀疑,这意味着您还没有找到办法。您可能要这样做的原因可能很多,因此这不是有用的答案。
2014年

6
我不同意@Jay,有时“您不能”是一个完美的答案,尽管提供可用的解决方法更为有用。
罗素·福克斯

1
@Zhang如果您有问题,请以问题而非评论的形式提出。
Remus Rusanu

83

您可以使用称为“ 导出数据层应用程序”的功能,该功能生成.bacpac包含数据库架构和数据的文件。

在目标服务器上,您可以使用“ 导入数据层应用程序”选项,该选项可以从预先创建的.bacpac文件创建并填充新数据库

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

我已经在从SQL 2014到SQL 2012以及从SQL 2014到SQL 2008R2的不同版本的SQL Server上尝试了此过程,并且运行良好。


8
这是一个值得更多关注的答案。实际上,它在大多数情况下都可以正常工作。但是,如果您那里有孤立的SQL用户,则导出操作将失败。您始终可以手动删除/添加这些位,以超越SQL版本。
蓝博士

3
我只是尝试这样做,以在我的MSSQLEX2012(V11)上的MSSQLEX2014(V12)上创建一个数据库。我只是收到“ Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider无效”错误,无法更改它。
克雷格2015年

5
使用.bakpac从SQL Server 2014导入到2012年确实可以,但是需要正确版本的SSMS。例如,我使用SSMS 2016 CTP3,它可以完美地工作。它没有使用SSMS 2012年我要工作,我没有测试SSMS 2014年
格雷格胶

1
有谁知道可以在T-SQL中编写此过程的脚本吗?更新(在进行一些谷歌搜索后回答自己):您可以通过sqlpackage.exe命令行自动执行此操作。谷歌更多。
亚历克斯(Alex)

1
这是将大型/复杂的SQL2017降级到SQL2016的唯一解决方案。性能也很好。
基思(Keith Blows)

35

不一定会工作

将工作

  • 脚本生成 - 任务 -> 生成脚本。确保在“ 设置脚本选项 -> 高级”页面上设置所需的目标SQL Server版本。您也可以在此处选择复制架构,数据还是同时复制两者。请注意,在生成的脚本中,如果从非表达方式转换为表达方式,则可能需要更改mdf / ldf文件的DATA文件夹,反之亦然。

  • 我认为Microsoft SQL Server数据库发布服务 -随SQL Server 2005及更高版本一起提供。从此处下载最新版本。先决条件:sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msiSQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi在此处下载)。


7
脚本生成对于大量数据库不可靠,请尽可能避免。
克里斯

底部两条链路404
Sнаđошƒаӽ

29

这是我的2美分,用于完成此操作的不同选择:

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

红门是最受欢迎的门户之一,但还有许多其他站点,例如ApexSQL DiffApexSQL Data DiffAdept SQLIdera …。所有这些都是高级工具,但是您可以在试用模式下完成工作;)

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

导入和导出向导:这不是理想的解决方案,因为它不会还原所有对象,而只会还原数据表,但是您可以在需要时考虑将其用于快速而肮脏的修复。


1
Red Gate Sql Clone不支持在不同版本的SQL Server之间进行克隆,报告的完全相同的错误与我尝试手动执行此操作时得到的错误相同。
DarkDeny

29

您无法将在较高版本中创建的数据库(或附加)还原为较低版本。唯一的方法是为所有对象创建一个脚本,然后使用该脚本生成数据库。

在此处输入图片说明

选择“架构和数据” - 如果您想将所有内容都放入备份脚本文件中,请
选择“ 仅架构” - 如果仅需要架构。

在此处输入图片说明

是的,现在您已经完成了使用数据库的架构和数据创建脚本的操作。


16

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

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

您可以将数据库复制到较低版本的SQL Server实例。从SQL Server 2008 R2(SP1)-10.50.2789.0到Microsoft SQL Server 2008(SP2)-10.0.3798.0,这对我有用


3
请注意,如果目标是SQL Server表达“目标服务器不能是SQL Server 2005或更高版本的Express实例”,则这将不起作用。social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/...
辖施耐德

2
也无法通过这种方式将数据库从SQL Server 2012复制到SQL Server 2008。
2013年

1
复制数据库一个分离/附加操作
Panagiotis Kanavos '16

1
感谢您的提示!那对我很有帮助。我从2008年SQL复制的数据R2至2008年的SQL
dns_nx

8

你可以试试看

  1. 在SQL Server 2008上创建一个数据库。
  2. 使用导入数据功能可从SQL Server R2(或任何更高版本)导入数据。
  3. 使用“ RedGate SQLCompare”来同步脚本。

6

转到任务->生成脚本 ...

先进“脚本的数据类型”中选择"Schema and data"并尝试在较低版本运行此脚本。


5
这是一个很好的解决方案,但对于较大的数据库则效果很差。
veljasije

5

它不是很漂亮,但这是我这样做的方法,它授予您在SQL 2008 R2安装中安装了此选项。

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

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

3)现在,右键单击新数据库,然后选择“任务” ..“导入数据..”,选择源作为R2数据库,选择目标作为新数据库。“从一个或多个表或视图复制数据”,选中顶部的复选框以选择所有表,然后下一步,运行该软件包,您应该将所有内容都安装在较旧的版本上。这也应该适用于2005版。希望这可以帮助某人。


嗨@motogeek,我有同样的问题,但是我在生产服务器上有R2,在本地有2008,在这种情况下,我无法使用导入和导出数据。理想的解决方案是什么?
阿巴斯

2

您可以使用BCP进出小型表。

BCP OUT命令:-

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

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

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

0

我很欣赏这是一篇过时的文章,但是对于人们了解Azure迁移向导(可在Codeplex上使用-不能链接,因为在我键入此代码时,由于Codeplex目前无法链接)可能会非常有用。


该工具已替换为SQL Server数据迁移助手。请参阅:stackoverflow.com/questions/46517060/...
ahwm

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.