sql-server - SQL Azure 导出/Bacpacs 和外键完整性

标签 sql-server database azure azure-sql-database bacpac

我昨晚使用 SQL Azure 导入/导出服务获取的 BACPAC 遇到了一些奇怪的问题。

在我们的数据库中有 2 个相关表。

dbo.Documents --All Documents in the database
  Id
  DocName
  Extension

dbo.ProcessDocuments --Doc's specific to a process
  Id
  DocumentId (FK -> dbo.Documents.Id with Check Constraint)
  ProcessId

根据该架构,ProcessDocuments 表不可能包含主 Documents 表中没有伴随条目的行。

但是,当我在另一个环境中恢复数据库后,我最终得到了

ProcessDocuments 中有 7001 个条目。 Documents 中只有 7000 个等效条目(缺少 1 个)。尝试恢复 ProcessDocuments

上的 ALTER TABLE CHECK CONSTRAINT 时恢复失败

我唯一能想象的是,当进行备份时,它会按顺序(按字母顺序???)遍历表,并一次备份数据1表,然后发生了类似以下的事情。

  • 文档 得到备份。包含 7000 个条目
  • 有人向系统添加了新的流程文档/插入到文档流程文档
  • ProcessDocuments 已备份。包含 7001 个条目

如果是这种情况,那么在使用 BACPAC 作为有效的灾难恢复 Assets 时会产生一个巨大的问题,因为如果在系统有数据移动时使用它们,则您的 BACPAC 可能包含数据完整性问题。

是这样的吗?或者谁能解释一下还有什么可能导致这种情况?

最佳答案

数据导出使用数据库上的批量操作,并且不保证是事务性的,因此您所描述的问题可能并且最终会发生。

“导出操作对数据库中每个表的数据执行单独的大容量复制,因此不能保证数据的事务一致性。您可以使用 Windows Azure SQL 数据库复制数据库功能来制作数据的一致副本。数据库,并从副本执行导出。” http://msdn.microsoft.com/en-us/library/windowsazure/hh335292.aspx

<小时/>

如果您想创建事务一致的备份,您必须首先复制数据库(这可能会花费您很多,具体取决于数据库的大小),然后将复制的数据库导出为 BACPAC(正如 ramiramilu 指出的那样)http://msdn.microsoft.com/en-us/library/windowsazure/jj650016.aspx

您可以自己做或使用RedGate SQL Azure Backup但据我了解,他们遵循与上述完全相同的步骤,因此,如果您选择他们一致的备份选项,您也会付出代价。

关于sql-server - SQL Azure 导出/Bacpacs 和外键完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162857/

相关文章:

sql-server - 在 SQL Server 2005 中连接 ntext

c# - NPOCO Fetch - 对象必须实现 IConvertible

java - GWT 中的 hibernate 错误

php - 通过 "CRUD"SQL PHP 创建管理数据库的网页

azure - Azure 应用服务插槽上是否可以自定义错误页面?

SQL:根据 GETDATE() 进行列验证

sql - 使用 IF..ELSE IF 控制 T-SQL SP 中的流程 - 还有其他方法吗?

java - Android读取大文件

azure - 将 SharePoint 常见问题解答加载到 Azure QnA 生成器中

c# - Azure 网络发布