如何导入事务不一致的 bacpac

How to import a transactionally-inconsistent bacpac

well-known 在 SQL Azure 上创建 bacpac 并不能保证导出实时变化的数据库时的事务一致性。

可接受的解决方法是先创建数据库的快照,方法是复制它,然后进行导出。

这种做法很可笑,因为它迫使用户为关系数据库存储额外花钱。事实上,在 SQL Azure 的旧时代,数据库是按天计费的,因此从生产数据库创建每日 bacpacs 基本上用于使成本翻倍(如果我没记错的话,现在按小时计费) .

不过,我的问题不是这个。我的问题如下 - 如果我可以接受交易不一致的 bacpac,是否有任何实际恢复(即导入)的方法?问题很简单——因为不再满足某些约束,导入失败(例如,出现 FK 异常)。虽然 bacpac 恢复只不过是从模式重新创建数据库,然后进行批量导入,但整个过程是完全不透明的,用户没有太多控制权。然而,由于 Azure SQL 工具总是在不断变化,如果这成为可能,我不会感到惊讶。

所以,回顾一下,问题:给定一个可能不一致的 bacpac(即某些约束不成立),有没有办法(无需编写大量代码)将其导入到 on -前提数据库?

尝试使用 BCP.exe 导入数据。

  1. bacpac 是一个 zip 文件。您可以通过更改其文件来打开 bacpac .zip 的扩展名。所有数据都以 .bcp 文件格式捕获 “数据”文件夹。
  2. 将数据文件夹从 zip 文件中移出并保存以供下面的第 4 步使用。
  3. 将 .zip 扩展名改回 .bacpac 并 导入它。它只创建一个带有模式的数据库。
  4. 使用 bcp.exe,将 .bcp 文件导入数据库中的 table。 https://msdn.microsoft.com/en-us/library/ms162802.aspx
  5. 解决数据不一致问题。

如果您已经知道哪个 table 包含不一致的数据,您可以只为 table 移出 bcp 文件并使用 bcp 导入它们。