AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 244167
Accepted
CB_Ron
CB_Ron
Asked: 2019-07-31 15:22:10 +0800 CST2019-07-31 15:22:10 +0800 CST 2019-07-31 15:22:10 +0800 CST

从 Azure SQL 托管实例备份数据库并还原到本地 SQL Server

  • 772

我将三个数据库迁移到 Azure SQL 托管实例。一个是实用程序数据库,只是通用函数和过程的一小部分集合。一种是用于 Web 应用程序的 OLTP 数据库。第三个是 OLTP 数据库的只读存档,其中包含用于分析和报告的历史数据以及审计表。我需要能够将这些数据库恢复到本地开发和测试服务器。到目前为止,我一直没有成功。

我的第一次尝试是使用备份到 Azure Blob 存储。但是无论我在本地使用什么版本的 SQL Server,我总是收到一个错误,即 Copy Only 备份来自较新版本并且不支持还原。

接下来,我尝试从 SSMS v.18.1 导出数据层应用程序。不幸的是,它永远不会超过出口。我收到几十个错误External references are not supported when creating a package from this platform。托管实例相对于 Azure SQL DB 的最大优势之一是能够执行跨数据库查询。我有许多链接两个数据库中的表的视图和过程。此外,OLTP 数据库中的某些过程调用 Utility 数据库中的函数。由于 MI 不是 Azure SQL 数据库,您会认为这不是问题!

搜索谷歌,我在 Stack Overflow 上找到了这个问题。所以我尝试了作为答案提出的 Visual Studio 方法。尽管它似乎可以工作,这意味着它会在我的本地计算机上创建一个多 GB 的文件,但尝试使用 SSMS 导入该文件会给我一个错误,显示为No data is present in this file.所以然后我尝试了第二种可能的解决方案,使用sqlpackage.exe. 但是该解决方案对我也不起作用,因为它仅引用导出架构。如果我尝试导出整个数据库,/Action:Export我会收到与 SSMS 相同的错误消息。

我还检查了这个数据库管理员问题。没有帮助 - 这是我最初尝试的。如果有人有任何其他想法,我将不胜感激!

restore sql-server-2017
  • 3 3 个回答
  • 7207 Views

3 个回答

  • Voted
  1. KevH
    2019-08-01T03:48:31+08:002019-08-01T03:48:31+08:00

    我已经能够成功地将数据从 Azure 托管实例 (MI) 导出到 SQL Server 2012 系统,而无需 Visual Studio。

    1. 使用 SQL Server Management Studio (SSMS) 右键单击​​要复制的数据库,选择Tasks > Export Data-tier Application. 选择保存创建的 .bacpac 文件的位置。

      • .bacpac 文件是一个 zip 文件,其中包含定义表和关系的 XML 以及存储每个表的数据的 BCP 文件。
    2. 如果您有 7zip 解压缩 bacpac 文件以查看内容。如果不这样做,您可以将文件扩展名从 .bacpac 重命名为 .zip 并使用文件资源管理器解压缩(右键单击 > 全部提取...)

    3. 在您喜欢的文本编辑器中打开 model.xml 文件并查找名为CompatibilityMode. 这将被设置为 MI 的兼容级别(当前为 150)。将其更改为您要导入的兼容性级别。我正在导入 SQL 2012,因此将其更改为 110。

    4. 通过注释掉 model.xml 中的相关行来删除任何其他不兼容的功能。

      • 例如,SQL 2012 不能做 In-Memory 表,所以我不得不从 model.xml 文件中注释掉这部分:
        <!--<Element Type="SqlFilegroup" Name="[XTP]">
                <Property Name="ContainsMemoryOptimizedData" Value="True" />
        </Element>-->
    
    • 将 设置Value为 false 也可能有效。

      1. 把它重新组合起来。Microsoft 添加了一些简单的验证来判断 bacpac 文件是否已损坏或已被篡改。如果您对 model.xml 文件进行了任何更改,您将需要为其计算新的校验和值。该值存储在 bacpac 的 Origin.xml 文件中。
    • 您可以使用 PowerShell 生成新的校验和值:
    Get-FileHash -Path C:\Path\To\Extracted\bacpac\model.xml | Format-Table -Property Hash
    

    你应该得到这样的输出:

    Hash
    ----
    ED8754D205946850F3CED0B033342BF3D88A43E146E57D861191AACC1AC1659A
    
    

    从提取的 bacpac 文件中打开 Origin.xml 文件,并在末尾查找类似这样的一行,并将现有的哈希值替换为新的:

    <Checksums>
      <Checksum Uri="/model.xml">ED8754D205946850F3CED0B033342BF3D88A43E146E57D861191AACC1AC1659A</Checksum>
    </Checksums>
    

    确保不添加任何空格或无关字符。

    现在压缩文件备份,确保存档的顶层是文件,而不是您提取所有内容的文件夹。如果您打开新文件,您应该会看到 xml 文件,而不是单个文件夹名称。

    您现在应该能够将 bacpac 导入您的非 Azure SQL 数据库。

    关于 bacpac 备份的一些注意事项:

    • 它们可能在事务上不一致。要使导出在事务上保持一致,您必须确保在导出期间没有发生任何写入活动,或者您正在从 Azure SQL 数据库的事务一致副本中导出。

    • 如果要导出到 Blob 存储,则 BACPAC 文件的最大大小为 200 GB。要存档较大的 BACPAC 文件,请导出到本地存储。

    • 3
  2. Best Answer
    Ramakant Dadhichi
    2019-08-01T02:24:09+08:002019-08-01T02:24:09+08:00

    不支持从 MI 进行 Bacup-restore。当发现很少的依赖项或不受支持的功能时,backpac 提取失败。这是因为 SSMS 会验证您的提取。尝试使用 SSDT (Visual STudio),您可以跳过验证提取(默认情况下未选中):

    1. 打开 SQL Server 对象资源管理器

    在此处输入图像描述

    1. 连接到您的 MI。右键单击数据库并单击:提取数据层应用程序。

    选择提取架构和数据。

    这将成功。

    在此处输入图像描述

    在此处输入图像描述

    1. 使用上面创建的 dacpac 文件来部署数据库。右键单击数据库 --> 部署数据层应用程序。

    数据和架构:

    在此处输入图像描述

    • 2
  3. Saeb Amini
    2020-12-09T17:40:54+08:002020-12-09T17:40:54+08:00

    有趣的是,该Extract操作还带有一个ExtractAllTableData允许您包含数据的参数。

    只需添加/p:ExtractAllTableData=True到命令中。

    • 0

相关问题

  • 还原过程后的数据库仍然显示正在还原

  • 恢复 SQL 差异数据库文件时出错

  • 是否可以使用 PostgreSQL 快速创建/恢复数据库快照?

  • Postgresql - 使用 recovery.conf 恢复

  • 如何使用旧的完整备份和当前日志文件恢复数据库

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve