【问题标题】:Import Data-Tier Application vs sqlpackage.exe导入数据层应用程序与 sqlpackage.exe
【发布时间】:2022-06-14 15:42:14
【问题描述】:

我们现在在尝试使用sqlpackage 实用程序恢复.BACPAC 文件时遇到自动化过程错误,但在使用“导入数据层应用程序”向导通过 SSMS 导入同一文件时成功。

我们得到的错误如下:

错误 SQL72014:.Net SqlClient 数据提供者:

消息 547,第 16 级,状态 0,第 3 行
ALTER TABLE 语句与 FOREIGN KEY 约束“FK_xx_xx”冲突。冲突发生在数据库“TEMP_xxx_5182022”、表“dbo.xxx”、列“xxx”中。

自动化过程从 Azure SQL 托管实例上运行的数据库副本导出 .BACPAC 文件。然后使用sqlpackage.exe /a:Import.BACPAC 文件导入SQL Server 2017。

做一些进一步的研究,听起来这个过程不会 100% 成功,因为导出的文件不能保证事务一致性。正确的方法是生成数据库的 COPY ONLY 并导出,这需要我们在该服务器上进行一些 TDE 加密。

当使用 SSMS 通过导入数据层向导导入 .BACPAC 时,我们没有遇到该错误。

向导是否使用sqlpackage.exe 实用程序或其他工具?

是否有任何缺失的参数可以传递给 /Import 或 /Export 以允许成功导入? (即/p:DisableIndexesForDataPhase

除了使用 COPY ONLY 方法,我们还有其他选择吗?

【问题讨论】:

  • 您导出为 bacpac 的数据库大小是多少?通过自动化流程导入时,您是否事先创建了目标数据库?
  • 数据库大小约为 85GB (mdf)。导出的 .bacpac 大约为 1.5GB。数据库不是事先创建的
  • 。我认为这就是问题所在。你可以试一试吗?事先创建一个数据库,然后使用 sqlpackage exe 导入 bacpac。如果没有预先创建目标数据库,SQLPACKAGE.exe 会在运行时为您创建一个数据库,但它最多可以容纳 32 GB 的数据。
  • 感谢您的建议。我已更新 SQL Server 代理作业以包含在运行导入步骤之前创建数据库的任务。我会密切关注它,并在几周内提供更新。
  • @PankajSanwal 自从我们添加了创建 DB 步骤以来,这项工作每天晚上都在成功,所以我正在考虑解决这个问题!请随时添加您的评论作为回复,以便我将其标记为答案并给予您信任。

标签: sql-server import sqlpackage bacpac azure-sql-server-managed-instance


【解决方案1】:

这里的问题是正在恢复的数据库的大小。

当使用 SQLPackage.exe 时,您必须有 2 个选项来指定目标数据库

  1. 未事先创建目标数据库。在这种情况下,将在运行时为您创建目标数据库,但它的上限 LIMIT OF 32 GB。如果从中创建 BACPAC 的源数据库(不是 BACPAC 文件大小)大于 32 GB,则还原将失败或提前退出。
  2. 其他更好的方法是预先创建一个空数据库并将其指定为目标数据库。这将绕过限制问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多