我将三个数据库迁移到 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 相同的错误消息。
我还检查了这个数据库管理员问题。没有帮助 - 这是我最初尝试的。如果有人有任何其他想法,我将不胜感激!
我已经能够成功地将数据从 Azure 托管实例 (MI) 导出到 SQL Server 2012 系统,而无需 Visual Studio。
使用 SQL Server Management Studio (SSMS) 右键单击要复制的数据库,选择
Tasks > Export Data-tier Application
. 选择保存创建的 .bacpac 文件的位置。如果您有 7zip 解压缩 bacpac 文件以查看内容。如果不这样做,您可以将文件扩展名从 .bacpac 重命名为 .zip 并使用文件资源管理器解压缩(右键单击 > 全部提取...)
在您喜欢的文本编辑器中打开 model.xml 文件并查找名为
CompatibilityMode
. 这将被设置为 MI 的兼容级别(当前为 150)。将其更改为您要导入的兼容性级别。我正在导入 SQL 2012,因此将其更改为 110。通过注释掉 model.xml 中的相关行来删除任何其他不兼容的功能。
将 设置
Value
为 false 也可能有效。你应该得到这样的输出:
从提取的 bacpac 文件中打开 Origin.xml 文件,并在末尾查找类似这样的一行,并将现有的哈希值替换为新的:
确保不添加任何空格或无关字符。
现在压缩文件备份,确保存档的顶层是文件,而不是您提取所有内容的文件夹。如果您打开新文件,您应该会看到 xml 文件,而不是单个文件夹名称。
您现在应该能够将 bacpac 导入您的非 Azure SQL 数据库。
关于 bacpac 备份的一些注意事项:
它们可能在事务上不一致。要使导出在事务上保持一致,您必须确保在导出期间没有发生任何写入活动,或者您正在从 Azure SQL 数据库的事务一致副本中导出。
如果要导出到 Blob 存储,则 BACPAC 文件的最大大小为 200 GB。要存档较大的 BACPAC 文件,请导出到本地存储。
不支持从 MI 进行 Bacup-restore。当发现很少的依赖项或不受支持的功能时,backpac 提取失败。这是因为 SSMS 会验证您的提取。尝试使用 SSDT (Visual STudio),您可以跳过验证提取(默认情况下未选中):
选择提取架构和数据。
这将成功。
数据和架构:
有趣的是,该
Extract
操作还带有一个ExtractAllTableData
允许您包含数据的参数。只需添加
/p:ExtractAllTableData=True
到命令中。