【问题标题】:Unable to restore bacpac due to foreign key conflict由于外键冲突,无法恢复 bacpac
【发布时间】:2013-07-10 15:59:32
【问题描述】:

我正在尝试将 SQL Azure 数据库的备份 (.bacpac) 还原到另一个 SQL Azure 数据库,但由于以下错误而无法执行此操作:

服务操作过程中遇到错误。无法导入 包裹。错误 SQL72014:.Net SqlClient 数据提供程序:消息 547,级别 16,状态 0,第 3 行 ALTER TABLE 语句与 FOREIGN KEY 约束“FK_x_xx”。数据库发生冲突 “x”,表“dbo.x”。错误 SQL72045:脚本执行错误。这 执行脚本:PRINT N'检查约束:FK_x_xx[dbo].[x]';改变 TABLE [dbo].[x] WITH CHECK CHECK CONSTRAINT [FK_x_xx];

我还尝试在本地恢复但没有成功,但出现 mscorlib 异常(我将再次尝试,并很快更新确切的错误消息。

我检查了实时数据库,但看不出为什么会违反此密钥。

我还尝试修改 .bacpac 中包含的 model.xml 以删除约束,但这失败了,因为它现在(正确地)未通过校验和验证。

【问题讨论】:

  • 我也有一些奇怪的行为。就在上周,由于缺少聚集索引,我无法 bacpac 一个 SQL Azure 数据库。这在 SQL Azure 中甚至不应该是可能的。
  • 我认为这是 SQL 数据工具的缺陷。无论我是否在导出前创建副本,我每天都会导出/导入我的数据库十几次。相同的.bacpac 可能会成功导入几次,但会失败两次,这完全是随机的。

标签: sql azure azure-sql-database bacpac


【解决方案1】:

bacpac 文件不是事务性文件,因此在生成 bacpac 时写入目标数据库的新行最终会损坏索引。数据库要么必须没有其他用户连接进行写入,要么您可以复制数据库并从副本中制作 bacpac。

1) 复制目标数据库,直接返回,但是复制数据库需要一些时间。此操作将创建一个完整的事务副本:

CREATE DATABASE <name> AS COPY OF <original_name>

2) 查找复制操作的状态:

SELECT * FROM sys.dm_database_copies

3) 在复制的数据库上生成一个没有被任何人使用的 bacpac 文件。

4) 删除复制的数据库,您将拥有一个工作的 bacpac 文件。

【讨论】:

  • 有一阵子没看过这个,但这很有意义。谢谢。
  • 好吧,让您在生产时“导出”副本是毫无意义的。
  • 我使用了copy 选项形式的Azure 门户,当我在查询editor 中运行SELECT * FROM sys.dm_database_copies 时,我得到Failed to execute query. Error: Invalid object name 'sys.dm_database_copies'.
  • 自回答以来,Azures的副本门户基本上都是这样做的,你可以在他们的门户中看到副本的进度。我认为您需要 Azure 中特定类型的 SQL 实例才能有权直接查询 sys。如果您可以复制并在门户中查看进度,则不需要运行命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2013-01-13
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多