【问题标题】:SQL Server database backup restore on lower version较低版本上的 SQL Server 数据库备份还原
【发布时间】:2020-03-20 04:29:30
【问题描述】:

如何将高版本的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.

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

【问题讨论】:

  • 你不能这样做——这是不可能的。 SQL Server 不允许将数据库从较高版本“降级”到较低版本。
  • Microsoft 了解有关 SQL Server 的一切(因为他们创建了它),但在 2 个版本之间移动数据是不可能的。我只是不明白为什么某种兼容模式在导出中不可用。有多难?
  • @dvdmn 就像他们所说的任何 Top Gear 剧集一样难——不同的类型、不同的陈述、不同的块布局。在数据库之间移动数据非常简单,无论涉及哪个版本。降级虽然不是
  • @PanagiotisKanavos 我不同意,在 mysql 中,您可以将 db 导出为 sql 命令,并且可以在任何版本的 mysql(向下或向上)上恢复它。是的,您也可以将 sql db 导出为脚本,但如果您有一些相互依赖的存储函数/过程,则恢复它并不容易。基本没用/解决办法。
  • @dvdmn 导出数据库脚本完全与备份不同。我意识到有些产品不提供备份/恢复功能,或者更糟糕的是,混淆了这两个概念。这通常是由于历史原因而发生的:过去缺少备份,某些产品以该名称称为导出/脚本。现在他们这样做,他们必须通过谈论物理和逻辑备份来不断解决术语冲突,然后在谈论脚本时混淆

标签: sql-server


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是一个值得更多关注的答案。它实际上适用于大多数情况。但是,如果那里有孤立的 SQL 用户,则导出操作将失败。您始终可以手动删除/添加这些位以超越 SQL 版本。
  • 我刚试过这个,在我的 MSSQLEX2012 (V11) 上创建一个在 MSSQLEX2014 (V12) 上创建的数据库。我只是收到“Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider 无效”错误,无法更改。
  • 使用 .bakpac 从 SQL Server 2014 导入到 2012 确实有效,但它需要正确版本的 SSMS。例如,我使用 SSMS 2016 CTP3,它完美地工作。使用 SSMS 2012 对我不起作用。我没有测试 SSMS 2014。
  • 有人知道是否可以在 T-SQL 中编写这个过程吗?更新(经过一番谷歌搜索后回答自己):您可以通过sqlpackage.exe 命令行自动执行此操作。谷歌了解更多。
  • 这是唯一适用于将相当大/复杂的 SQL2017 降级到 SQL2016 的解决方案。性能也很好。
【解决方案2】:

不,不能降级数据库。 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 数据库。

【讨论】:

  • @Gaurav 不要编写数据脚本 - 相反,编写没有数据的整个数据库(表、过程、触发器、约束等),创建新数据库,然后右键单击源数据库,转到“工具”,然后转到“导出数据”,将表的内容传输到您的数据库。
  • 我非常怀疑“没有可能的方法”这样的回答——这只是意味着你还没有找到方法。您想要这样做的原因可能有很多,所以这不是一个有用的答案。
  • 我不同意,@Jay,有时“你不能”是完美的答案,尽管在可用的情况下提供解决方法更有用。
  • @Zhang 如果您有任何问题,请作为问题提出,而不是作为评论。
  • veljasije 的答案有一个简单的解决方法。不明白为什么“不可能”被标记为答案,当有一个简单的解决方案可以在没有任何升级的情况下实现它。
【解决方案3】:

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

选择“架构和数据” - 如果您想同时使用 备份脚本文件中的内容
选择 Schema Only - 如果只需要架构。

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

【讨论】:

  • 现在是 2020 年,这是最好的答案!
  • @d.popov 仅当数据库为几千兆字节时,否则文件将太大而无法被 SSMS 读取。
【解决方案4】:

不一定有效

会起作用

  • 脚本生成 - 任务 -> 生成脚本。确保在 Set Scripting Options -> Advanced 页面上设置了所需的目标 SQL Server 版本。您还可以在此处选择是否复制模式、数据或两者。请注意,在生成的脚本中,如果从 non-express 移动到 express,您可能需要更改 mdf/ldf 文件的 DATA 文件夹,反之亦然。

  • Microsoft SQL Server 数据库发布服务 - 我认为是 SQL Server 2005 及更高版本附带的。从here 下载最新版本。先决条件:sqlncli.msi/sqlncli_x64.msi/sqlncli_ia64.msiSQLServer2005_XMO.msi/SQLServer2005_XMO_x64.msi/SQLServer2005_XMO_ia64.msi(下载here)。

【讨论】:

【解决方案5】:

这是我完成此任务的不同选项的 2 美分:

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

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

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

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

【讨论】:

  • Red Gate Sql Clone 不支持在不同版本的 SQL Server 之间进行克隆,报告的错误与我尝试手动执行此操作时遇到的完全相同。
【解决方案6】:

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

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

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

【讨论】:

  • 请注意,如果目标是 SQL Server Express,这将不起作用“目标服务器不能是 SQL Server 2005 或更高版本的 Express 实例。” social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/…
  • 这种方式也无法将数据库从 SQL Server 2012 复制到 SQL Server 2008。
  • 复制数据库一个分离/附加操作
  • 感谢您的提示!这对我帮助很大。我将数据从 SQL 2008 R2 复制到 SQL 2008。
  • 我在 SSMS 18.4 中看不到此选项。 YMMV。
【解决方案7】:

你可以试试这个。

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

【讨论】:

    【解决方案8】:

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

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

    【讨论】:

    • 这是一个很好的解决方案,但在大型数据库中效果很差。
    【解决方案9】:

    这并不漂亮,但我就是这样做的,因为您已在 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,在这种情况下我不能使用导入和导出数据。什么是理想的解决方案?
    【解决方案10】:

    您可以在小桌子上使用 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
    

    【讨论】:

      【解决方案11】:

      我很欣赏这是一篇旧帖子,但它可能对人们了解 Azure 迁移向导(在 Codeplex 上可用 - 无法链接到,因为我正在输入这个时 Codeplex 是这样)会做这很容易。

      【讨论】:

      【解决方案12】:

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

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

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

      【讨论】:

        【解决方案13】:

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

        详细参考

        How to migrate a SQL Server database to a lower version

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 2015-07-27
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          相关资源
          最近更新 更多